Git是否支持原生单行命令获取合并冲突文件的所有版本?
Git三方合并:提取三个版本文件的实用技巧与疑问
如果你处理过Git的三方合并,应该知道可以通过手动命令提取合并涉及的三个核心版本文件——公共祖先版本、本地分支版本和远程分支版本:
git show :1:hello.rb > hello.common.rb git show :2:hello.rb > hello.ours.rb git show :3:hello.rb > hello.theirs.rb
但你可能会好奇:Git有没有原生命令能直接完成这个操作?其实观察git merge-tool的行为就能找到线索——它在启动外部合并工具前,会自动准备好这三个版本的文件,说明Git内部确实有原生的处理逻辑,但遗憾的是,Git并没有提供一个专门的顶层命令来直接做这件事。
那有没有简化的办法?当然可以用Git别名来封装这个提取逻辑,比如定义这样一个全局别名:
git config --global alias.mergefiles '!f() { git show :1:$1 > $1.common; git show :2:$1 > $1.ours; git show :3:$1 > $1.theirs; }; f'
使用的时候只要执行git mergefiles hello.rb,就能快速生成对应的三个版本文件。不过这个别名有个小缺陷:如果遇到新增文件的场景(比如本地分支或者要合并的分支新增了某个文件,公共祖先里没有这个文件),就会抛出错误:
fatal: Path '<path>' is in the index, but not at stage 1. Did you mean ':2:<path>'?
这时候就需要调整别名的逻辑,比如先检查每个stage是否存在该文件,再执行提取操作,避免触发报错。
内容的提问来源于stack exchange,提问作者neverendingqs
相关产品推荐
相关产品推荐

