2012-07-30 10 views
13

Ist es möglich, die Commits auf einem Zweig in einem einzigen Commit vor dem Zusammenführen mit dem Haupt zu kondensieren? Ich dachte, das wäre ein ziemlich häufiges Szenario, aber vielleicht verwende ich nicht die richtigen Suchbegriffe.Flatten Commits auf einem Zweig

Ich werde das Szenario ausführlicher erklären. Oft würde ich viele lokale Commits machen wollen, während ich an einem Wechsel in einer Filiale arbeite, um sicherzustellen, dass ich eine umfassende Historie von Änderungen habe. Aber sobald ich mit den Änderungen in der Branche fertig bin, wenn ich mit main zusammenarbeite, möchte ich die Commits auf dem Zweig auf einen einzigen reduzieren und dann zu main zusammenführen. Ich verstehe, dass Commits in Git billig sind, aber in manchen Situationen mag ich es vielleicht lieber machen.

* merge to main 
|\ 
* | commit 2 on main 
* | commit 1 on main 
| * commit 2 on branch 
| * commit 1 on branch 
|/ 
* branch from main 

zu wie

* merge to main 
|\ 
* | commit 2 on main 
* | commit 1 on main 
| * commit on branch (branch commits flattened to one) 
|/ 
* branch from main 

ich ein Neuling bin aussehen gemacht werden, wenn es um git kommt. Wenn ich mich bei der Verwendung von Begriffen geirrt habe, entschuldige ich mich.

Antwort

12

Verwenden Sie interaktive Rebasing. Finden Sie die commit, wo Ihre Niederlassung von Master abwich (kann git merge-base mit, lassen Sie uns die <diverge> begehen nennen), dann

git rebase -i <diverge> 

und ein Editor wird angezeigt, so dass Sie Geschichte interaktiv neu zu schreiben. Sie werden Commits zerquetschen wollen.

+1

Danke. Nach der Suche nach mehr nach Ihrem Hinweis, fand ich dies auch (http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/) Beitrag, der mit einem durchgeht Beispiel. –

2

Betrachten Sie git rebase. Die -i Option gibt Ihnen die Möglichkeit zu bearbeiten, Squash (was Sie wollen), oder sogar entfernen, commits.

Zum Beispiel die Art, wie ich es in der Regel verwenden, ist als:

git rebase -i origin/master 
.... 
git push 
17

ich lernen würde empfehlen, die interaktive Fütterungsmaterial zu verwenden, aber im Falle scheint es zu kompliziert zu Ihnen, können Sie einfach

git reset --soft <diverging-commit>

rückgängig machen alle verpflichtet sich, die divergierende Punkt, ohne den Index zu ändern, und

git commit -s

ein einziges Commit für alle Änderungen vornehmen.

10

Sie können auch git merge --squash <branch> verwenden, um einen Zweig zu verschmelzen, ohne Commits auszuführen:

$ git checkout master 
$ git merge --squash mybranch 
... 
Squash commit -- not updating HEAD 
Automatic merge went well; stopped before committing as requested 
$ git commit 

Natürlich sollten Sie den Drang widerstehen, dies zu tun, wenn Sie ihm helfen können. Eine Diskussion darüber, warum, finden Sie unter Thou Shalt Not Lie: git rebase, amend, squash, and other lies.

+6

Der Artikel über das Lügen scheint übermäßig mit "Lügen, um dich gut aussehen zu lassen" betroffen. Das ist alles gut und schön, aber wie wäre es mit der Reorganisation von Commits, um die Code-Überprüfung für den Reviewer einfacher zu machen, ein ehrenwertes Ziel. Wie schlimm wäre es in diesem Kontext zu liegen? – guioconnor

Verwandte Themen