如何丢弃远程更改并将文件标记为“已解决”?

时间:2010-01-15 18:28:00

标签: git merge conflict git-merge-conflict

我有一些本地文件,我从远程分支拉,有冲突。我知道我想保留本地更改并忽略导致冲突的远程更改。是否有一个命令可以用来实际上说“将所有冲突标记为已解决,使用本地”?

2 个答案:

答案 0 :(得分:316)

git checkout--ours选项可以查看您在本地拥有的文件的版本(而不是--theirs,这是您提取的版本)。您可以将.传递给git checkout,告诉它检查树中的所有内容。然后,您需要将冲突标记为已解决,您可以使用git add执行此操作,并在完成后提交您的工作:

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

请注意.命令中的git checkout。这非常重要,容易错过。 git checkout有两种模式;一个用于切换分支的文件,另一个用于将文件从索引中检入工作副本(有时将它们从另一个修订版中拉入索引)。它区分的方式是你是否通过了文件名;如果你没有传入一个文件名,它会尝试切换分支(虽然如果你没有传入一个分支,它只会尝试再次检查当前分支),但是如果有修改过的文件则拒绝这样做这会产生影响。因此,如果您想要覆盖现有文件的行为,则需要传入.或文件名,以便从git checkout获取第二个行为。

在传递文件名时,使用--(例如git checkout --ours -- <filename>)来抵消它也是一个好习惯。如果你不这样做,并且文件名恰好与分支或标记的名称相匹配,Git会认为你要检查该修订版本,而不是检查该文件名,因此使用{的第一种形式{1}}命令。

我将详细介绍冲突和merging在Git中的工作方式。当你合并其他人的代码时(在拉动期间也会发生这种情况;拉动本质上是一次提取然后合并),几乎没有可能的情况。

最简单的是你正在进行同样的修改。在这种情况下,你“已经是最新的”,没有任何反应。

另一种可能性是他们的修订只是你的后代,在这种情况下,你默认会有一个“快进合并”,你的checkout只是更新到他们的提交,没有合并正在发生(如果您真的想要使用HEAD记录合并,则可以禁用此功能)。

然后,您将进入实际需要合并两个修订版的情况。在这种情况下,有两种可能的结果。一个是合并干净;所有更改都在不同的文件中,或者在相同的文件中,但相隔足够远,以便可以毫无问题地应用这两组更改。默认情况下,当发生干净合并时,它会自动提交,但如果您需要事先编辑它,可以使用--no-ff禁用它(例如,如果您将函数--no-commit重命名为foo并且其他人添加了调用bar的新代码,它会干净地合并,但会生成一个损坏的树,因此您可能希望在合并提交中清除它,以避免任何损坏的提交)

最后的可能性是存在真正的合并,并且存在冲突。在这种情况下,Git将尽可能多地执行合并,并在工作副本中生成带有冲突标记(foo<<<<<<<=======)的文件。在索引(也称为“临时区域”;在提交文件之前由>>>>>>>存储文件的位置)中,每个文件有3个版本存在冲突;您正在合并的两个分支的祖先中存在该文件的原始版本,git add(您的合并方)的版本以及远程分支的版本。

为了解决冲突,您可以编辑工作副本中的文件,删除冲突标记并修复代码以使其正常工作。或者,您可以使用HEADgit checkout --ours从合并的一侧或另一侧查看版本。将文件置于所需状态后,表明已完成合并文件,并且已准备好使用git checkout --theirs提交,然后您可以使用git add提交合并。 / p>

答案 1 :(得分:20)

确保冲突起源:如果是git merge的结果,请参阅Brian Campbellanswer

但如果是git rebase的结果,为了放弃远程(他们的)更改并使用本地更改,您必须执行:

git checkout --theirs -- .

请参阅“Why is the meaning of “ours” and “theirs” reversed"”,了解在rebase期间如何交换ourstheirs(因为已检出upstream分支)。