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

时间:2008-11-10 15:03:45

标签: git merge-conflict-resolution

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

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

在我的笔记本电脑上,我使用git pull brian master将更改提取到我的本地版本。除了主要的InDesign文档之外,一切都很好 - 这显示为冲突。

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

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

有人能指出我正确的方向吗?

11 个答案:

答案 0 :(得分:779)

对于此类案件,

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

$ git checkout --theirs -- path/to/conflicted-file.txt

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

$ git checkout --ours -- path/to/conflicted-file.txt

答案 1 :(得分:142)

您必须手动解决冲突(复制文件)然后提交文件(无论您是复制文件还是使用本地版本),如此

git commit -a -m "Fix merge conflict in test.foo"

Git通常在合并后自动提交,但是当它检测到冲突时它本身无法解决,它会应用它想出的所有补丁,剩下的就是你手动解析和提交。 Git Merge Man PageGit-SVN Crash Coursethis博客条目可能会说明它应该如何运作。

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

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

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

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

答案 2 :(得分:109)

您也可以使用

解决此问题
git mergetool

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

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

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

答案 3 :(得分:16)

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

git commit -a

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

git checkout otherbranch theconflictedfile
git commit -a

Explained in more detail

答案 4 :(得分:9)

mipadi的答案对我来说不起作用,我需要这样做:

  

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

或者,为了保持合并版本:

  

git checkout - 他们的路径/到/ file.bin

然后

  

git add path / to / file.bin

然后我就能做到" git mergetool"再次继续下一场冲突。

答案 5 :(得分:5)

来自git checkout docs

  

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

     

<强> --ours
  的 --theirs
  检查索引中的路径时,请查看阶段#2(ours)或#3(theirs)以了解未合并路径。

     

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

答案 6 :(得分:4)

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

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

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

答案 7 :(得分:3)

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

% git fetch

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

% git checkout FETCH_HEAD stuff/to/update

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

答案 8 :(得分:1)

我遇到过两种策略,用于在Windows上使用Git管理二进制文件的差异/合并。

  1. Tortoise git允许您根据文件扩展名为不同的文件类型配置差异/合并工具。见2.35.4.3。差异/合并高级设置http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html。当然,这种策略依赖于合适的差异/合并工具。

  2. 使用git属性,您可以指定一个工具/命令将二进制文件转换为文本,然后让您的默认差异/合并工具执行此操作。见http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes。本文甚至给出了使用元数据来区分图像的示例。

  3. 我有两种策略都可以使用软件模型的二进制文件,但我们配备了togise git,因为配置很简单。

答案 9 :(得分:0)

我使用Git Workflow for Excel-https://www.xltrail.com/blog/git-workflow-for-excel应用程序来解决大多数与二进制文件有关的合并问题。这款开源应用程序可帮助我有效地解决问题,而无需花费太多时间,并且让我选择合适的文件版本而不会造成任何混乱。

答案 10 :(得分:0)

我的情况似乎是一个错误。...使用git 2.21.0

我拉了一下...它抱怨二进制文件:

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

然后,这里的任何答案都不会导致任何有意义的输出。

如果我查看我现在拥有的文件...那是我编辑的文件。如果我这样做:

git checkout --theirs -- <path>
git checkout --ours -- <path>

我得到输出:

Updated 0 paths from the index

,我仍然拥有该文件的版本。如果我先rm然后结帐,它会改为1,但仍会提供我文件的版本。

git mergetool说

No files need merging

和git status说

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

一个选择是undo the commit ...,但是我很不幸,而且我提交了很多东西,而这个不好的是第一个。我不想浪费时间重复。

所以要解决这种疯狂:

我刚跑

git commit

这会丢失远程版本,并可能浪费一些空间来存储额外的二进制文件...然后

git checkout <commit where the remote version exists> <path>

这给了我远程版本

然后再次编辑文件...,然后提交并推送,这再次可能意味着浪费二进制文件的另一个副本。