我希望我有一个简单的问题给你,但我在任何地方都找不到答案(我已经找了两天了,也许我是个傻瓜?)我正在尝试开发一个git工作流,以便与我的LaTeX顾问协作编辑PhD文件。我们面临的问题是由于git merge的行为(因为它会自动合并)。我希望git在任何时候看到文件更改时都会发生冲突,即使它是加、减或微小的更改,这可能吗?这样,我们既可以选择变化,又能不断地推动掌握。
我不反对使用另一个工具,但我不希望创建一个复杂的分支系统。当2-3个人在同一个文件上工作时,我认为分支是不必要的。非常感谢你的帮助!
发布于 2015-02-07 05:06:16
作为vcsjones noted in a comment,您几乎必须在这里使用--no-commit来阻止合并,即使git认为进行得很好。
关于后续的问题,您可以通过多种方式获取git来提取文件的两个合并版本。最简单的可能是使用git show。(但请注意,这绕过了污点过滤器。)
当合并停止时,HEAD将当前提交命名为当前提交,MERGE_HEAD命名正在合并的提交(这假设正在进行两个父级合并;我从未对章鱼合并进行过此操作),因此,如果您有git认为合并正确的文件foo.tex,并且您想亲自检查它,您可以这样做:
$ 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将丢弃临时工作树和虚拟索引。
为了减少文件空间的浪费(但要使用更多的进程),请使用上面的GIT_WORK_TREE环境设置,一次一次检查每个文件的GIT_WORK_TREE。( GIT_INDEX_FILE在这里是因为checkout通过索引进行写入,而且您真的不希望在.git/index中覆盖git的合并版本。)
请注意,上述任何一项都没有经过测试;请注意。
发布于 2015-02-07 19:38:29
停止使用--no-commit完成合并
获取通过执行git diff --name-only HEAD...MERGE_HEAD和git diff --name-only MERGE_HEAD...HEAD而在双方更改的文件列表
将两个文件列表重定向到comm -12,以获得两个分支修改的文件。
请注意以下事项
*例如:0 :README,:README A冒号,可选地后面跟着一个阶段号(0至3)和冒号,后面跟着路径,在给定路径的索引中命名blob对象。缺少的阶段号(以及后面的冒号)指定了一个0级条目。在合并过程中,阶段1是共同的祖先,阶段2是目标分支的版本(通常是当前分支),阶段3是要合并的分支的版本。
对于comm输出中列出的每个文件,您可以调用git difftool (假定这将为您调用vimdiff ),并指定任意组合:0:、:1:、:2:、:3:您希望看到不同的差异。
https://stackoverflow.com/questions/28377725
复制相似问题