2013-02-14 11 views
7

Also sagen wir, ich habe einen Hauptzweig, wir nennen 'Master'. Ich habe einen Zweig gemacht, der "neues Feature" genannt wird. Ich habe eine Menge Commits in diesem Zweig gemacht, so dass ich in der Zeit zurückgehen kann, aber ich habe ziemlich viel hin und her während der Entwicklung des Features gemacht, so dass das Commit-Protokoll ziemlich unordentlich ist.Git Zweig diff in ein neues Commit

Wenn ich zum Beispiel git diff Master .. neue Funktion betrachten würde.

Wenn ich nur einen neuen frischen Commit auf "Master" erstellen möchte, der alle Änderungen zwischen den beiden Zweigen enthält, was ist der effizienteste Weg, dies zu tun?

Antwort

17
git checkout master 
git merge --squash new-feature 
git commit 

Die Nachricht beginnen begehen wird die gesamte Liste der Commits zeigt zusammenzuführenden/zerquetschte, aber man kann das natürlich bearbeiten sein, was auch immer Sie wollen.

+0

Köstlich einfach :) – hhh

1

Sie können interaktive Rebase dafür verwenden: git rebase --interactive. Dann benutze einfach die Squash-Option. Es verwendet nur die Aktualisierungen von der Festschreibung, aber erstellt die Festschreibung nicht.

+0

, die wie eine Tonne Suche scheint für Squash Ersatz holen oder fehle ich etwas? – hhh

0

Sie könnten alles in Ihrem Feature-Zweig festschreiben und dann in den Master einbinden, der 'ihres' für alle Änderungen akzeptiert.

Hier ist ein Stack-Überlauf Frage mit einer großen Antwort auf wie das tun: Is there a "theirs" version of "git merge -s ours"?

+0

Hmm, führt das dazu, dass nur ein Commit den Feature-Zweig darstellt? – hhh

+0

Es wäre, wenn Sie zuerst im Feature-Zweig (wie William sagt oben), obwohl das vielleicht nicht ratsam ist. Eines der großen Dinge bei der Quellcodeverwaltung ist die Geschichte, wie Sie dahin gekommen sind, wo Sie sind. Ich nehme an, das ist eine Frage der Vorliebe! Mehr zur interaktiven Rebase [hier] (http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html). –

+0

Ja, ich hätte gerne auch die Geschichten, aber andere Leute :) – hhh

1

git rebase --interactive HEAD ~ (aber viele Commits quetschen zu wollen). zB git rebase - interactive HEAD ~ 5. Dadurch werden die letzten 5 Commits geladen und ein Editorfenster mit den Nachrichten geöffnet. Jede Nachricht wird am Anfang "auswählen". Gehe zur letzten Nachricht, ändere 'pick' in 'squash' und beende. Ein neues Fenster öffnet sich und fragt nach einer Commit-Nachricht. Dies wird die neue Commit-Nachricht der Squash-Commits sein. Beenden und es wird alle Commits in ein neues zerquetschen.

Es gibt hier ein Beispiel: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

Scheint so, dass das einige Probleme verursachen könnte, da ich in einem Team bin und regelmäßig Änderungen von anderen Teammitgliedern einholen muss. Das und ich würde lieber nicht zählen :) – hhh

+0

Wenn Sie an einem Zweig mit neuen Funktionen arbeiten, habe ich die Annahme gemacht, dass Sie selbst an diesem Zweig arbeiten. Wenn Sie nicht sind, könnten Sie/andere Leute, mit denen Sie arbeiten, wahrscheinlich eigene Niederlassungen haben.Die Verwendung von Rebase ist in der Regel eine schlechte Idee, wenn andere Leute bereits Ihren Code gezogen haben, da dies Probleme verursachen kann, da Sie den Verlauf neu schreiben –

+0

Also die ~ 5 würden keine Commits vom Master zählen, die ich gezogen habe in, solange ich der Einzige bin, der in der Branche arbeitet? Bedeutet die '5' die letzten fünf, die für diesen Zweig einzigartig sind, oder die letzten fünf Commits insgesamt? – hhh

2

Eine andere Option, die für Sie besser funktionieren könnte, wäre, eine Patch-Datei mit git diff --patch > "patch filename" zu generieren und sie dann in Ihren Master-Zweig unter Verwendung von git apply "patch file name" zu patchen.

Man Seite für git-diff (vor allem "Generieren Patches mit -p"): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

Man Seite für git-Anwendung: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

Git bewerben ... interessant :) Gut zu wissen! – hhh