我可以让`git merge`始终与文件更改冲突吗?

时间:2015-02-07 02:00:41

标签: git version-control latex git-merge

我希望我有一个简单的问题,但我无法在任何地方找到答案(我已经搜索了2天,也许我很笨?)。我正在尝试开发一个git工作流程来与我的博士顾问协作编辑LaTeX文件。我们面临的问题是git merge的行为(因为它自动合并)。我希望git在看到文件更改时发生冲突,即使它是加法,减法或微小变化,这可能吗?通过这种方式,我们可以选择并选择更改,并不断推动掌握。

我不反对使用其他工具,但我不想创建复杂的分支系统。我认为当2-3个人在同一个文件上工作时,不需要分支。非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

作为vcsjones noted in a comment,你几乎必须在这里使用--no-commit来阻止合并,即使git认为它进展顺利。

关于您的后续问题,您可以通过多种方式获取git以提取文件的两个正在合并的版本。最简单的可能是使用git show。 (请注意,这会绕过涂抹过滤器。)

当合并停止时,HEAD将当前提交和MERGE_HEAD命名为正在合并的提交(这假定正在进行双父合并;我从未尝试过使用章鱼合并),所以如果你有文件foo.tex git认为它已经正确合并,并且你想自己检查它,你可以这样做:

$ git show HEAD:foo.tex > foo.tex.head
$ git show MERGE_HEAD:foo.tex > foo.tex.merge_head
$ vimdiff foo.tex foo.tex.head foo.tex.merge_head

这个特定的命名方案(添加.head.merge_head后缀)不是很聪明,如果你实际上有一个名为foo.tex.head的“真实”文件,可能会失败,所以对于一个强大的工具,你想要制作临时目录。这实际上可以使过程更容易,因为您可以使用git checkout 应用污迹过滤器)来填充临时目录。例如,这有点浪费(检查整个HEADMERGE_HEAD树,而不是每个文件都检查出来):

$ hd_tree=/tmp/head.$$ mhd_tree=/tmp/merge_head.$$
$ index=/tmp/index.$$
$ mkdir $hd_tree $mhd_tree
$ GIT_INDEX_FILE=$index GIT_WORK_TREE=$hd_tree git checkout HEAD -- .
$ GIT_INDEX_FILE=$index GIT_WORK_TREE=$mhd_tree git checkout MERGE_HEAD -- .

现在为您希望亲自检查的每个文件$f

$ vimdiff $f $hd_tree/$f $mhd_tree/$f

完成所有操作后,rm -rf $hd_tree $mhd_tree $index将丢弃临时工作树和虚拟索引。

为了减少浪费文件空间(但使用更多进程),请使用上面的$f环境设置,逐个检出每个文件GIT_WORK_TREE。 (GIT_INDEX_FILE在这里是因为checkout通过索引写入,你真的不想在.git/index中覆盖git的合并版本。)

[注意,以上都没有经过测试;告诫者。]

答案 1 :(得分:0)

使用--no-commit

停止合并

通过执行git diff --name-only HEAD...MERGE_HEADgit diff --name-only MERGE_HEAD...HEAD

获取双方都已更改的文件列表

将两个文件列表重定向到comm -12,以获取两个分支修改过的文件。

请注意以下内容

  

::,例如:0:README,:README一个冒号,可选地后跟一个冒号   阶段编号(0到3)和冒号,后跟路径,命名一个blob   给定路径的索引中的对象。一个缺少的阶段号码(和   跟随它的冒号​​)命名阶段0条目。在合并期间,第1阶段   是共同的祖先,第2阶段是目标分支的版本   (通常是当前分支),第3阶段是来自的版本   正在合并的分支。

对于comm输出中列出的每个文件,您可以调用git difftool(假设将为您调用vimdiff)并指定以下任意组合:0:,:1:,:2:,:3:that你想看到各种差异。