无法进行Git Pull,合并文件


89

我已经阅读了所有类似的问题;似乎以下任何一项均无效:

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,我将收到错误消息“无法拉出,未合并的更改...”。

Answers:


198

假设远程为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

1
在最近批准的编辑中,在开头添加了警告,就像要指出的那样:“然后[git]会强行更改工作目录以匹配该哈希中的文件结构/内容。” 但是,这还不够明确。
Trevor Norris 2014年


5

使用以下命令集解决:

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

诀窍是重新设置更改的基础...在重新构建一个琐碎的提交时遇到了一些麻烦,因此我们仅使用git rebase --skip(复制了文件之后)就跳过了它。


2

如果您曾经在运行a之后碰巧遇到此问题git fetch,然后gitgit pull由于合并冲突而不允许您运行(无论是已修改的文件还是未合并的文件,都会使您更加沮丧,它不会在其中显示任何冲突标记)文件,因为它尚未合并)。如果您不想丢失工作,可以执行以下操作。

暂存文件。

$ git add filename

然后存储本地更改。

$ git stash

拉并更新您的工作目录

$ git pull

恢复本地修改的文件(如果可以,git将自动合并,否则将解决)

$ git stash pop

希望它会有所帮助。


2

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


1

假设您想放弃所做的任何更改,请首先检查的输出git status。对于任何旁边显示“ unmerged”的文件,请运行git add <unmerged file>。然后继续git reset --hard。除了未跟踪的文件外,这将消除所有本地更改。


啊对。它可能不会说“未合并”。它也可以说“两者都修改了”,或者可能是另外一两个东西。输出是git status什么?
瑞安·斯图尔特

发布此内容后,我要告诉团队成员尝试git rebase --abortgit pull --rebase按照git的建议
Christian Stewart

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

0

瑞安·斯图尔特的答案就在那里。在你实际的情况并不想删除你的本地修改,还有就是你可以用它来合并工作流程:

  • 运行git status。它将为您提供未合并文件的列表。
  • 合并它们(手动等)
  • git commit

Git只会将合并提交到新的提交中。(就我而言,我在磁盘上还有其他添加的文件,这些文件没有集中到该提交中。)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.