解决与二进制文件的Git冲突
我一直在Windows上使用Git(msysgit)来跟踪我一直在做的一些devise工作的变化。
今天,我一直在使用不同的PC(使用远程repo brian
),现在我正试图将今天完成的编辑合并到笔记本电脑上的常规本地版本中。
在我的笔记本电脑上,我使用了git pull brian master
来将更改导入本地版本。 除了主要的InDesign文档之外,一切都很好 – 这显示为冲突。
PC上的版本( brian
)是我想要保留的最新版本,但是我不知道哪些命令告诉回购使用这个版本。
我试图直接将文件复制到我的笔记本电脑,但这似乎打破了整个合并过程。
任何人都可以指向正确的方向吗?
对于像这样的情况, git checkout
接受一个--ours
或者--theirs
选项。 所以,如果你有一个合并冲突,你知道你只是想从你正在合并的分支中的文件,你可以这样做:
$ git checkout --theirs -- path/to/conflicted-file.txt
使用该版本的文件。 同样,如果你知道你想要你的版本(不是合并的版本),你可以使用
$ git checkout --ours -- path/to/conflicted-file.txt
您必须手动解决冲突(复制文件),然后提交文件(无论是复制它还是使用本地版本),像这样
git commit -a -m "Fix merge conflict in test.foo"
合并后Git通常会自动提交,但是当它检测到冲突时,它不能自行解决,它会应用它想出来的所有补丁,剩下的则是手动parsing和提交。 Git合并人员页面 , Git-SVN崩溃课程或者这个博客文章可能会阐明它应该如何工作。
编辑:看到下面的post,你不必自己复制文件,但可以使用
git checkout --ours -- path/to/file.txt git checkout --theirs -- path/to/file.txt
select你想要的文件的版本。 如果您想要混合使用这两个版本,则只需要复制/编辑该文件。
请标记mipadis的答案是正确的。
你也可以克服这个问题
git mergetool
这会导致git
创build冲突的二进制文件的本地副本,并在其上产生默认的编辑器:
-
{conflicted}.HEAD
-
{conflicted}
-
{conflicted}.REMOTE
显然你不能在文本编辑器中有用地编辑二进制文件。 相反,您可以在不closures编辑器的情况下将{conflicted}.REMOTE
文件复制到{conflicted}.REMOTE
。 然后,当你closures编辑器时, git
会看到未修改的工作副本已经改变,并且你的合并冲突以通常的方式被解决了。
要通过在当前分支中保留版本来解决(忽略要合并的分支中的版本),只需添加并提交文件即可:
git commit -a
要通过用正在合并的分支中的版本覆盖当前分支中的版本来解决问题,首先需要将该版本检索到您的工作目录中,然后添加/提交:
git checkout otherbranch theconflictedfile git commit -a
更详细地解释
从git checkout
文档
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
--ours
--theirs
从索引中检索path时,请查看第2阶段(ours
)或第3阶段(theirs
)未合并的path。由于之前的失败合并,索引可能包含未合并的条目。 默认情况下,如果您尝试从索引中检出这样的条目,则检出操作将失败,并且不会检出任何内容。 使用
-f
将忽略这些未合并的条目。 合并的特定方面的内容可以通过使用--ours
或 –--theirs
的索引从索引中--theirs
。 使用-m
,可以放弃对工作树文件所做的更改,以重新创build原始冲突的合并结果。
mipadi的回答对我来说不是很有效,我需要这样做:
git checkout –ourspath/到/ file.bin
或者,保持版本被合并在:
git checkout – 他们的path/到/ file.bin
然后
git add path / to / file.bin
然后,我又能够做“混帐合并工具”,继续下一个冲突。
我遇到了一个类似的问题(想拉一个提交包括一些二进制文件,导致合并时产生冲突),但遇到了一个不同的解决scheme,可以完全使用git(即不必手动复制文件)。 我想我会把它包括在这里,至less我可以记得下次我需要它。 :)步骤如下所示:
% git fetch
这将从远程存储库中提取最新的提交(您可能需要指定一个远程分支名称,具体取决于您的设置),但不会尝试合并它们。 它在FETCH_HEAD中logging提交
% git checkout FETCH_HEAD stuff/to/update
这需要我想要的二进制文件的副本,并使用从远程分支中获取的版本覆盖正在工作的树中的内容。 git不会尝试进行任何合并,所以您最终只能从远程分支得到一个精确的二进制文件副本。 完成之后,您可以像正常一样添加/提交新副本。
我遇到了两种策略,用于在Windows上pipe理二进制文件与Git的差异/合并。
-
Tortoise Git允许您根据文件扩展名为不同的文件typesconfiguration差异/合并工具。 见2.35.4.3。 比较/合并高级设置http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html 。 这个策略当然依赖于合适的差异/合并工具。
-
使用git属性,你可以指定一个工具/命令来将你的二进制文件转换为文本,然后让你的默认diff / merge工具做的事情。 请参阅http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes 。 文章甚至给出了一个使用元数据来区分图像的例子。
我有两种策略来处理软件模型的二进制文件,但是我们使用了git,因为configuration非常简单。
如果二进制文件不仅仅是一个dll ,还有一些可以像图像或混合文件一样直接编辑的东西(并且不需要垃圾/select一个文件或另一个文件),那么真正的合并就像下面这样:
我build议search面向什么是二进制文件的diff工具,例如,有一些免费的图像文件的例子
- 从https://github.com/uber/image-diff安装npm install -g imagediff IIRC
- 或者python https://github.com/kaikuehne/mirror.git
- 那里有其他人
并比较它们。
如果没有diff工具来比较你的文件,那么如果你有bin文件的原始生成器 (也就是说, 它存在一个编辑器 …就像搅拌机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