我希望我有一个简单的问题,但我无法在任何地方找到答案(我已经搜索了2天,也许我很笨?)。我正在尝试开发一个git工作流程来与我的博士顾问协作编辑LaTeX文件。我们面临的问题是git merge
的行为(因为它自动合并)。我希望git在看到文件更改时发生冲突,即使它是加法,减法或微小变化,这可能吗?通过这种方式,我们可以选择并选择更改,并不断推动掌握。
我不反对使用其他工具,但我不想创建复杂的分支系统。我认为当2-3个人在同一个文件上工作时,不需要分支。非常感谢你的帮助!
答案 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
( 应用污迹过滤器)来填充临时目录。例如,这有点浪费(检查整个HEAD
和MERGE_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_HEAD
和git 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你想看到各种差异。