首页 文章

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

提问于
浏览
391

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

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

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

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

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

谁能指出我正确的方向?

9 回答

  • 104

    你也可以克服这个问题

    git mergetool
    

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

    • {conflicted}.HEAD

    • {conflicted}

    • {conflicted}.REMOTE

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

  • 13

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

    git commit -a
    

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

    git checkout otherbranch theconflictedfile
    git commit -a
    

    Explained in more detail

  • 1

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

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

    或者,保持合并版本:

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

    然后

    git add path / to / file.bin

    然后我又能够做“git mergetool”并继续下一次冲突 .

  • 5

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

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

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

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

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

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

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

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

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

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

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

  • 3

    来自git checkout docs

    git checkout [-f | --ours | --theirs | -m | --conflict = <style>] [<tree-ish>] [ - ] <paths> ... --ours --thehis When检查索引的路径,检查第2阶段(我们的)或#3(他们的)未合并的路径 . 由于先前失败的合并,索引可能包含未合并的条目 . 默认情况下,如果您尝试从索引中检出此类条目,则结帐操作将失败,并且不会检出任何内容 . 使用-f将忽略这些未合并的条目 . 可以使用--ours或 - 从索引中检查合并的特定一侧的内容 . 使用-m,可以放弃对工作树文件所做的更改,以重新创建原始冲突的合并结果 .

  • 139

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

    % git fetch
    

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

    % git checkout FETCH_HEAD stuff/to/update
    

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

  • 741

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

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

  • 1

    如果二进制文件是 something more than a dll 或类似于图像或混合文件的东西(并且您不需要删除/选择一个文件或另一个文件),那么真正的合并将是:

    我建议搜索面向你的二进制文件的diff工具,例如,有一些免费的图像文件

    并比较它们 .

    如果没有用于比较文件的差异工具,那么如果你有bin文件的 original generator (即, there exist an editor 为它...就像blender 3d一样,你可以手动检查这些文件,也可以看到日志,并询问对方应该包括的内容)并使用https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge输出文件

    $ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

相关问题