git重基冲突合并错误文件

git重基冲突合并错误文件,git,merge,conflict,rebase,corruption,Git,Merge,Conflict,Rebase,Corruption,我有一个我认为非常奇怪的问题,就是在重基期间合并冲突 我正在尝试将功能分支重新设置为开发分支: git checkout myFeatureBranch git rebase developBranch 现在git rebase报告冲突,我必须使用git mergetool来解决冲突 git mergetool Git mergetool声明了一个冲突的文件myFile1.h,合并界面打开(同一个repo的问题发生在Linux或Windows/tortoisegit上)。我看到的是,“他们的

我有一个我认为非常奇怪的问题,就是在重基期间合并冲突

我正在尝试将功能分支重新设置为开发分支:

git checkout myFeatureBranch
git rebase developBranch
现在git rebase报告冲突,我必须使用git mergetool来解决冲突

git mergetool
Git mergetool声明了一个冲突的文件
myFile1.h
,合并界面打开(同一个repo的问题发生在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
core.symlinks=false
core.autocrlf=输入
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
sendmail.smtpserver=/bin/msmtp.exe
diff.astextplane.textconv=astextplane
rebase.autosquash=true
core.autocrlf=true
core.excludesfile=
user.name=Russell
user.email=
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=
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.puttykeyfile=
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.develope.remote=origin
branch.develope.merge=refs/heads/develope
branch.myFeatureBranch.remote=原点
branch.myFeatureBranch.merge=refs/heads/myFeatureBranch

您遇到了git的重命名检测

首先,关于重基的一些重要注意事项

  • Rebase使用合并机制

  • 在合并中(例如,将
    功能
    合并到
    主功能
    ),您会说“我所在的分支,
    主功能
    ,是“我们的”代码,而我正在合并的分支,
    功能
    ,是“他们的”代码”

  • 当您重新设置代码的基址时,“我们的”端是您正在重新设置基址的代码,“他们的”端是您正在重新设置基址的代码,即您自己的代码。实际上,“双方”是相互交换的。(请参阅
    -m
    -s
    -X
    git rebase的参数以及有关交换边的说明。)

    在合并机制内部,使用默认(
    递归
    )策略,git认为“我们的”
    myFile1.h
    (即来自
    develope
    )更类似于“他们的”
    myOtherFile.c
    (即您自己的文件版本),而不是“他们的”(即您的)
    myFile1.h
    。所以它试图合并错误的文件


    转到
    git merge
    文档,注意可以传递到
    recursive
    的选项。最重要的可能是
    重命名阈值=
    。因此,您可以通过
    -X rename threshold=100
    (或任何足够大于50的数字)。我自己从来没有遇到过这个问题,但这似乎应该可以解决问题。

    您遇到了git的重命名检测

    首先,关于重基的一些重要注意事项

  • Rebase使用合并机制

  • 在合并中(例如,将
    功能
    合并到
    主功能
    ),您会说“我所在的分支,
    主功能
    ,是“我们的”代码,而我正在合并的分支,
    功能
    ,是“他们的”代码”

  • 当您重新设置代码的基址时,“我们的”端是您正在重新设置基址的代码,“他们的”端是您正在重新设置基址的代码,即您自己的代码。实际上,“双方”是相互交换的。(请参阅
    -m
    -s
    -X
    git rebase的参数以及有关交换边的说明。)

    在合并机制内部,使用默认(
    递归
    )策略,git认为“我们的”
    myFile1.h
    (即来自
    develope
    )更类似于“他们的”
    myOtherFile.c
    (即您自己的文件版本),而不是“他们的”(即您的)
    myFile1.h
    。所以它试图合并错误的文件


    转到
    git merge
    文档,注意可以传递到
    recursive
    的选项。最重要的可能是
    重命名阈值=
    。因此,您可以通过
    -X rename threshold=100
    (或任何足够大于50的数字)。我自己从来没有遇到过这个问题,但这似乎应该解决这个问题。

    git-rebase-p develope
    似乎解决了这个问题。多亏了


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

    git-rebase-p-develop似乎起到了作用。多亏了

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

    Rebase是一种减少噪音的工具,可以避免浪费时间的冗余。一旦你完成了值得写的东西,
    rebase
    就是“写值得读的东西”的助手。对于一次又一次的合并,当这会不必要地使读者的工作复杂化时,一对一的线性化几乎总是足够好和容易的,所以这就是默认情况下rebase尝试的。如果它转向