假设我正在开发一个功能,在一个名为 foo_baz
的分支中。
我在处理该功能时多次提交。
我定期将远程跟踪分支 foo_baz
推送到远程仓库。 IE origin/foo_baz
.
我想将所有提交从 foo_baz
merge 到 master
并推送到 origin/master
。这是问题:
我能否将 foo_baz
merge 到 master
中,这样所有提交在 foo_baz
的历史中仍然是分开的,但在 master 中
的历史,它们都是一个,压扁的提交?
编辑:
我是一个 git 新手,所以如果我遗漏了一些非常明显的东西,请原谅我。我在网上四处搜寻,但找不到我的问题的直接答案。
最佳答案
您可能确实在寻找 --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
命令——但是第一个抑制了多父操作,所以最后,当你一年后回顾这个命令时,看起来你只是从分支复制了所有更改。 树(您在 git checkout
分支中获得的所有文件)在 D
中都是相同的和 E
(无论如何,在这种特殊情况下, merge 操作之前 master
上的 B 没有更改),但它们是不同的提交。
与直线的区别git merge
就是后者一般会产生“快进”,长这样:
A --- B
\
C --- D <-- foo_baz, master
可以 pull 直斜线的位置,为您提供两个分支看起来完全相同的历史记录。
关于git - Squash 在 master 上提交但在功能分支上单独提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17456422/