如何合并分支并保留作者信息

21

假设我的同事John创建了一个名为“john”的分支。他在其中提交了10次。当要将分支合并回主分支时,他们要求我执行合并操作。

这是我所做的:

git checkout -b john origin/john
git rebase master
git checkout master
git merge john --squashed
git add .
git commit -m 'merged branch john'

现在我的提交记录只显示我自己对合并提交的修改,但之后其他人会问我为什么改变了某些代码部分。

我该如何将John分支中的所有提交压缩成一个提交,并使John成为作者?我猜git commit interactive可以帮助我,但我不太明白。

4个回答

11
问题在于git merge --squash会应用与普通合并相同的更改,但不保留合并信息。然后,当您提交时,它与您进行的任何提交一样:归属于您。您可以使用 git commit --author="Original Author <email@server>" 更改提交的作者信息。有关--author开关的更多信息,请参见git-commit(1)
但我想问的是:为什么要压缩合并?为什么不进行非压缩的合并?如果有人使用git blame,它将适当地归属于原始作者提交的提交。

4
这样我就可以轻松地回滚,因为压缩后只有一个需要回滚的提交。如果我不压缩,则需要回滚10个提交,除非有更好的方法。 - Nick Vanderbilt
3
如mfontani所述,如果你使用--no-ff合并分支,将会记录一个合并提交。如果你回滚该提交,它将具有与回滚压缩提交相同的效果,但还可以记录完整的提交历史记录。 - Joseph Spiros
2
做一个压缩合并的原因之一是,有时人们会向他们的分支提交一堆破碎的状态,这使得二叉搜索更难,但最终分支没问题,有时分支只有一个作者。 - xenoterracide

9

如果你已经执行了合并操作,你也可以在之后使用--amend来修改作者信息,就像这样:

git checkout master
git merge my_branch
git commit --amend --author="My Nick <my.adress@email.com>"
git push origin master

这样做的效果符合要求,将指定的作者添加到合并提交中,就是这么简单。

7
如果您按照以下步骤进行操作:
git checkout -b john origin/john
git rebase master
git checkout master
git merge --no-ff john # forces a merge commit to be recorded

你既可以保留 John 的提交记录,可以通过还原合并提交的 SHA 来还原合并。


真的太棒了。我猜我应该自己进行一些测试,如果我使用git merge --no-ff john进行提交,那么我会从john看到10个提交在我的主记录中,还是只能看到一个提交,就像合并的情况下一样。我不介意日志中有10个提交。我唯一的担心是我应该能够轻松地撤销。 - Nick Vanderbilt
您将看到所有已经变基的提交,但是您可以通过还原合并提交来撤消合并。此外,您可以跟踪哪些提交属于哪个分支 :) - mfontani
我期待着您的回复,以了解上述是否能解决您的问题并回答您最初的疑问。 - mfontani
1
我使用了这个。虽然它保留了所有的历史记录,但我必须单独将作者设置回原始作者:git commit --amend author=original.guy@company.com --signoff - or9ob

6
我刚刚完成这个操作的方式是通过rebase压缩:
 git rebase --onto master -i master remote/branch

然后在编辑器中,将所有提交标记为“合并”。这将生成一个带有原作者附加信息的单一提交。与将原作者复制到--author相比,实际上您不会获得任何优势。我只是感觉这样做有点不舒服。

由于某种原因,我的HEAD分离了,所以我通过以下方式重新将主分支附加到它上面:

 git checkout -B master HEAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接