Wie man Zweige zusammenführt und die Urheberschaft behält
Lesezeit: 4 Minuten
Nehmen wir an, mein Kollege John hat einen Zweig namens “john” erstellt. Es hat 10 Commits von John. Wenn es darum geht, zurück zum Master zu fusionieren, bitten sie mich, das Mergen durchzuführen.
Das ist was ich mache
git checkout -b john origin/john
git rebase master
git checkout master
git merge john --squashed
git add .
git commit -m 'merged branch john'
Was jetzt jedoch passiert, ist, dass es meine ID gegen das zusammengeführte Commit ist. Und später fragen mich Leute, warum ich bestimmte Teile des Codes geändert habe.
Wie komprimiere ich alle Comitts im John-Zweig zu einem Commit, sodass John der Autor ist? Ich denke, git commit interactive kann helfen, konnte es aber nicht ganz verstehen.
Josef Spiros
Das Problem hier ist das git merge --squash wendet die gleichen Änderungen wie bei einer normalen Zusammenführung an, behält jedoch die Zusammenführungsinformationen nicht bei. Wenn Sie dann ein Commit durchführen, ist es dasselbe wie bei jedem Commit, das Sie vornehmen: Es wird Ihnen zugeschrieben. Sie können die Autoreninformationen des Commits mit ändern git commit --author="Original Author <email@server>". Sehen git-commit(1) für weitere Informationen über die --author Schalter.
Aber die Frage, die ich habe, ist: Warum zerquetschen Sie die Zusammenführung? Warum nicht einfach eine nicht gequetschte Zusammenführung durchführen? Wenn jemand a git blamewird es dem Commit vom ursprünglichen Autor angemessen zugeordnet.
so dass ich leicht zurücksetzen könnte, da es nach dem Squashed ein einziges Commit ist, das zurückgesetzt werden muss. Wenn ich nicht squash, dann sind es 10 Comitts zum Rollback, es sei denn, es gibt einen besseren Weg.
– Nick Vanderbilt
22. Juli 2010 um 11:59 Uhr
Wie in der Antwort von mfontani erwähnt, wird beim Zusammenführen von –no-ff ein Merge-Commit aufgezeichnet, und wenn Sie diesen einen Commit zurücksetzen, hat dies denselben Effekt wie das Zurücksetzen eines gequetschten Commit, jedoch mit dem zusätzlichen Vorteil von Aufzeichnung der vollständigen Commit-Historie.
– Josef Spiros
22. Juli 2010 um 20:26 Uhr
Ein Grund für einen Squash-Merge ist, dass Leute manchmal eine Reihe von defekten Zuständen in ihren Zweig schreiben, was Bisect schwieriger macht, aber der letzte Zweig ist in Ordnung, und manchmal hat der Zweig sowieso nur einen Autor.
– Fremdenmord
9. November 2016 um 16:53 Uhr
Du kannst auch --amend die Urheberschaft nachträglich, wenn Sie die Zusammenführung bereits vorgenommen haben. so wie das:
Dies funktioniert wie gewünscht und fügt den angegebenen Autor zum Merge-Commit hinzu. So einfach ist das.
Wenn Sie Folgendes tun:
git checkout -b john origin/john
git rebase master
git checkout master
git merge --no-ff john # forces a merge commit to be recorded
Sie können beide die Urheberschaft von Johns Commits behalten und Sie können die Zusammenführung rückgängig machen, indem Sie den SHA des Zusammenführungscommits zurücksetzen.
Wirklich? Das ist wunderbar. Ich denke, ich sollte selbst einige Tests durchführen, wenn ich mit git merge –no-ff john übergebe, dann werde ich 10 Commits in meinem Master-Log von john sehen oder werde ich einen Commit sehen, wie ich es im Falle eines Squashed sehen würde. Ich habe nichts gegen 10 Comitts im Log. Meine einzige Sorge war, dass ich in der Lage sein sollte, leicht zurückzukehren.
– Nick Vanderbilt
22. Juli 2010 um 14:12 Uhr
Sie sehen alle Commits, die Sie rebasiert haben, aber Sie können die Zusammenführung rückgängig machen, indem Sie einfach den Merge-Commit rückgängig machen. Außerdem behalten Sie den Überblick, welche Commits zu welchem Zweig gehörten 🙂
– mfontani
22. Juli 2010 um 21:01 Uhr
Ich freue mich darauf zu hören, ob das oben Genannte für Sie funktioniert hat, und beantwortet daher Ihre ursprüngliche Frage.
– mfontani
27. Juli 2010 um 10:06 Uhr
Ich habe das benutzt. Obwohl die gesamte Geschichte erhalten bleibt, musste ich den Autor separat auf den ursprünglichen Autor zurücksetzen: git commit --amend [email protected] --signoff
– Arnab
11. Oktober 2012 um 5:57 Uhr
Die Art und Weise, wie ich dies gerade getan habe, ist durch Squashing über Rebase:
git rebase --onto master -i master remote/branch
Markieren Sie dann im Editor alle Commits mit „Squash“. Dies ergibt eine einzige mit dem ursprünglichen Autor angehängt. Obwohl Sie wirklich nichts gewinnen, wenn Sie den ursprünglichen Autor in –author kopieren. Ich fühlte mich einfach unwohl dabei.
Aus irgendeinem Grund wurde mein HEAD danach abgenommen, also habe ich den Master wieder daran angeschlossen über:
git checkout -B master HEAD
10947900cookie-checkWie man Zweige zusammenführt und die Urheberschaft behältyes