解决与二进制文件的Git冲突

Kev*_*son 444 git merge-conflict-resolution

我一直在Windows上使用Git(msysgit)来跟踪我一直在做的一些设计工作的变化.

今天我一直在使用不同的PC(带远程仓库brian),现在我正在尝试将今天完成的编辑合并到我笔记本电脑上的常规本地版本中.

在我的笔记本电脑上,我习惯git pull brian master将更改添加到我的本地版本中.除了主要的InDesign文档之外,一切都很好 - 这显示为冲突.

PC(brian)上的版本是我想要保留的最新版本,但我不知道哪些命令告诉repo使用这个版本.

我试着将文件直接复制到我的笔记本电脑上,但这似乎打破了整个合并过程.

谁能指出我正确的方向?

mip*_*adi 816

git checkout对此类案件接受--ours--theirs选择.因此,如果您有合并冲突,并且您知道您只想要合并的分支中的文件,则可以执行以下操作:

$ git checkout --theirs -- path/to/conflicted-file.txt
Run Code Online (Sandbox Code Playgroud)

使用该版本的文件.同样,如果您知道您想要您的版本(不是合并的版本),您可以使用

$ git checkout --ours -- path/to/conflicted-file.txt
Run Code Online (Sandbox Code Playgroud)

  • 在使用--ours之前,我必须在文件上运行'git reset HEAD path/to/conflicted-file.txt',否则它似乎没有任何效果. (45认同)
  • 注意:你仍然想做"git add*conflicted-file.txt*"和"git commit".很简单,当我尝试它时,提交消息预先填充了有关冲突的注释. (15认同)
  • 在解释这个主题时总是缺少几个要点.在进行rebase而不是merge时,` - their`和`--ours`的含义是交换的,即--their ==当前签出的分支,而--ours是分支,通常是远程分支或路径spec你试图合并到当前分支.`[space] - [space]`选项消除了分支名称和路径规范之间的路径规范,它们恰好存在于同一名称(例如,现有分支名称为"abc",目录存在称为"abc") . (12认同)
  • @Zitrax运行`git checkout --ours`后你有没有把文件区分开来?手册页建议(恕我直言)checkout --ours/ - 他们将从"修改后的两个需要合并"列表中删除更改并将其添加到索引中,我认为这是不正确的.我相信你需要在结账后运行`git add`. (6认同)
  • “您正在合并的分支”的措辞与“您正在合并的分支”危险地接近,我认为去掉介词会更好:“您正在合并的分支”,这也将反映 git 命令(即`git merge branch_name`)。 (4认同)

Vol*_*lkA 144

你必须手动解决冲突(复制文件)然后提交文件(无论你是复制它还是使用本地版本),像这样

git commit -a -m "Fix merge conflict in test.foo"
Run Code Online (Sandbox Code Playgroud)

Git通常在合并后自动提交,但是当它检测到冲突时它本身无法解决,它会应用它想出的所有补丁,剩下的就是让你手动解析和提交.在Git的合并手册页中,针对Git SVN速成班博客条目可能揭示它是如何工作的一些情况.

编辑:请参阅下面的帖子,您实际上不必自己复制文件,但可以使用

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt
Run Code Online (Sandbox Code Playgroud)

选择所需文件的版本.只有在需要两种版本的混合时,才需要复制/编辑文件.

请将mipadis答案标记为正确答案.


Rob*_*obM 120

你也可以克服这个问题

git mergetool
Run Code Online (Sandbox Code Playgroud)

这会导致git创建冲突二进制文件的本地副本并在其上生成默认编辑器:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

显然,您无法在文本编辑器中有用地编辑二进制文件.而是{conflicted}.REMOTE{conflicted}不关闭编辑器的情况下复制新文件.然后,当您关闭时,编辑器git将看到未修饰的工作副本已更改,并且您的合并冲突以常规方式解决.

  • 这个答案完全值得更多的赞成. (17认同)
  • 如果文件很大或你根本不想冒险在文本编辑器中打开二进制文件,你可以在mergetool提示符下点击ctrl + c("点击返回以启动合并解析工具")并且git将离开额外的文件到位.然后您可以修改它们或将它们合并到外部工具中(对于像LibreOffice/OpenOffice/MSWord这样的二进制文档格式很有用)并将结果保存回原始文件名.要通知git冲突已解决,`git add`原始文件名,然后您就可以完成合并提交. (8认同)

Jos*_*gan 16

要通过将版本保留在当前分支中来解决(忽略要合并的分支中的版本),只需添加并提交文件:

git commit -a
Run Code Online (Sandbox Code Playgroud)

要通过使用您要合并的分支中的版本覆盖当前分支中的版本来解决,您需要首先将该版本检索到工作目录中,然后添加/提交它:

git checkout otherbranch theconflictedfile
git commit -a
Run Code Online (Sandbox Code Playgroud)

更详细地解释


kri*_*ris 10

mipadi的回答对我来说不太有用,我需要这样做:

git checkout --ours path/to/file.bin

或者,保持合并版本:

git checkout --theirs path/to/file.bin

然后

git add path/to/file.bin

然后我能够再次执行"git mergetool"并继续下一次冲突.


小智 6

来自git checkout文档

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
检查索引中的路径时,请检查阶段#2(ours)或#3(theirs)是否有未合并路径.

由于先前失败的合并,索引可能包含未合并的条目.默认情况下,如果您尝试从索引中检出此类条目,则结帐操作将失败,并且不会检出任何内容.使用-f将忽略这些未合并的条目.可以使用--ours或从索引中检出合并的特定一侧的内容--theirs.使用时-m,可以放弃对工作树文件所做的更改以重新创建原始冲突的合并结果.


Bri*_*ter 5

我遇到了一个类似的问题(想要提取包含一些在合并时导致冲突的二进制文件的提交),但遇到了一个可以完全使用 git 完成的不同解决方案(即不必手动复制文件)。我想我会把它包括在这里,所以至少我下次需要它的时候能记住它。:) 步骤如下:

% git fetch
Run Code Online (Sandbox Code Playgroud)

这将从远程存储库中获取最新提交(您可能需要指定远程分支名称,具体取决于您的设置),但不会尝试合并它们。它记录了 FETCH_HEAD 中的提交

% git checkout FETCH_HEAD stuff/to/update
Run Code Online (Sandbox Code Playgroud)

这需要我想要的二进制文件的副本,并使用从远程分支获取的版本覆盖工作树中的内容。git 不会尝试进行任何合并,因此您最终会得到来自远程分支的二进制文件的精确副本。完成后,您可以像往常一样添加/提交新副本。


dav*_*lee 5

此过程用于解决向Github提交拉取请求后的二进制文件冲突:

  1. 因此,在Github上,您发现您的拉取请求在二进制文件上存在冲突。
  2. 现在回到本地计算机上的同一个git分支。
  3. 您(a)重新制作/重新生成该二进制文件,并且(b)将生成的二进制文件提交到同一git分支。
  4. 然后,您再次将此同一个git分支推送到Github。

在Github上,应您的请求,冲突应该消失。