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.

Benutzer-Avatar
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:

git checkout master
git merge my_branch
git commit --amend --author="My Nick <[email protected]>"
git push origin master

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

1094790cookie-checkWie man Zweige zusammenführt und die Urheberschaft behält

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy