我有一些本地文件,从远程分支拉取后出现了冲突。我想保留本地修改并忽略导致冲突的远程修改。是否有一条命令可以实现“标记所有冲突已解决,使用本地文件”的效果?
我有一些本地文件,从远程分支拉取后出现了冲突。我想保留本地修改并忽略导致冲突的远程修改。是否有一条命令可以实现“标记所有冲突已解决,使用本地文件”的效果?
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将认为您要检查该修订版本,而不是检查该文件名,因此使用checkout
命令的第一种形式。最简单的情况是你们在同一个版本,这时候你已经"更新到最新"了,什么也不会发生。
另一种可能是他们的版本只是你的后代,在这种情况下,你将默认进行"快进合并",即你的HEAD
只是更新到他们的提交,没有进行合并(如果你真的想记录合并,则可以使用--no-ff
来禁用)。
然后你会遇到需要合并两个版本的情况。在这种情况下,有两种可能的结果。一种是干净地合并,所有更改都在不同的文件中,或者在相同的文件中但足够远,以便两组更改都可以无问题地应用。默认情况下,当进行干净的合并时,它会自动提交,但如果需要事先编辑它(例如,如果您将函数foo
重命名为bar
,而其他人添加了调用foo
的新代码,则会干净地合并,但产生一个损坏的树,因此您可能需要在合并提交的过程中清理它,以避免出现任何损坏的提交)。
<<<<<<<
、=======
和>>>>>>>
)的文件。在索引中(也称为“暂存区”;在提交之前使用git add
存储文件的地方),您将拥有每个有冲突的文件的3个版本;存在于两个合并分支祖先的原始文件版本,来自HEAD
(合并的一方)的版本以及来自远程分支的版本。git checkout --ours
或git checkout --theirs
检出一个合并双方的版本。一旦您将文件放入所需状态,您可以使用git add
指示已完成文件合并并准备好提交,然后可以使用git commit
提交合并。git add --all
将所有文件添加到仓库中,因此除非您的 .gitignore
模式完美无误,否则可能会添加更多文件。在解决合并时,git add -u
可能更适合此情况,因为您不太可能对不想添加的已跟踪的文件进行编辑。 - CB Baileygit checkout --ours .
。注意,.
是很重要的;如果传入一个文件名(在这种情况下是整个目录),则会选择 checkout
的两种不同操作模式之一,一种是切换分支,另一种是将文件从索引移动到工作副本。我同意,这非常令人困惑。你也可以执行 git checkout --ours -- <filename>
逐个检出单个文件。 - Brian Campbellours
和theirs
是相反的,与您可能想的不同。 - ErikE请确认冲突的起源:如果这是由于 git merge
引起的,请参见Brian Campbell的答案。
但如果这是由于 git rebase
引起的,为了放弃远程(他们的)更改并使用本地更改,您需要执行以下操作:
git checkout --theirs -- .
查看"为什么“ours
”和“theirs
”的含义会被颠倒"",以了解在重新定义基础时如何交换ours
和theirs
(因为检出了上游分支)。