527

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

今天我一直在另一台 PC 上工作(带有远程仓库brian),我现在正试图将今天完成的编辑合并回我笔记本电脑上的常规本地版本。

在我的笔记本电脑上,我习惯于git pull brian master将更改拉入我的本地版本。除了主要的 InDesign 文档外,一切都很好——这显示为冲突。

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

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

谁能指出我正确的方向?

4

12 回答 12

972

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

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

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

$ git checkout --ours -- path/to/conflicted-file.txt
于 2010-01-29T17:48:13.670 回答
155

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

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

Git 通常会在合并后自动提交,但是当它检测到无法自行解决的冲突时,它会应用它发现的所有补丁,并将其余部分留给您手动解决和提交。Git Merge Man PageGit-SVN Crash Course或此博客条目可能会阐明它应该如何工作

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

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

选择所需文件的版本。仅当您想要混合使用两个版本时,才需要复制/编辑文件。

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

于 2008-11-10T15:49:46.670 回答
126

您也可以通过以下方式解决此问题

git mergetool

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

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

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

于 2009-08-24T11:31:23.227 回答
20

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

git commit -a

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

git checkout otherbranch theconflictedfile
git commit -a

解释得更详细

于 2010-01-29T17:43:30.793 回答
14

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

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

或者,要保留正在合并的版本:

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

然后

git 添加路径/到/file.bin

然后我能够再次执行“git mergetool”并继续下一个冲突。

于 2014-11-24T02:45:01.247 回答
6

git checkout文档

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

--ours
--theirs
从索引中检出路径时,请检出阶段 #2 ( ours) 或 #3 ( theirs) 以获取未合并的路径。

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

于 2013-05-30T01:07:13.673 回答
5

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

% git fetch

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

% git checkout FETCH_HEAD stuff/to/update

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

于 2009-07-21T22:29:34.150 回答
4

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

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

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

于 2019-03-27T03:54:33.830 回答
1

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

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

  2. 使用 git 属性,您可以指定一个工具/命令来将二进制文件转换为文本,然后让您的默认 diff/merge 工具来做这件事。请参阅http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes。这篇文章甚至给出了一个使用元数据来区分图像的例子。

我有两种策略来处理软件模型的二进制文件,但我们使用了 tortoise git,因为配置很简单。

于 2014-11-27T15:46:40.420 回答
1

如果二进制文件不仅仅是 dll或可以像图像或混合文件一样直接编辑的东西(并且您不需要丢弃/选择一个文件或另一个),那么真正的合并将类似于:

我建议搜索一个针对你的二进制文件的差异工具,例如,有一些免费的图像文件

并比较它们。

如果没有用于比较文件的 diff 工具,那么如果您有 bin 文件的原始生成器(也就是说,存在用于它的编辑器...例如 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
于 2015-08-13T21:03:13.720 回答
0

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

于 2019-03-19T18:55:04.320 回答
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)

一种选择是撤消提交......但我很不幸,我有很多提交,而这个糟糕的提交是第一个。我不想浪费时间重复这一点。

所以要解决这个疯狂:

我刚跑

git commit

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

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

这给了我远程版本

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

于 2019-04-11T08:55:38.013 回答