git 变基冲突合并错误的文件



我认为在变基期间合并冲突是一个非常奇怪的问题。

我正在尝试使用开发分支来变基功能分支:

git checkout myFeatureBranch
git rebase developBranch

现在 git 变基报告冲突,我必须使用 git 合并工具来解决冲突。

git mergetool

Git mergetool 声明了一个冲突的文件myFile1.h并打开合并界面(对于同一存储库,问题发生在 Linux 或 Windows/tortoisegit 上)。我看到的是"他们的"文件完全是错误的文件myOtherFile.c尽管"我的"文件正确显示myFile1.h.

我已经尝试了git gc --aggressivegit fsck --full. git gc 报告根本没有问题,git fsck 有很多悬而未决的东西,但没有错误或缺少信息。

这是 git 数据库中的某种损坏吗,如果是,可以修复吗?

还有什么其他可能的问题吗?

我确实认为也许我可以将"我的"文件合并回自身(完全忽略所有不正确的"他们的"更改),也许这会解决问题,但我担心它也会使事情变得更糟。

无论问题是什么,它似乎确实在我们的主远程存储库中,因为新克隆表现出相同的变基问题。

感谢您的帮助。

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

你遇到了 git 的重命名检测。

首先,关于变基的一些重要说明。

  1. 变基使用合并机制。

  2. 在合并(例如,将feature合并到master)中,您会说"master,我所在的分支是'我们的'代码,而我合并的分支feature是'他们的'代码"。

当你变基代码时,"我们的"端是你变基的代码,

"他们的"代码是你变基的代码,即你自己的代码。 实际上,"双方"是交换的。 (请参阅-m-s-X git rebase的论点,以及关于交换双方的说明。

在合并机制中,使用默认的(recursive)策略,git 认为"我们的"myFile1.h(即来自develop的那个)更类似于"他们的"myOtherFile.c(即您自己的该文件版本),而不是"他们的"(即您的)myFile1.h。 所以它试图合并错误的文件。

转到git merge文档,请注意可以传递给 recursive 的选项。 最重要的一个可能是rename-threshold=<n>. 因此,您可以传递-X rename-threshold=100(或任何足够大于 50 的数字)。 我自己从未真正遇到过这个问题,但这似乎应该可以解决问题。

git rebase -p develop似乎可以解决问题。感谢杰希尔。

我还没有尝试过托雷克的答案,但出于好奇,我也打算探索一下。

为什么历史上的合并会有什么不同?

Rebase 是一种降噪工具,可将浪费时间的冗余从 pu{bli,}shed 历史记录中剔除。一旦你完成了值得写的东西,rebase就是"写值得读的东西"的助手。 对于一个吹一吹,你只是合并,当这会不必要地使读者的工作复杂化时,线性化的一对一几乎总是足够好和容易的,所以这就是 rebase 默认尝试的目的。如果结果不是那么容易,那么有-i-p--interactive--preserve-merges,以帮助进行更复杂的编辑。

相关内容

  • 没有找到相关文章

最新更新