Git merge --squash和--no-commit之间的差异

qua*_*lar 57 git merge squash

正如标题所说,我并不清楚a git merge --squash和a 之间的区别git merge --no-commit.

据我所知的帮助页面git merge,这两个命令都会让我进入一个更新的工作树,在那里它仍然可以编辑然后进行最后的提交(或多次提交).

有人可以澄清这两个选项的差异吗?我什么时候使用一个而不是另一个?

ral*_*nja 76

git merge --no-commit
Run Code Online (Sandbox Code Playgroud)

这与普通合并类似,但不会创建合并提交.此提交将是合并提交:当您查看历史记录时,您的提交将显示为正常合并.

git merge --squash
Run Code Online (Sandbox Code Playgroud)

这会将更改合并到您的工作树中,而不会创建合并提交.当您提交合并的更改时,它将看起来像您的分支上的新"正常"提交:在历史记录中没有合并提交.这几乎就像你对所有合并的变化做了一个挑选.

  • *"这就像一个普通的合并,但不会创建合并提交.这个提交将是一个合并提交:当你查看历史记录时,你的提交将显示为正常的合并."*我是唯一一个谁发现那个解释让*没有意义呢?并且不"压缩"将所有更改放入单个提交中(这与樱桃选择多个提交完全不同)? (8认同)
  • @PhilippWendler所以基本上:有一个合并提交我总是通过查看历史知道,这个提交是合并的结果(这个合并的分支的信息也保留了吗?).使用--squash无法知道此提交是合并的结果.我理解正确吗? (5认同)
  • @quaylar你是否理解正确.但是,由于可以删除/重命名分支等,因此无法保证您可以准确查看合并的分支. (4认同)
  • @quaylar我真的建议你玩这些命令,看看它在历史中的确切外观.请记住,您可以随时在git中撤消,只需执行"git reset --hard HEAD"即可. (3认同)
  • @quaylar合并提交实际上并不是一个特殊的提交,除了它有多个父项.您可以通过`git log --parents`(以及`git log --merges`仅显示此类提交)来查看提交的父项. (2认同)