98

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

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,我会收到错误“无法拉取,未合并的更改......”

4

9 回答 9

218

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

git fetch origin
git reset --hard origin/master

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

警告:如评论中所述,这将丢弃您的本地更改用 origin 上的任何内容覆盖

或者您可以使用管道命令来执行基本相同的操作:

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
于 2013-02-28T06:51:05.853 回答
7

我很幸运

git checkout -f <branch>

在类似的情况下。

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

在 GIT 中撤消删除

于 2013-02-28T03:52:17.890 回答
7

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

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

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

于 2013-02-28T04:24:51.103 回答
5

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

暂存文件。

$ git add filename

然后存储本地更改。

$ git stash

拉取并更新您的工作目录

$ git pull

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

$ git stash pop

希望它会有所帮助。

于 2017-12-18T10:25:16.077 回答
2

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

于 2018-12-10T22:17:47.113 回答
1

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

于 2013-02-28T03:58:23.550 回答
1

我用 git remove the unmerged file 在本地解决了。

$ 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
于 2016-06-01T05:55:07.310 回答
0

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

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

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

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

于 2017-12-04T17:43:16.293 回答
0

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

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

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

git add path/to/file.name 

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

于 2021-12-16T10:38:45.743 回答