Git 差异与合并工作流
Git使用自己的内部算法执行差异、合并和重基。 这些操作是确定的和全自动的:Git从不依赖外部工具。
然而,有些情况下需要人类判断。 例如,当需要通过视觉或语义而不是文本来评估更改时。 在这些情况下,Git可以调用外部工具来协助检查,而不是决策。
macOS上的一个常见示例是FileMerge.app,它与Xcode命令行工具一起安装,并且可以通过Git作为差异或合并助手启动。
合并
当Git合并分支且无法核对更改时,它会将冲突标记写入每个冲突文件,然后停止合并并通知用户。 对于每个带有冲突标记的文件,Git索引中都记录了三个阶段:常见的我们的和他们的。 此时,存储库处于冲突合并状态,Git等待所有冲突解决。
给定一个冲突的文件File.swift生成的文件
要手动修复冲突编辑文件:
- 在编辑器中打开文件,并删除冲突标记。
- 使用
git add对已解决的文件进行分级。
要修复外部工具中的冲突运行:
git mergetoolgit mergetool为每个冲突文件启动一次工具,将BASE、我们的、他们的和合并结果路径传递给工具。
Git在启动下一个文件之前等待工具退出。
每个文件的应用程序的退出代码决定了该文件是否被标记为已解决。
您还可以选择显式运行git add <file>来将其标记为分期。
如果配置了多个合并工具,Git将从以下列表中选择第一个:
merge.tool配置。$GIT_MERGE_TOOL环境变量。- 来自已知已安装工具的自动检测。
调用外部工具
对于每个冲突文件Example.swift
Git创建此处的其他文件:
Example_BACKUP_70842.swift
Example_BASE_70842.swift
Example_LOCAL_70842.swift
Example_REMOTE_70842.swift
Example.swift
每个调用的后缀编号都会发生变化。 然后,它调用了我们在Git 集成中看到的配置命令的工具。
对于abd,命令是
abd --base Example_BASE_70842.swift --local Example_LOCAL_70842.swift --remote Example_REMOTE_70842.swift --result Example.swift该工具应该删除冲突标记并正常退出。 这表明冲突已经解决了。
差异
对于差异,外部工具仅用于目视检查。 Git在应用程序退出时忽略返回代码。
如果您调用git difftool,Git将列举更改的文件,并为每对文件启动外部工具。
通常,最好只拖放您想要比较的文件。
但如果你更喜欢全部比较,请运行git difftool。
调用的外部工具是此列表中第一个找到的:
diff.tool配置。$GIT_DIFF_TOOL环境变量。- 从
$PATH中的已知工具自动检测。 - 回退到
vimdiff。