从干净的目录进行git pull时出现合并冲突

21

我在一个干净的工作目录中从我的上游进行了 git pull ,但它出现了合并冲突。我花了大约一个小时手动重置它们,以为我弄错了什么,但这种情况再次发生了。

这是 git 的 bug 吗? 我对此知之甚少,所以我完全愿意接受这是我自己造成的。

这是我的缩略输出(大约发生在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失败:您有未暂存的更改。 Git状态:没有要提交的内容(工作目录干净),它似乎最相关,但是回答并不令人满意。

我怎样才能在不删除整个存储库并创建新克隆的情况下解决这个问题?

3个回答

30

你的工作目录可能很干净,但是你在本地做了一个或多个提交,这些提交不在服务器上。当你执行pull命令时,git会尝试将这些本地提交与服务器上的提交合并,但由于它们修改了相同的代码区域,所以会发生冲突。

你的选择基本上可以归结为以下三种:

  1. 解决冲突:告诉git如何处理冲突的更改,并继续进行。
  2. 使用git pull --rebase进行变基并解决冲突,这与第一种方法差别不大,但如果你的更改从未发布过(即从未被推送过),则这可能会使历史记录更加清晰(线性)。
  3. 放弃本地更改并使用远程版本,使用git reset --hard remotename/remotebranch。这将丢失你已经提交但尚未推送到其他地方的任何更改。

3
我在那个分支上没有任何本地提交,但是 #3 起了作用,谢谢。 - bahamat
4
有用的答案,帮助我摆脱了困境。在我的情况下,我在一个分支上运行了 'git rebase master'。然后我遇到了像上面描述的合并冲突。通过使用 'git merge --abort' 然后你的 'git pull --rebase' 解决了问题。谢谢! - wndxlori
解决了我的第三个问题。我会记住这个命令 +1 - kapitan
经过多年使用git的经验,我回顾了这个线程,我认为发生的事情是在我克隆之后,所有者重置并强制推送了一些提交,因此产生了冲突。将重置到远程会丢弃他们覆盖的提交。 - bahamat
我喜欢第三个选项。只活一次。 - heyitsalec

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

0

补充 bdonlan 的答案,当你在本地仓库有一些提交时,但远程仓库比你的本地提交文件进展更快时,就会出现这种情况。

我曾经因为这些冲突而无法推送或拉取而卡住了。

尝试使用 'rebase' 或 'reset --hard' 都没有成功。

唯一解决方法是回退一个提交并进行拉取;

按照以下步骤操作:

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

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

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