webentwicklung-frage-antwort-db.com.de

Neustarten von Remote-Zweigen in Git

Ich verwende ein Git-Zwischenrepository, um ein entferntes SVN-Repository zu spiegeln, von dem aus Leute klonen und daran arbeiten können. Das Intermediate-Repository hat seinen Master-Zweig, der jede Nacht vom vorgelagerten SVN neu basiert, und wir arbeiten an Feature-Zweigen. Beispielsweise:

remote:
  master

local:
  master
  feature

Ich kann meinen Funktionszweig erfolgreich auf die Fernbedienung zurückschieben und erhalte das, 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 zurückzusetzen, aber ich möchte dies von meinem lokalen Computer aus tun. Ich würde gerne in der Lage sein:

git checkout master
git pull
git checkout feature
git rebase master
git Push Origin feature

Damit der Zweig der Remote-Funktionen mit dem Remote-Master auf dem neuesten Stand ist. 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 pull macht den Trick, verursacht aber ein Merge-Commit, das ich vermeiden möchte. Ich mache mir Sorgen, dass in der Nachricht feature -> feature eher, als feature -> Origin/feature aber dies kann nur eine Präsentationssache sein.

Vermisse ich etwas oder gehe ich das falsch an? Es ist nicht kritisch, die Wiederherstellung auf dem Remote-Server zu vermeiden, aber es erschwert das Beheben von Zusammenführungskonflikten aus der Wiederherstellung erheblich.

125
kfb

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

Auf diese Weise wird sichergestellt, dass Sie eine gemeinsame Vergangenheit mit den Personen haben, mit denen Sie zusammenarbeiten.

Auf einer anderen Ebene sollten Sie keine Back-Merges durchführen. Sie verschmutzen damit den Verlauf Ihres Feature-Zweigs mit anderen Commits, die nicht zum Feature gehören, und erschweren so die spätere Arbeit mit diesem Zweig - ob neu basiert oder nicht.

Dies ist mein Artikel zum Thema Branch per Feature .

Hoffe das hilft.

172
Adam Dymitruk

Schön, dass Sie dieses Thema angesprochen haben.

Dies ist eine wichtige Sache/ein wichtiges Konzept in Git, von dessen Kenntnis viele Git-Benutzer profitieren würden. Git Rebase ist ein sehr leistungsfähiges Tool, mit dem Sie Commits zusammenpressen, Commits entfernen usw. Aber wie bei jedem leistungsfähigen Tool müssen Sie im Grunde wissen, was Sie tun, oder etwas könnte wirklich schief gehen.

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 umschreiben können, aber nicht die anderer. Wenn Sie nur mit Ihren lokalen Daten herumspielen, hat dies keine Auswirkungen auf andere Repositorys.

Aus diesem Grund ist es wichtig, sich daran zu erinnern, dass Sie Commits, die Sie einmal übertragen haben, später nicht erneut verwenden sollten. Der Grund, warum dies wichtig ist, besteht darin, dass andere Personen Ihre Commits einbinden und ihre Arbeit auf Ihre Beiträge zur Codebasis stützen können. Wenn Sie sich später dazu entschließen, diese Inhalte von einem Ort an einen anderen zu verschieben (umzustrukturieren) und diese zu pushen Änderungen, dann werden andere Leute Probleme bekommen und müssen ihren Code neu erstellen. Stellen Sie sich vor, Sie haben 1000 Entwickler :) Es verursacht nur eine Menge unnötiger Nacharbeit.

30
ralphtheninja

Da Sie feature auf das neue master umbasiert haben, ist Ihr lokales feature kein schneller Vorlauf von Origin/feature Mehr. Ich denke, es ist in diesem Fall vollkommen in Ordnung, die Schnellvorlaufprüfung mit git Push Origin +feature Zu überschreiben. Sie können dies auch in Ihrer Konfiguration angeben

git config remote.Origin.Push +refs/heads/feature:refs/heads/feature

Wenn andere Personen zusätzlich zu Origin/feature Arbeiten, werden sie durch dieses erzwungene Update gestört. Sie können dies vermeiden, indem Sie das neue master in feature zusammenführen, anstatt es neu zu definieren. Das Ergebnis wird in der Tat ein schneller Vorlauf sein.

5
Tilman Vogel

Sie können die Prüfung deaktivieren (wenn Sie wirklich sicher sind, dass Sie wissen, was Sie tun), indem Sie --force Option zu git Push.

1
Andrew Aylett