8

我正在拉入我的 .emacs 目录,并遇到以下冲突:

CONFLICT (add/add): Merge conflict in elisp/dired-details+.el

Git状态显示如下:

 Unmerged paths:
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #  both added:         elisp/dired-details+.el

好的,所以 git 建议使用git rm. 我想用我正在拉入的文件完全替换本地文件,所以这似乎有点明智......所以我做了git rm elisp/dired-details+.elgit merge. 我得到:

git merge: fatal: 你还没有结束你的合并(MERGE_HEAD 存在)。请在合并之前提交您的更改。

好的,好的:git commit -a -m "ugh merge conflicts"; git pull origin master.

现在一切都很好,除了我失踪了dired-details+.el,我有点困惑,我想知道以下问题的答案:

  1. 如何撤消git-rm并从远程分支获取该文件?..
  2. 为什么首先会发生冲突?..这里发生了add/add什么?..
  3. 我应该怎么做而不是git-rm'ing我想要替换的文件?..
4

1 回答 1

9

首先,使用git reset --hard HEAD^. 请注意,这将清除最后一次提交并将您的工作副本重置为上一次提交的状态,因此在执行此操作之前请注意了解这将做什么。gitk可以帮助可视化这一点。

其次,git rm不符合您的预期。当您遇到合并冲突时,您正在查看处于半合并状态的文件,该文件包含冲突标记,以便您解决冲突。此时,您被要求将工作副本修复为您希望最终合并提交看起来像的状态。通过删除文件,您告诉 git 您根本不希望该文件出现,这不是您想要的。

在此阶段您需要做的是将工作副本中的冲突文件更新为您想要保留的版本。通常这是通过检查冲突标记并相应地调整文件来完成的。在您的情况下,如果您确定要从要合并的分支中获得副本,则可以使用它git show :3:elisp/dired-details+.el > elisp/dired-details+.el来执行此操作。然后git add elisp/dired-details+.el告诉 git 你已经解决了该文件中的冲突,然后git commit完成。

这里,git show :3:...是从 MERGE_HEAD 请求文件的版本。如果您需要不同的版本,您也可以使用1共同祖先或2合并的“您的”一侧。

于 2011-01-06T10:46:19.220 回答