像大多数刚接触 Git 的人一样,我在试图破译适用于 git merge 和 git rebase 的用例时也有过困惑。我想我终于决定,就最终的工作副本状态而言,它们给你的东西是一样的。而且,它们都导致相同的冲突。如果这是不正确的,请提供一个例子来启发我。
从我的角度来看,使用 rebase 而不是 merge(如果您的更改没有被推送或拉出)的主要好处是保持历史线性。我真正不明白的是开发 git-rerere 背后的原因。
从手册页来看, git-rerere 应该在您尝试解决之前解决的冲突时为您提供帮助。我将要参考的示例位于http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html。
如果您的项目的策略是不要不断地将来自主线的更改合并到您的主题分支(如 linux 内核),那么上面的示例说创建“丢弃”合并提交。本质上,将 master 合并到您的主题中,运行测试以确保一切仍然有效,然后执行“git reset --hard HEAD^”,基本上将合并提交扔掉。稍后,当您创建另一个“一次性”合并提交时,git-rerere 会帮助您解决您在第一次一次性合并中已经解决的冲突。
有人可以解释一下,为什么开发人员没有经历创建临时合并提交的所有麻烦,而是将他的主题重新定位到 master 上?这不是 git-rebase 的重点 - 获取更改,但避免合并?这不是完成同样的事情,并且假设没有人拉动您的主题分支更改,这不是一种更简单的方法吗?throw-away-merge+git-rerere 工作流程真的只适用于您的更改被推/拉的情况吗?
最后一个问题 - 引用 Linus 的话说:“但如果我在你的日志中看到很多 'Merge branch linus',我不会拒绝你,因为你的树显然有随机的废话,不应该在那里……”Linus 是否也会遇到不断变基的问题?