Git拉取不可能,存在未合并的文件。

106

我已经阅读了所有相关的问题,似乎以下任何一种方法都没有起作用:

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,则会出现错误"无法拉取,存在未合并的更改..."。
9个回答

236

假设远程仓库为 origin,分支为 master,并且你已经检出了 master 分支,可以尝试以下操作:

git fetch origin
git reset --hard origin/master

这基本上只是将当前分支指向远程分支的HEAD警告:如评论所述,这将丢弃您的本地更改覆盖原始内容
或者,您可以使用管道命令来实现基本相同的操作:
git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

编辑:我想简要解释一下为什么这个方法有效。

.git 文件夹可以保存任意数量的存储库提交。由于提交哈希实际上是提交内容的验证方法,而不仅仅是随机生成的值,因此它用于在存储库之间匹配提交集。

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

$ 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

2
从最近批准的编辑中添加了大量警告,就像指出它已经提到的那样:“然后[git]强制更改工作目录以匹配该哈希处的文件结构/内容。”但是我猜那还不够明确。 - Trevor Norris

10

9

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

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

技巧在于变基更改...我们在变基一个微不足道的提交时遇到了一些麻烦,所以我们使用git rebase --skip(在复制文件后)简单地跳过了它。


6
如果您在运行git fetch后遇到问题,并且由于合并冲突(两个修改/未合并文件),git不允许您运行git pull,如果您不希望丢失工作,可以执行以下操作。另外,令人沮丧的是,它不会在文件中显示任何冲突标记,因为它尚未合并。
请将该文件暂存。
$ git add filename

然后将本地更改暂存。

$ git stash

拉取并更新您的工作目录

$ git pull

恢复本地修改的文件(如果git能够自动合并,则会进行自动合并,否则需要手动解决冲突)。
$ git stash pop

希望这能帮到你。


2

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


1
我使用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

1
假设您想放弃所有更改,首先检查git status的输出。对于任何文件旁边标有“未合并”的文件,运行git add <未合并的文件>。然后跟随git reset --hard。这将除了未跟踪的文件外,清除任何本地更改。

哦,对了。它可能不会说“未合并”。它也可能说“两个修改”或者其他一两个东西。git status的输出是什么? - Ryan Stewart
发布后,我告诉团队成员尝试执行以下命令:git rebase --abortgit pull --rebase,根据git的建议。 - Christian Stewart

0

尝试查找具有合并冲突的文件:

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

解决文件冲突,然后将此文件添加到提交中(即使文件已被删除)

git add path/to/file.name 

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


0

Ryan Stewart的回答几乎正确。在您实际上想删除本地更改的情况下,有一个工作流程可以用于合并:

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

Git将仅合并到新提交中。(在我的情况下,我在磁盘上有其他添加的文件,这些文件没有被合并到该提交中。)

然后,Git认为合并成功,并允许您向前移动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接