我认为在变基期间合并冲突是一个非常奇怪的问题。
我正在尝试使用开发分支来变基功能分支:
git checkout myFeatureBranch
git rebase developBranch
现在 git 变基报告冲突,我必须使用 git 合并工具来解决冲突。
git mergetool
Git mergetool 声明了一个冲突的文件myFile1.h
并打开合并界面(对于同一存储库,问题发生在 Linux 或 Windows/tortoisegit 上)。我看到的是"他们的"文件完全是错误的文件myOtherFile.c
尽管"我的"文件正确显示myFile1.h
.
我已经尝试了git gc --aggressive
和git 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 的重命名检测。
首先,关于变基的一些重要说明。
-
变基使用合并机制。
-
在合并(例如,将
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
,以帮助进行更复杂的编辑。