【问题标题】:Git Pull is Not Possible, Unmerged FilesGit Pull 是不可能的,未合并的文件
【发布时间】:2013-02-14 03:28:26
【问题描述】:

我已经阅读了所有类似的问题;以下似乎都没有奏效:

Delete offending files
git reset --hard HEAD
git stash
git pull

几乎所有组合,存储更改和从存储库中提取,都会导致文件不可合并。我想放弃所有本地更改并只使用遥控器,但我无法再次克隆(开发人员试图这样做的带宽和互联网使用限制)。我该怎么做呢?

刚试过:

git stash
git pull

也没有用。

更多信息

有一个本地提交,上游也有一个提交。因此,我尝试了git pull --rebase,但它仍然无法正常工作......这给了我错误 - “由于未解决的冲突而退出”。如果我这样做git stash, git reset --hard HEAD, git pull --rebase,我会收到错误“无法拉取,未合并的更改...”

【问题讨论】:

    标签: git


    【解决方案1】:

    假设远程是origin,分支是master,并且说您已经签出master,可以尝试以下操作:

    git fetch origin
    git reset --hard origin/master
    

    这基本上只是将当前分支指向远程分支的HEAD

    警告:如 cmets 所述,这将丢弃您的本地更改用原点上的任何内容覆盖。。 p>

    或者你可以使用管道命令来做同样的事情:

    git fetch <remote>
    git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
    git reset --hard
    

    编辑:我想简要解释一下为什么会这样。

    .git 文件夹可以保存任意数量的存储库的提交。由于commit hash其实是对commit内容的一种验证方式,而不仅仅是一个随机生成的值,它是用来匹配repositories之间的commit sets。

    分支只是一个指向给定哈希的命名指针。这是一个示例集:

    $ find .git/refs -type f
    .git/refs/tags/v3.8
    .git/refs/heads/master
    .git/refs/remotes/origin/HEAD
    .git/refs/remotes/origin/master
    

    这些文件中的每一个都包含一个指向提交的哈希:

    $ cat .git/refs/remotes/origin/master
    d895cb1af15c04c522a25c79cc429076987c089b
    

    这些都是git内部存储机制,独立于工作目录工作。通过执行以下操作:

    git reset --hard origin/master
    

    git 会将当前分支指向与 origin/master 指向的相同的哈希值。然后它会强制更改工作目录以匹配该哈希处的文件结构/内容。

    要在工作中看到这一点,请继续尝试以下操作:

    git checkout -b test-branch
    # see current commit and diff by the following
    git show HEAD
    # now point to another location
    git reset --hard <remote>/<branch>
    # see the changes again
    git show HEAD
    

    【讨论】:

    • 从最近批准的编辑开始添加大量警告,就像指出已经提到的那样:“然后 [git] 强制更改工作目录以匹配文件结构/内容哈希。”但我猜这还不够明确。
    【解决方案2】:

    已解决,使用以下命令集:

    git reset --hard
    git pull --rebase
    git rebase --skip
    git pull
    

    诀窍是 rebase 更改...我们在 rebase 一个微不足道的提交时遇到了一些麻烦,因此我们只是使用 git rebase --skip 跳过它(在复制文件之后)。

    【讨论】:

      【解决方案3】:

      我很幸运

      git checkout -f <branch>
      

      在类似的情况下。

      http://www.kernel.org/pub//software/scm/git/docs/git-checkout.html

      Undo delete in GIT

      【讨论】:

        【解决方案4】:

        如果您在运行 git fetch 后碰巧遇到此问题,然后由于合并冲突(修改/未合并的文件),git 不允许您运行 git pull,并且让您更加沮丧,它不会在文件中显示任何冲突标记,因为它尚未合并)。如果您不想丢失您的工作,您可以执行以下操作。

        暂存文件。

        $ git add filename
        

        然后存储本地更改。

        $ git stash
        

        拉取并更新您的工作目录

        $ git pull
        

        恢复你本地修改过的文件(git会自动合并,否则解决)

        $ git stash pop
        

        希望它会有所帮助。

        【讨论】:

          【解决方案5】:

          即使您不想删除本地更改,也有解决方案。 只需修复未合并的文件(通过git addgit remove)。然后git pull

          【讨论】:

            【解决方案6】:

            假设您想丢弃所有更改,请首先检查git status 的输出。对于旁边显示“未合并”的任何文件,请运行 git add &lt;unmerged file&gt;。然后跟进git reset --hard。这将消除除未跟踪文件之外的任何本地更改。

            【讨论】:

            • 哦,对了。它可能不会说“未合并”。它也可以说“都修改过”或者可能是一两件事。 git status 的输出是什么?
            • 发布后我告诉团队成员按照 git 的建议尝试 git rebase --abortgit pull --rebase
            【解决方案7】:

            我已经解决了 git 在本地删除未合并的文件。

            $ git rm <the unmerged file name>
            $ git reset --hard
            $ git pull --rebase
            $ git rebase --skip
            $ git pull
            Already up-to-date.
            

            当我之后发送 git commit 时:

            $ git commit . -m "my send commit"
            On branch master
            Your branch is up-to-date with 'origin/master'.
            nothing to commit, working directory clean
            

            【讨论】:

              【解决方案8】:

              瑞恩斯图尔特的答案几乎就在那里。如果您实际上不想删除本地更改,可以使用一个工作流程来合并:

              • 运行git status。它会给你一个未合并文件的列表。
              • 合并它们(手动等)
              • 运行git commit

              Git 会将只是合并提交到一个新的提交中。 (在我的情况下,我在磁盘上添加了额外的文件,这些文件没有归入该提交。)

              Git 然后认为合并成功并允许您继续前进。

              【讨论】:

                【解决方案9】:

                尝试查找存在合并冲突的文件:

                git diff --name-status --diff-filter=U 
                

                解决文件冲突,而不是将这个文件添加到提交(即使文件被删除)

                git add path/to/file.name 
                

                之后,如果没有合并冲突文件,尝试提交。

                【讨论】:

                  猜你喜欢
                  • 2023-03-04
                  • 2015-07-10
                  • 1970-01-01
                  • 2019-10-09
                  • 2012-10-09
                  • 2022-01-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多