gpt4 book ai didi

git - 避免重新解决 git rebase 中的冲突,包括 merge 提交

转载 作者:行者123 更新时间:2023-12-04 17:26:10 24 4
gpt4 key购买 nike

尝试通过将源远程和 rebase 添加到本地目标存储库上的分支来将历史记录从一个存储库移动到另一个存储库(无公共(public)根)。
来源:

A-B-C
\ /
E
目的地通缉:
F-A'-B'-C'
\ /
E'
git rebase --rebase-merges 的文档说它将保留拓扑并重新创建 merge 提交,但是:

Any resolved merge conflicts or manual amendments in these merge commits will have to be resolved/re-applied manually.


现在,我想避免重新解决冲突,我很困惑为什么需要这样做。 merge 提交的内容在那里,我可以将 HEAD 分离到。
所以,我试过了
$ git rebase -i --onto destnewbranch --root --rebase-merges srcbranch
Could not apply C... master # Merge branch 'master'

(detached HEAD|REBASE x/y)
$ git status
interactive rebase in progress; onto F
Last commands done (n commands done):
pick B
merge -C C master # Merge branch 'master'

You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
为了解决冲突,我取的是C的内容:
$ git reset --hard C
现在内容很好,但历史不是,所以:
$ git reset --soft HEAD@{1}
剩下要做的就是继续 rebase:
$ git commit
$ git rebase --continue
然而,历史是错误的,因为我留下了:
F-A'-B'-C'
所以 C' 不是 merge 提交,尽管它具有 B 和 E 的已解决更改。
不会导致冲突的 merge 提交成功地重新定位,拓扑完好无损。
我认为是我通过重置弄乱了 rebase 的 MERGING 状态,最终的 git commit 不会创建 merge 提交,而是常规提交。如果我不进行重置并手动解决冲突,git commit 将创建一个 merge 提交。
git 版本 2.26.0.windows.1

最佳答案

要使用现有提交的内容解决冲突,请使用 git restore .请勿使用 git reset --hard修改 HEAD .
然而,即使在大多数情况下也行不通。您可能正在寻找的名称是 rerere (“重用记录的分辨率”的缩写)。在 Git 配置中启用它:

git config rerere.enabled true
启用后,它将记录所有已解决的冲突,以便稍后重播。要自动暂存这些记录的冲突,您还可以设置 rerere.autoupdate :
git config rerere.autoupdate true
另外,你可以教 rerere关于过去的 merge 和使用 rerere-train.sh 解决的冲突通常与 Git 一起分发的脚本(在 Ubuntu 上可从 /usr/share/doc/git/contrib/rerere-train.sh 获得)。在 rebase 之前调用它以避免必须重做任何以前解决的冲突:
rerere-train.sh destnewbranch..srcbranch
git rebase destnewbranch srcbranch --onto destnewbranch --rebase-merges

关于git - 避免重新解决 git rebase 中的冲突,包括 merge 提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63268815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com