Remote-Zweige in Git wiederherstellen

135

Ich verwende ein Git-Zwischenrepository, um ein entferntes SVN-Repository zu spiegeln, von dem aus Leute klonen und daran arbeiten können. Im Zwischen-Repository wird der Hauptzweig jede Nacht vom Upstream-SVN neu basiert, und wir arbeiten an Feature-Zweigen. Beispielsweise:

remote:
  master

local:
  master
  feature

Ich kann meinen Feature-Zweig erfolgreich auf die Fernbedienung zurückschieben und am Ende das erreichen, was ich erwarte:

remote:
  master
  feature

local:
  master
  feature

Ich richte dann den Zweig neu ein, um die Fernbedienung zu verfolgen:

remote:
  master
  feature

local:
  master
  feature -> origin/feature

Und alles ist gut. Was ich von hier aus tun möchte, ist, den Feature-Zweig auf den Master-Zweig auf der Fernbedienung umzustellen, aber ich möchte dies von meinem lokalen Computer aus tun. Ich möchte in der Lage sein:

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

Um den Zweig der Remote-Funktion mit dem Remote-Master auf dem neuesten Stand zu halten. Diese Methode führt jedoch dazu, dass Git sich beschwert:

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

git pullmacht den Trick, verursacht aber ein Merge-Commit, das ich vermeiden möchte. Ich bin besorgt, dass die Nachricht feature -> featureeher besagt als, feature -> origin/featureaber dies kann nur eine Präsentationssache sein.

Vermisse ich etwas oder gehe ich völlig falsch vor? Es ist nicht wichtig, die Neuausrichtung auf dem Remote-Server zu vermeiden, aber es macht die Behebung von Zusammenführungskonflikten aus der Neueinrichtung viel schwieriger.

kfb
quelle
Ich hatte das gleiche Problem. Ich wollte ein Branch Rebase-Modell ( wie dieses ) starten . Dann habe ich festgestellt, dass ich einen Fehler gemacht habe: Wenn Sie eine Neustart durchführen möchten (Sie sollten Ihre Änderungen nicht an der Remote-Funktion übertragen, bevor Sie die Neubasis auf den Master übertragen). Sie schreiben also einen Code für Ihre Funktion fest. Und jetzt möchten Sie es auf Ihre Remote-Funktion übertragen. Bevor Sie dies tun: - Sie sollten Ihren Meister holen und ziehen, wenn Sie müssen. -Sie sollten auf den Master zurückgreifen, wenn einige Änderungen am Master vorgenommen wurden, die Sie nicht in Ihrer Funktion haben. Jetzt können Sie die Funktion pushen und es wird kein Problem geben.
Markus

Antworten:

185

Es kommt darauf an, ob die Funktion von einer Person verwendet wird oder ob andere daran arbeiten.

Sie können den Push nach dem Rebase erzwingen, wenn es nur Sie sind:

git push origin feature -f

Wenn jedoch andere daran arbeiten, sollten Sie den Master zusammenführen und nicht neu starten.

git merge master
git push origin feature

Dadurch wird sichergestellt, dass Sie eine gemeinsame Geschichte mit den Personen haben, mit denen Sie zusammenarbeiten.

Auf einer anderen Ebene sollten Sie keine Back-Merges durchführen. Was Sie tun, ist, den Verlauf Ihres Feature-Zweigs mit anderen Commits zu verschmutzen, die nicht zum Feature gehören, was die spätere Arbeit mit diesem Zweig schwieriger macht - Neubasieren oder nicht.

Dies ist mein Artikel zum Thema " Branch per Feature" .

Hoffe das hilft.

Adam Dymitruk
quelle
29
+1 für if others are working on it, you should merge and not rebase off of master, Rebase besser nur in privaten Filialen verwendet werden.
Hendra Uzia
6
alternativ zur Git-Push-Origin-Funktion - Wenn Sie auch Ihre Remote-Funktion löschen und die Push-Funktion erneut ausführen könnten
Markus
2
Durch das Zusammenführen des Masters in Ihrem Zweig wird ein Zusammenführungs-Commit erstellt und es kommt zu Konflikten mit anderen offenen Feature-Zweigen des Masters, nachdem Ihre Änderungen übernommen wurden.
Steven
+1 für git push origin feature -f. In bestimmten Kontexten kann es erforderlich sein, auch bei Remote-Verzweigungen eine Rebase durchzuführen. Der springende Punkt ist zu wissen, was Sie tun. Und wir sollten übernehmen, dass Sie möglicherweise Commits in Remote Repo löschen.
Enagra
33

Schön, dass Sie dieses Thema angesprochen haben.

Dies ist eine wichtige Sache / ein wichtiges Konzept in Git, von dem viele Git-Benutzer profitieren würden. git rebase ist ein sehr leistungsfähiges Tool, mit dem Sie Commits zusammenfassen, Commits entfernen usw. Aber wie bei jedem leistungsstarken Tool müssen Sie im Grunde wissen, was Sie tun, da sonst möglicherweise etwas schief geht.

Wenn Sie lokal arbeiten und mit Ihren lokalen Niederlassungen herumspielen, können Sie tun, was Sie möchten, solange Sie die Änderungen nicht in das zentrale Repository übertragen haben. Dies bedeutet, dass Sie Ihre eigene Geschichte neu schreiben können, aber nicht die anderer. Wenn Sie nur mit Ihren lokalen Dingen herumspielen, hat nichts Auswirkungen auf andere Repositorys.

Aus diesem Grund ist es wichtig, sich daran zu erinnern, dass Sie Commits, sobald Sie sie gepusht haben, später nicht erneut starten sollten. Der Grund, warum dies wichtig ist, besteht darin, dass andere Personen möglicherweise Ihre Commits einbringen und ihre Arbeit auf Ihre Beiträge zur Codebasis stützen. Wenn Sie sich später dazu entschließen, diesen Inhalt von einem Ort an einen anderen zu verschieben (neu zu gründen) und diese zu pushen Änderungen, dann bekommen andere Leute Probleme und müssen ihren Code neu gründen. Stellen Sie sich jetzt vor, Sie haben 1000 Entwickler :) Es verursacht nur eine Menge unnötiger Nacharbeiten.

ralphtheninja
quelle
Für die schlechte Sprache abgelehnt
Powers
1
Meine Sprache wurde aktualisiert.
Ralphtheninja
5

Da Sie featureauf dem neuen Basis neu aufgebaut haben master, ist Ihr Lokal featurekein schneller Vorlauf origin/featuremehr. Ich denke, in diesem Fall ist es vollkommen in Ordnung, die Schnellvorlaufprüfung zu überschreiben, indem Sie dies tun git push origin +feature. Sie können dies auch in Ihrer Konfiguration angeben

git config remote.origin.push +refs/heads/feature:refs/heads/feature

Wenn andere Personen darüber arbeiten origin/feature, werden sie durch dieses erzwungene Update gestört. Sie können dies vermeiden, indem Sie das Neue masterin featureeinfügen, anstatt es neu zu gründen. Das Ergebnis wird in der Tat ein schneller Vorlauf sein.

Tilman Vogel
quelle
1

Sie können die Prüfung deaktivieren (wenn Sie wirklich sicher sind, dass Sie wissen, was Sie tun), indem Sie die --forceOption auf verwenden git push.

Andrew Aylett
quelle
15
Das Problem ist, ich bin nicht sicher, ob ich wirklich weiß, was ich tue :)
kfb
@r_: Bitte lies meine Antwort. Es könnte Ihnen helfen, zu verstehen, was Sie tun :)
ralphtheninja