Git Rebase 合并自动获取
Git Rebase merge auto take
我有
G---H---I---J Develop
/
A---B---C---D---E---F Master
我想和master一起rebase Develop,所以:
G---H---I---J Develop
/
A---B---C---D---E---F Master
所以如果我这样做 git checkout develop & git rebase master
它将进行变基,但是,在每次提交时发现合并冲突时它将停止。
我很高兴从开发中获取所有内容并用它覆盖。 develop 发生了巨大的变化,但每次提交都会构建并通过所有测试,所以我可以假设如果我只是覆盖 master 中的所有内容应该没问题。
所以我怎么说 git rebase master --choose develop side
那就是 git rebase -X theirs master
我认为声明中有些歧义
I'm happy just to take everything from develop and overwrite with that
(或者至少人们准备的方式)。
你是说 "where there's a conflict I'm happy taking what's in develop
" 吗?这就是junkangli(git rebase -X theirs master
)的回答。虽然这是理解您所问内容的一种方式,但结果不太可能是构建和运行的代码。
另一种阅读方式是您想要从 develop
获取 一切 - 冲突与否 - 即丢弃在 [=] 中所做的任何更改17=] 和 F
因为 develop
的变化是如此深刻以至于 E
和 F
不再值得麻烦了。
在那种情况下,您有几个选择,具体取决于您在最终历史记录中想要什么。
我的建议是:
# make sure you're on master
git checkout master
# revert the commits that are going to be clobbered
git revert -n HEAD^ HEAD
git commit
# merge the branch
git merge develop
这会在历史记录中保留 E
和 F
,以及明确说明 "I'm consciously undoing these changes" 的提交。你最终会得到
G - H -- I -- J Develop
/ \
A - B - C - D - E - F - ~EF - M Master
既然你想变基,你可能不喜欢那个最终状态。另一种选择是像上面那样做 revert,然后 rebase develop 到 master;由于 ~EF
处的内容 (TREE
) 与 D
处的树匹配,因此 应该 可以正常工作并给你
A - B - C - D - E - F - ~EF - G` - H` - I` - J` Develop , Master
假设之前已推送 develop
,执行此操作后您将必须 "force push" 它 (push -f
);这将为回购的所有其他用户创造 "upstream rebase" 情况;请参阅 git rebase
文档了解更多信息,包括他们恢复的步骤,并了解如果您不与受影响的每个人协调,有人采取 错误的 恢复步骤可能撤销你所做的。
为了完整起见,实际最简单的方法(但不是我推荐的方法,特别是如果其他人共享回购协议)只是 reset
master
对 J
的引用。
git checkout master
git reset --hard develop
这将重写 master
分支的历史,因此要推送 master
您必须使用 -f
选项(强制推送);这又一次造成了 "upstream rebase" 的情况。这也意味着 E
和 F
完全从历史记录中删除(除非你在它们上面放置一个新的标签或分支)。
我有
G---H---I---J Develop
/
A---B---C---D---E---F Master
我想和master一起rebase Develop,所以:
G---H---I---J Develop
/
A---B---C---D---E---F Master
所以如果我这样做 git checkout develop & git rebase master
它将进行变基,但是,在每次提交时发现合并冲突时它将停止。
我很高兴从开发中获取所有内容并用它覆盖。 develop 发生了巨大的变化,但每次提交都会构建并通过所有测试,所以我可以假设如果我只是覆盖 master 中的所有内容应该没问题。
所以我怎么说 git rebase master --choose develop side
那就是 git rebase -X theirs master
我认为声明中有些歧义
I'm happy just to take everything from develop and overwrite with that
(或者至少人们准备的方式)。
你是说 "where there's a conflict I'm happy taking what's in develop
" 吗?这就是junkangli(git rebase -X theirs master
)的回答。虽然这是理解您所问内容的一种方式,但结果不太可能是构建和运行的代码。
另一种阅读方式是您想要从 develop
获取 一切 - 冲突与否 - 即丢弃在 [=] 中所做的任何更改17=] 和 F
因为 develop
的变化是如此深刻以至于 E
和 F
不再值得麻烦了。
在那种情况下,您有几个选择,具体取决于您在最终历史记录中想要什么。
我的建议是:
# make sure you're on master
git checkout master
# revert the commits that are going to be clobbered
git revert -n HEAD^ HEAD
git commit
# merge the branch
git merge develop
这会在历史记录中保留 E
和 F
,以及明确说明 "I'm consciously undoing these changes" 的提交。你最终会得到
G - H -- I -- J Develop
/ \
A - B - C - D - E - F - ~EF - M Master
既然你想变基,你可能不喜欢那个最终状态。另一种选择是像上面那样做 revert,然后 rebase develop 到 master;由于 ~EF
处的内容 (TREE
) 与 D
处的树匹配,因此 应该 可以正常工作并给你
A - B - C - D - E - F - ~EF - G` - H` - I` - J` Develop , Master
假设之前已推送 develop
,执行此操作后您将必须 "force push" 它 (push -f
);这将为回购的所有其他用户创造 "upstream rebase" 情况;请参阅 git rebase
文档了解更多信息,包括他们恢复的步骤,并了解如果您不与受影响的每个人协调,有人采取 错误的 恢复步骤可能撤销你所做的。
为了完整起见,实际最简单的方法(但不是我推荐的方法,特别是如果其他人共享回购协议)只是 reset
master
对 J
的引用。
git checkout master
git reset --hard develop
这将重写 master
分支的历史,因此要推送 master
您必须使用 -f
选项(强制推送);这又一次造成了 "upstream rebase" 的情况。这也意味着 E
和 F
完全从历史记录中删除(除非你在它们上面放置一个新的标签或分支)。