从存储冲突后强制检出文件

时间:2017-03-08 11:23:18

标签: git git-merge-conflict

我做了git stash save然后git pull git stash pop现在我遇到了冲突,我想将一个文件重置为与pull相同,以便从存储中删除更改(我有其他更改)在我想保留的其他文件中。

我试过了:

git checkout -f inst/app/server.R

但得到了警告:

warning: path 'inst/app/server.R' is unmerged

并且文件没有变化,我内部仍然有冲突标记。如何从上次提交中检出该文件?

1 个答案:

答案 0 :(得分:1)

TL; DR:听起来你想要git checkout --ours inst/app/server.R

您正处于冲突合并的中间,因此有两个"最后一次提交" s。一个是你的HEAD(当前)提交。请注意,您当前的提交是您在运行命令时所使用的提交,除非您的命令是git rebase,在这种情况下,事情会被交换:请参阅What is the precise meaning of "ours" and "theirs" in git?由于您说的是最后一个命令,合并冲突失败的是git stash apply 1 您当前的提交是您git pull为您成功git merge后所做的提交, 2 ,另一个提交是当前git stash stash-bag中名为stash@{0}(又名stash)的几个提交之一。

(任何冲突的合并中都会涉及第三次提交,这是合并基础。它可能不太重要了,这有点奇怪,但值得一提请注意,如果您在Git配置中将merge.conflictStyle设置为diff3,那么您将在{{1}之间获得一组额外的冲突标记|||||||的合并基础版本}和<<<<<<<部分向您显示&#34;我们的&#34;以及&#34;他们的&#34;版本。我希望保持>>>>>>>设置,因为它告诉我之前有什么 - 并且他们都以相互冲突的方式更改了文件。)

如果在没有命名特定提交或使用diff3git checkout选项的情况下运行--ours,Git会尝试从索引中获取版本。 (请记住,索引 - 也称为临时区域,有时也称为缓存 - 您正在构建下一次提交的位置。)但是,冲突的合并会在索引中留下每个冲突文件的三个版本。 Git并不知道要获得哪一个,所以它失败了。使用--theirs告诉--ours复制&#34;我们的&#34; (即HEAD)从索引到工作树的文件版本;使用git checkout告诉--theirs复制&#34;其他&#34; (即MERGE_HEAD)文件的版本。 3

当您从索引中提取其中一个版本时,会在索引中保留其他两个版本,即使文件处于未解析合并状态。 仔细检查内容以确保您拥有正确的版本,然后git checkout该文件以解决冲突。这将消除三个单独的索引版本,将工作树版本放入&#34;已解决的#34;索引槽(槽零)。

如果您需要重新创建合并冲突,可以使用git add(仅当 git checkout -m -- path 类似于选项时才需要--,但这是一个很好的习惯。这可以运行,直到您运行path来完成失败的合并。

一旦按照您想要的方式解决所有问题,请使用git commit完成合并。

1 您说git commit,但git stash pop只是一个捷径,意思是&#34;运行git stash pop然后,当且仅当成功时,运行git stash apply。&#34;由于应用步骤失败,因此您必须手动运行git stash drop,一旦您确信存储已干净地应用并已提交。

2 我建议避免git stash drop。它所做的就是为你运行另外两个Git命令:git pull,然后是git fetchgit merge,具体取决于你事先告诉Git的内容。最好分别运行这两个命令,以便:

  • 当一个人失败时,你知道什么是失败的;和
  • 您可以在检查git rebase提取的内容后选择合并或变种

使用git fetch并没有什么根本性的错误,只记得它真的git pull,你必须决定&#34;&#34;&#34;&#34;部分提前。如果你不挑选一个,Git会选择git fetch && git something,这可能是错误的默认值,但是Git首先做的就是2005年,因此无法改变。 : - )

3 没有git merge选项,但您可以使用gitrevisions syntax从索引--base访问它。您可以使用相同的语法来获取git checkout -- :1:path版本(索引条目#2)和--ours版本(#3),但它更容易记住{{1无论如何,还是--theirs

&#34;我们的&#34;版本有时被称为本地版本,以及&#34;他们的&#34;版本有时被称为远程版本,但我讨厌这些名称。 &#34;遥控&#34;特别是很容易混淆像--ours等遥控器和远程跟踪分支名称,如--theirs