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

Tom*_*lle 195 git merge conflict git-merge-conflict

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

Bri*_*ell 325

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

最简单的是你正在进行相同的修订.在这种情况下,你"已经是最新的",没有任何反应.

另一种可能性是它们的修改只是你的后代,在这种情况下你默认会有一个"快进合并",你HEAD刚刚更新到他们的提交,没有合并发生(这可以被禁用,如果你真的想记录合并,使用--no-ff).

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

最后的可能性是存在真正的合并,并且存在冲突.在这种情况下,Git会做尽可能多的合并,因为它可以,并产生冲突标记(文件<<<<<<<,=======>>>>>>>)在你的工作拷贝.在索引(也称为"临时区域"; git add在提交文件之前存储文件的位置)中,每个文件的3个版本都会有冲突; 您正在合并的两个分支的祖先中存在该文件的原始版本,来自HEAD(您的合并方)的版本以及远程分支的版本.

为了解决冲突,您可以编辑工作副本中的文件,删除冲突标记并修复代码以使其正常工作.或者,您可以使用git checkout --ours或从合并的一侧或另一侧查看版本git checkout --theirs.一旦你把文件放到你想要的状态,你就表明你已经完成了合并文件并准备好使用它git add,然后你可以提交合并git commit.

  • 您可能应该注意到`git add --all`将所有文件添加到存储库中,因此除非您的`.gitignore`模式处于完美状态,否则这可能会添加比预期更多的文件.`git add -u`可能更适合这种情况,你不太可能对解析合并时不想添加的跟踪文件进行编辑. (7认同)
  • 你需要做`git checkout --ours .`.`.`很重要; 传入文件名(在这种情况下,整个目录)选择`checkout`的两种不同操作模式,一种切换分支,另一种将文件从索引移动到工作副本.我同意,这很令人困惑.您也可以执行`git checkout --ours - <filename>`一次检出单个文件. (2认同)

Von*_*onC 23

确保冲突起源:如果是a的结果git merge,请参阅Brian Campbell回答.

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

git checkout --theirs -- .
Run Code Online (Sandbox Code Playgroud)

请参阅" 为什么所指的' ours’和' theirs’逆转" "怎么看ourstheirs一个重订期间被交换(因为上游分支被检出).