【问题标题】:git pull from clean directory has merge conflictsgit pull from clean 目录有合并冲突
【发布时间】:2011-06-27 21:01:24
【问题描述】:

我从上游在一个干净的工作目录上做了一个git pull,它给我带来了合并冲突。我花了大约一个小时手动重置它们,以为我搞砸了,然后又发生了。

这是 git 中的错误吗?我对此知之甚少,所以我完全愿意接受我这样做是为了自己。

这是我截断的输出(大约有 9 个文件,但我想节省空间,文件名已更改以保护无辜者):

$ git status
# On branch master
nothing to commit (working directory clean)
$ git pull
Auto-merged xxxx/xxxx/xxxx.xxx
CONFLICT (content): Merge conflict in xxxx/xxxx/xxxx.xxx
Automatic merge failed; fix conflicts and then commit the result.

我使用的是 Solaris 11 Express,包默认为 git。

$ uname -a
SunOS xxxx 5.11 snv_151a i86pc i386 i86pc Solaris
$ git --version
git version 1.5.6.5
$ pkg list git
NAME (PUBLISHER)                              VERSION         STATE      UFOXI
developer/versioning/git                      1.5.6.5-0.151.0.1 installed  -----

我发现了这个问题:Git pull fails: You have unstaged changes. Git status: nothing to commit (working directory clean),它似乎最接近,但答案并不令人满意。

如何在不删除整个存储库并进行新克隆的情况下克服这个问题?

【问题讨论】:

    标签: git


    【解决方案1】:

    您的工作目录可能是干净的,但您有一个或多个本地提交,但不在服务器上。当您拉取时,git 会尝试将这些本地提交与服务器上的提交合并,但由于它们修改了代码的同一区域,因此它们会发生冲突。

    您在这里的选择基本上可以归结为:

    1. Fix the conflicts. 你告诉 git 如何处理冲突的更改,然后继续。
    2. 使用git pull --rebase 重新设置基础并修复冲突。这与 1 没有太大区别,但如果您的更改从未发布过(即,它们从未被推送过),这可能会让您获得更清晰(线性)的历史记录。
    3. 放弃您的本地更改并使用远程的git reset --hard remotename/remotebranch。这将丢失您在本地提交但未推送到其他地方的所有更改。

    【讨论】:

    • 我在该分支上没有任何本地提交,但 #3 成功了,谢谢。
    • 有用的答案,帮助我找到了摆脱困境的方法。就我而言,我在一个分支上运行了一个“git rebase master”。然后我遇到了如上所述的合并冲突。用 'git merge --abort' 和你的 'git pull --rebase' 解决。谢谢!
    • 也用#3 解决了我的问题。我试着记住这个命令+1
    • 经过多年的git经验,回顾这个​​帖子,我认为发生的事情是在我克隆之后,所有者重置并强制推送一些提交,从而产生冲突。重置到远程会丢弃他们已覆盖的提交。
    【解决方案2】:

    拉,解决合并冲突并提交?即使您有一个干净的工作目录,如果您提交了一些与传入更改冲突的工作,您也会遇到合并冲突。

    【讨论】:

      【解决方案3】:

      添加到 bdonlan 答案,当您有一些提交(在您的本地存储库上),但远程存储库领先(与您的相比有一些进展)时,可能会发生这种情况本地提交的文件)。

      我只是因为这些冲突而无法推动或拉动时卡住了。

      尝试执行 'rebase' 或 'reset --hard' 但没有成功。

      对我有用的唯一解决方案是返回一次提交并拉取;

      按照以下步骤操作:

      警告:这是一项破坏性操作,会导致您丢失对该代码的最后更改,因此请先备份您的更改!

      1. 在您的本地存储库中使用“git log”并将其与远程的提交日志进行比较 - 了解您的哪个提交没有被推送
      2. 使用 'git reset --hard' 返回上一次您的代码适合远程存储库的时间(我使用了 'git reset --hard HEAD^ ' 故意丢失我之前的提交)
      3. 现在“git pull”可以工作了;使用它从远程服务器获取最新代码

      【讨论】:

        猜你喜欢
        • 2018-08-04
        • 2017-12-25
        • 1970-01-01
        • 2020-07-25
        • 2018-06-27
        • 2014-05-06
        • 2017-07-24
        • 1970-01-01
        • 2011-12-16
        相关资源
        最近更新 更多