目前,当我使用GIT时,我会为每个作业创建一个分支,并在完成之前进行各种提交。然后我与我的主分支合并并向上游推送。我可能在任何时候都有几个分支机构,并且在工作中间随着事情的发生而轻弹。
但是大多数这些提交只是保存点,即在宏观方案中并不重要。因此,当我合并分支时,如果分支日志没有与主日志合并,我会喜欢它。
有没有办法合并下面提交g的日志消息(而不是提交c或e)?
a [master]
|
b (create branch 'job')
|\
| \
| c
| |
d e
| |
f g (next step is to merge 'job' branch with 'master')
答案 0 :(得分:57)
当我使用“每个功能分支”方法时,我认为merge --squash非常有用。我在临时分支中的提交历史是完全垃圾,绝对没有意义。我真的希望再也看不到这段历史,而不仅仅是为了能够跳过它。
当提交进行代码审查时,重要的是不要创建额外的提交。
答案 1 :(得分:12)
有,但这是无稽之谈。你为什么要那样做?你将失去所有的分支历史和信息。
您可以使用g的提交消息进行合并提交,然后使用--first-parent
选项浏览历史记录。
如果你真的想要从你的分支机构使用git merge --squash
丢失历史记录,我不推荐它
修改强>
如果您因为不认为自己的历史非常干净而感到不开心,可以使用git rebase feature:
您可以追溯编辑旧版并从现有分支创建新提交(实际上是重写它)。它允许您重写提交消息,拆分提交,压缩提交到单个提交,重新提交提交等。
你应该只在你没有发布你的分支时使用变基(即它只是一个私人分支),因为它会给其他开发人员带来麻烦,如果有人继续工作,可能会导致合并问题(之前)重新分支。
答案 2 :(得分:1)
正如“Trimming GIT Checkins/Squashing GIT History”中所述,如果您的提交c
和e
使用前缀为fixup!
的评论完成,那么rebase --interactive --autosquash
(git1 。7 +,2010年2月)可以完全完成你所追求的目标。
使用
fixup!
指令,您可以在提交消息中保持“不可见”的压缩,同时仍然可以使用--autosquash选项自动提交重新排序。
要使用fixup!
前缀提交,您可以定义别名
[alias]
fixup = !sh -c 'git commit -m \"fixup! $(git log -1 --format='\\''%s'\\'' $@)\"' -
squash = !sh -c 'git commit -m \"squash! $(git log -1 --format='\\''%s'\\'' $@)\"' -
fixup
别名将适用于那些“提交(这些只是保存点,即在宏观方案中不那么重要”)。