2016-07-25 11 views
1

Ich habe eine Frage darüber, wie ich meine Änderungen von einem Zweig zu einem anderen zusammenführen. Hier ist der Plan der Dinge:git - Merge eine Reihe von Commits als ein Commit

Es gibt drei Zweige: Master (M), Feature (F) und Entwicklung (D)

D wurde erstellt aus M vor F angelegt wurde, wieder aus M. Idealerweise D sollte aus F mit der Hierarchie erstellt worden sein:

 M 
     | 
     | 
     F 
     | 
     | 
     D 

M wird immer mit Änderungen aus anderen Commits aktualisiert.

Jetzt auf meinem D-Zweig, die Änderungen bestehen aus einer Reihe von Commits, die ich zu F als ein Commit zusammenführen möchte. Wie mache ich das? Dies würde wiederum mit M zusammengeführt werden.

Bitte beachten Sie, dass D und F in M. verschiedenen Commits werden

Dank abgezweigt!

Antwort

7

Jetzt auf meinem D Zweig umfassen die Änderungen einer Reihe von Commits, die ich F fusionieren möchte als ein

git checkout F 
git merge --squash D 
git commit 
+0

Wenn ich ein 'git log' mache, zeigt die Ausgabe die Liste der Commits an, die zusammen gequetscht wurden. Gibt es eine Möglichkeit, dies zu tun, so dass nur die neue Commit-ID mit dem Kommentar "Zusammenführen" angezeigt wird? – Maddy

+1

Ja, benutze 'git commit -m '. Ein leerer 'git commit' verwendet hier den Standard von' merge --squash', der eine verkettete Liste der Verzweigungs-Commits ist. – RJFalconer

+0

Sehr sauber, auch wahrscheinlich der sicherste Weg, es zu tun, da keine Rebase beteiligt ist. –

1

Jetzt auf meinem D-Zweig, die Änderungen bestehen aus einer Reihe von Commits, die ich zu F als ein Commit zusammenführen möchte. Wie mache ich das?

git checkout D 
git rebase -i F  # pick "squash" for every commit 

git checkout F 
git merge D 

Siehe http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html für ein gutes Beispiel (aber es ist wirklich nicht sehr kompliziert, git help rebase sollte genug gut sein). Grundsätzlich editieren Sie die Datei, die Ihnen von git rebase -i zur Verfügung gestellt wird und geben Sie in allen Zeilen "Squash" ein.

Diese wiederum würde zu M später zusammengeführt werden.

git checkout M 
git merge F 
2

Sie suchen den git rebase Befehl. Für den einfachen Fall, tun

git checkout D 
git rebase F 

Alternativ tun

git rebase D F 

Dies wird nicht in einem einzigen begehen zerquetschen. Um das zu tun, wahrscheinlich die am wenigsten fehleranfällige Option zu tun, eine interaktive begehen:

git checkout D 
git rebase -i F 

Dies wird einen Editor mit den Commits in D zeigen, die indexiert werden werden. Es wird wie folgt aussehen:

pick 293a24d Some commit message 
pick a015bbe Some commit message 
pick e19f4fa Some commit message 
pick 40ae959 Some commit message 
pick fba6b72 Some commit message 

# Rebase 419206d..fba6b72 onto de95063 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

Folgen Sie den Anweisungen und alle, aber die erste Zeile ändern mit squash statt pick zu starten. Dadurch haben Sie die Möglichkeit, die Nachrichten nach dem Speichern zusammenzuführen und den Editor zu schließen.

Alternativ können Sie die Passungen zu reword und die restlichen zu fixup ändern. Dies zeigt Ihnen nur die erste Commit-Nachricht. Diese Option ist einfacher, wenn Sie alle alten Commit-Nachrichten vollständig wegwerfen möchten.

Schließlich, wenn Sie sehr abenteuerlich fühlen, können Sie automatisch die Liste verpflichten filtern, den ersten interaktiven Teils des Fütterungsmaterials unter Umgehung:

EDITOR='sed -i -e "2,$s/pick/squash/"' git rebase -i F 

Diese automatisch pick zu squash auf allen Linien ändern wird mit dem Start zweite Zeile durch Filtern der Editor-Datei durch sed anstelle von Ihrem üblichen interaktiven Editor.

+0

Umbasierung ist ein mächtiges Werkzeug begehen, die Sie verlassen können ein seltsamer Zustand, wenn Sie nicht vorsichtig sind. Wenn Sie mit dem Befehl noch nicht vertraut sind, sollten Sie Ihr Repo sichern, bevor Sie fortfahren. –

+0

-1; Das macht nicht, was OP verlangt. Ja, er erwähnt, dass D eher von F als von M abgezweigt werden sollte, aber das ist nicht seine Frage; Er möchte Commits in ein Commit zerquetschen, was nicht eine einfache Rebase ist. – RJFalconer

+0

@JoeChrysler Ich denke, das ist ein schlechter Rat. Repos sollten unabhängig von der Versionskontrolle gesichert werden. Kommentare wie diese erschrecken die Leute davor, 'git' zu benutzen. Wie kann der Fragesteller sein Repo in einer Weise durcheinander bringen, die 'git rebase --abort' oder' git checkout'/'git reset' nicht beheben konnte? – RJFalconer