如何正确使用 git 工作流程和 rebase?
How do I properly use git workflow with rebase?
我正在使用 bitbucket,并且 运行 在使用 git 的 rebase 功能时遇到了问题。简而言之,我需要重新应用我每次变基时已经应用的更改。我使用以下步骤重新创建了问题。它是一个简化版本,但结果是一样的。
- 开发人员 A 创建了一个 git 存储库并将
contributors.txt
添加到 master
,提交并推送。现在 master
有一个 contributors.txt
文件。该文件的内容是
Developer A
- 开发者 A 从
master
. 创建了 branch-a
- 开发人员 B 从
master
. 创建 branch-b
- 开发人员 A 在
branch-a
中附加了贡献者文件,看起来像这样。
Developer A
Developer A2
- 开发人员 B 在
branch-b
中附加了贡献者文件,看起来像
Developer A
Developer B
- 开发人员 A 提交并将更改推送到远程
branch-a
- 开发人员 B 提交更改并将更改推送到远程
branch-b
。
- 开发人员 A 将
branch-a
与 master
合并。
- 开发人员 B 签出 master 并拉取,这样本地 master 就会更新上面第 8 步中提到的合并所应用的更改。
- 开发人员 B 签出
branch-b
并执行 git rebase master
- 开发人员 B 遇到合并冲突。
- 开发人员 B 修复了合并冲突,因此文件现在看起来像
Developer A
Developer A2
Developer B
- 开发人员 B
git add
添加固定冲突并运行 git rebase --continue
。一切顺利。
- 开发人员 B 拉动
branch-b
,因为现在本地和远程 branch-b
已经分离,他们需要合并。 (需要在拉取前设置上游)
- 开发者 B 解决了合并冲突,现在本地
branch-b
有来自 master 的更改,可以推送到远程。
- 开发者 B 将
branch-b
推送到远程。使用 git push origin branch-b
。一切顺利。
- 开发人员 B 在
branch-b
中创建了一个新文件并提交。
- 开发者B然后做
git checkout master
git pull
(master 是最新的,因为它自上次拉动以来没有改变,即第 9 步)
git checkout branch-b
git rebase master
- 执行
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 分支替换远程分支。
我正在使用 bitbucket,并且 运行 在使用 git 的 rebase 功能时遇到了问题。简而言之,我需要重新应用我每次变基时已经应用的更改。我使用以下步骤重新创建了问题。它是一个简化版本,但结果是一样的。
- 开发人员 A 创建了一个 git 存储库并将
contributors.txt
添加到master
,提交并推送。现在master
有一个contributors.txt
文件。该文件的内容是Developer A
- 开发者 A 从
master
. 创建了 - 开发人员 B 从
master
. 创建 - 开发人员 A 在
branch-a
中附加了贡献者文件,看起来像这样。Developer A Developer A2
- 开发人员 B 在
branch-b
中附加了贡献者文件,看起来像Developer A Developer B
- 开发人员 A 提交并将更改推送到远程
branch-a
- 开发人员 B 提交更改并将更改推送到远程
branch-b
。 - 开发人员 A 将
branch-a
与master
合并。 - 开发人员 B 签出 master 并拉取,这样本地 master 就会更新上面第 8 步中提到的合并所应用的更改。
- 开发人员 B 签出
branch-b
并执行git rebase master
- 开发人员 B 遇到合并冲突。
- 开发人员 B 修复了合并冲突,因此文件现在看起来像
Developer A Developer A2 Developer B
- 开发人员 B
git add
添加固定冲突并运行git rebase --continue
。一切顺利。 - 开发人员 B 拉动
branch-b
,因为现在本地和远程branch-b
已经分离,他们需要合并。 (需要在拉取前设置上游) - 开发者 B 解决了合并冲突,现在本地
branch-b
有来自 master 的更改,可以推送到远程。 - 开发者 B 将
branch-b
推送到远程。使用git push origin branch-b
。一切顺利。 - 开发人员 B 在
branch-b
中创建了一个新文件并提交。 - 开发者B然后做
git checkout master
git pull
(master 是最新的,因为它自上次拉动以来没有改变,即第 9 步)git checkout branch-b
git rebase master
- 执行
git rebase master
时,git要求开发者B重新解决同样的冲突。为什么会这样?不应该知道已经应用的更改并且不要求再次应用吗?
branch-a
branch-b
我想我可以使用merge而不是rebase来克服这个问题。但似乎我错误地使用了 rebase。请让我知道我做错了什么
完成第 13 步后,您应该可以执行 git push origin branch-b --force
。这会将重新定位的版本推送到 branch-b
到您的远程,并且因为它是在 master 之上重新定位的,所以您应该能够毫无问题地与 master 合并。
前一种方法的问题在于,在基于 master 之上重新定位之后,您只是将合并提交添加到尚未基于 master 之上重新定位的 origin/branch-b,因此它仍然存在分歧。如果你强制推送,那么它只是用你的 rebased 分支替换远程分支。