我可以让 `git merge` 总是在文件更改时发生冲突吗?

Can I make `git merge` always conflict on file changes?

我希望我有一个简单的问题要问你,但我找不到任何答案(我已经搜索了 2 天,也许我很笨?)。我正在尝试开发一个 git 工作流程来与我的博士生导师协作编辑 LaTeX 文件。我们面临的问题是由于 git merge 的行为(因为它自动合并)。我希望 git 在看到文件更改时随时发生冲突,即使是加法、减法或微小的更改,这可能吗?这样我们既可以选择更改,又可以不断地推送到 master。

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

一样,您几乎必须在此处使用 --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 的 "real" 文件,它可能会失败,当然,所以对于一个强大的工具,你会想要创建临时目录。这实际上可以使该过程更容易,因为您可以使用 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丢弃临时工作树和虚拟索引。

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

[注意上面的none是测试过的;买者自负。]

停止合并完成 --no-commit

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

获取双方更改的文件列表

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

注意以下事项

::, e.g. :0:README, :README A colon, optionally followed by a stage number (0 to 3) and a colon, followed by a path, names a blob object in the index at the given path. A missing stage number (and the colon that follows it) names a stage 0 entry. During a merge, stage 1 is the common ancestor, stage 2 is the target branch’s version (typically the current branch), and stage 3 is the version from the branch which is being merged.

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