如何正确使用 git 工作流程和 rebase?

How do I properly use git workflow with rebase?

我正在使用 bitbucket,并且 运行 在使用 git 的 rebase 功能时遇到了问题。简而言之,我需要重新应用我每次变基时已经应用的更改。我使用以下步骤重新创建了问题。它是一个简化版本,但结果是一样的。

  1. 开发人员 A 创建了一个 git 存储库并将 contributors.txt 添加到 master,提交并推送。现在 master 有一个 contributors.txt 文件。该文件的内容是 Developer A
  2. 开发者 A 从 master.
  3. 创建了 branch-a
  4. 开发人员 B 从 master.
  5. 创建 branch-b
  6. 开发人员 A 在 branch-a 中附加了贡献者文件,看起来像这样。 Developer A Developer A2
  7. 开发人员 B 在 branch-b 中附加了贡献者文件,看起来像 Developer A Developer B
  8. 开发人员 A 提交并将更改推送到远程 branch-a
  9. 开发人员 B 提交更改并将更改推送到远程 branch-b
  10. 开发人员 A 将 branch-amaster 合并。
  11. 开发人员 B 签出 master 并拉取,这样本地 master 就会更新上面第 8 步中提到的合并所应用的更改。
  12. 开发人员 B 签出 branch-b 并执行 git rebase master
  13. 开发人员 B 遇到合并冲突。
  14. 开发人员 B 修复了合并冲突,因此文件现在看起来像 Developer A Developer A2 Developer B
  15. 开发人员 B git add 添加固定冲突并运行 git rebase --continue。一切顺利。
  16. 开发人员 B 拉动 branch-b,因为现在本地和远程 branch-b 已经分离,他们需要合并。 (需要在拉取前设置上游)
  17. 开发者 B 解决了合并冲突,现在本地 branch-b 有来自 master 的更改,可以推送到远程。
  18. 开发者 B 将 branch-b 推送到远程。使用 git push origin branch-b。一切顺利。
  19. 开发人员 B 在 branch-b 中创建了一个新文件并提交。
  20. 开发者B然后做
    • git checkout master
    • git pull(master 是最新的,因为它自上次拉动以来没有改变,即第 9 步)
    • git checkout branch-b
    • git rebase master
  21. 执行git rebase master时,git要求开发者B重新解决同样的冲突。为什么会这样?不应该知道已经应用的更改并且不要求再次应用吗?

我想我可以使用merge而不是rebase来克服这个问题。但似乎我错误地使用了 rebase。请让我知道我做错了什么

完成第 13 步后,您应该可以执行 git push origin branch-b --force。这会将重新定位的版本推送到 branch-b 到您的远程,并且因为它是在 master 之上重新定位的,所以您应该能够毫无问题地与 master 合并。

前一种方法的问题在于,在基于 master 之上重新定位之后,您只是将合并提交添加到尚未基于 master 之上重新定位的 origin/branch-b,因此它仍然存在分歧。如果你强制推送,那么它只是用你的 rebased 分支替换远程分支。