在主分支上压缩提交记录,但在特性分支上保留分开的提交记录?

5
假设我正在开发一个功能,分支名为foo_baz
在完成功能的过程中,我会提交多次代码。
我会定期将foo_baz这个远程跟踪分支推送到远程仓库,即origin/foo_baz
当我想要合并来自foo_baz的所有提交到master并推送到origin/master时,问题就来了:
我是否能够将foo_baz合并到master中,使得foo_baz的所有提交在其自身的历史记录中仍然是单独的,但在master的历史记录中却成为了一个汇总的提交?
编辑:我是一个Git的初学者,请原谅我如果我漏掉了一些非常显然的东西。我在网上搜索了一下,但没有找到直接回答我的问题的方法。
3个回答

5
你可能确实在寻找 --squash(如其他答案所述),但你可能更需要的是 --no-ff

下面是两者之间的区别。假设你有两次提交:

A --- B                <-- branch "master", when you start

然后在你的新分支foo_baz上再创建两个:

A --- B                <-- master
        \
          C --- D      <-- foo_baz

现在(一旦回到master),你有以下两个选项(还有其他选项)。你可以git merge --squash foo_baz && git commit,这将给你以下结果:

A --- B ----------- E  <-- master
        \
          C --- D      <-- foo_baz

或者你可以使用 git merge --no-ff 命令:

A --- B ----------- E  <-- "master" after merge --no-ff
        \         /
          C --- D      <-- foo_baz

两种方法都会给你一个新的提交记录E——在第一种情况下,是通过单独的git commit命令实现的——但第一种方法抑制了多父级操作,因此最终,当你在一年后回顾这个时,它看起来像是你只是从分支上复制了所有的更改。在两个提交DE中,tree(当你git checkout分支时获取到的所有文件)将是相同的(在这个特定的情况下,即在合并操作之前没有对master上的B进行更改),但它们是不同的提交。

与直接使用git merge的区别在于,后者通常会产生“快进”,看起来像这样:

A --- B
        \
          C --- D      <-- foo_baz, master

当倾斜的线条被拉直时,你将得到一段历史,其中两个分支看起来完全相同。


0

我想你想要的是这样的:

git merge --squash foo_baz
git commit

0

我认为你正在寻找--squash标志。


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