git rm文件后; commit - 如何从远程分支返回文件?

时间:2011-01-06 09:35:47

标签: git git-add git-rm

我正在拉入我的.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:致命:你还没有完成你的合并(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我要替换的文件?..

1 个答案:

答案 0 :(得分: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用于合并的“您的”。