blu*_*kie 1 git merge conflict rebase corruption
我认为在变基期间合并冲突是一个非常奇怪的问题。
我正在尝试使用开发分支重新设置功能分支:
git checkout myFeatureBranch
git rebase developBranch
Run Code Online (Sandbox Code Playgroud)
现在 git rebase 报告冲突,我必须使用 git mergetool 来解决冲突。
git mergetool
Run Code Online (Sandbox Code Playgroud)
Git mergetool 声明冲突文件myFile1.h并打开合并界面(问题发生在 Linux 或 Windows/tortoisegit 上,对于同一个 repo)。我看到的是“他们的”文件完全是错误的文件,myOtherFile.c尽管“我的”文件正确显示了myFile1.h.
我试过git gc --aggressive和git fsck --full。git gc 根本没有报告任何问题,而 git fsck 有很多悬而未决的东西,但没有错误或缺少信息。
这是 git 数据库中的某种损坏吗?如果是,可以修复吗?
有什么其他可能的错误吗?
我确实认为也许我可以将“我的”文件合并回自身(完全忽略所有不正确的“他们的”更改),也许这可以解决问题,但我担心它也会使事情变得更糟。
无论问题是什么,它似乎都在我们的主远程存储库中,因为新克隆表现出相同的 rebase 问题。
谢谢你的帮助。
git config -l 带有一些编辑的输出:
core.symlinks=false
core.autocrlf=input
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/bin/curl-ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
core.autocrlf=true
core.excludesfile=<global exclude file>
user.name=Russell
user.email=<email address>
push.default=simple
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
remote.origin.url=<gituser@gitserver>
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.puttykeyfile=<key.ppk>
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.develop.remote=origin
branch.develop.merge=refs/heads/develop
branch.myFeatureBranch.remote=origin
branch.myFeatureBranch.merge=refs/heads/myFeatureBranch
Run Code Online (Sandbox Code Playgroud)
您遇到了 git 的重命名检测。
首先,关于 rebase 的一些重要说明。
Rebase 使用合并机制。
在合并(例如,合并feature到master)中,您会说“我所在的分支master是'我们的'代码,而我正在合并的分支feature是'他们的'代码”。
当你变基码中,“我们的”一面是你需要衍合代码来,与“他们”的代码是你需要衍合,即代码,你自己的代码。实际上,“双方”交换了。(请参阅-m、-s、 和 的-X参数git rebase以及有关交换边的注释。)
里面的合并机械,使用默认的(recursive)策略,混帐认为,“我们的” myFile1.h(即从一个develop)较为相似,“他们的” myOtherFile.c,而不是(即自己版本的文件)“他们”(即你的) myFile1.h。所以它试图合并错误的文件。
转到git merge文档,注意您可以传递给的选项recursive。最重要的一个大概就是rename-threshold=<n>。因此,您可以通过-X rename-threshold=100(或任何足够高于 50 的数字)。我自己从未真正遇到过这个问题,但这似乎应该可以解决问题。