【发布时间】:2010-10-21 11:43:56
【问题描述】:
如果我在多个分支中处理单个功能,我使用git pull branch1 branch2 branch3 将所有更改拉入我的主分支。但是,每个分支的所有提交日志也会被复制。如何将提交日志扁平化为一条消息?
【问题讨论】:
标签: git git-pull git-push git-merge
如果我在多个分支中处理单个功能,我使用git pull branch1 branch2 branch3 将所有更改拉入我的主分支。但是,每个分支的所有提交日志也会被复制。如何将提交日志扁平化为一条消息?
【问题讨论】:
标签: git git-pull git-push git-merge
“git merge --squash”(在“git fetch”之后;“git pull”只是 fetch+merge,也许它也允许 --squash 选项)可能是你想要的。
来自git-merge(1):
--壁球
生成工作树和索引状态,就像发生真正的合并一样,但实际上不进行提交或移动 HEAD,也不记录
$GIT_DIR/MERGE_HEAD以导致下一个 git commit 命令创建合并提交。这允许您在当前分支之上创建一个单个提交,其效果与合并另一个分支相同(如果是章鱼则更多)。
【讨论】:
您可以使用交互式rebase 并“压缩”提交——另请参阅Git Ready Tutorial on squashing via rebase。很抱歉只给你一个链接,但这是一个非常彻底的教程。哦,这也会很好地消除您的合并。
【讨论】:
merge --squash。效果(即将分支中的所有更改作为当前分支上的单个差异转储)将是相同的,但工作量只有一半。
git merge --squash branch && git commit -m "message" 的问题在于它实际上并没有将分支标记为合并。 git branch -d 不会删除它(使用-D),图形查看工具将显示分支只是挂起而不是加入。
正如 Brian White 所评论的 git merge --squash 的问题在于它没有给您提供可见的链接,因此无法追溯到您合并的分支(或单个更改)。
可见(当被视为图表git log --graph),一个已合并回的重要分支看起来与您搞砸并乐意丢弃的实验分支没有什么不同。两者都只是挂在那里,与任何东西无关。我个人想知道某个分支已经被合并回来,所以我知道工作已经完成。
一个适合我的解决方案是使用带有 no-fastforward 选项的合并。
git merge --no-ff somebranch -m "my commit message"
这会强制 git 创建包含所有分支更改的单个提交,您可以自己设置提交消息(如果需要)但最重要的是,它将新提交链接回它刚刚合并的分支。这很明显显示该分支上的工作已完成,但还允许您回溯以查看合并分支中各个提交的详细信息。
这是一个示例,其中非常简单的分支分别具有一个和两个提交已合并回 master。我随后删除了合并分支上的分支标签,但是仍然可以在合并提交消息中看到分支名称。分支名称应该总结更改,如果您想知道包含的确切更改,您可以将其追溯到各个提交。这种方法似乎很适合简单的项目。
注意:我不得不手动绘制其中一个连接器,因为它是深蓝色的,几乎看不到。
【讨论】: