我知道通过调用可以获取我们/他们的状态
git checkout --ours/--theirs -- path/to/my/file.txt
但这将覆盖我工作树中的文件。在合并过程中如何获取我们的/他们的文件状态的文件内容,而不覆盖工作树?
我知道通过调用可以获取我们/他们的状态
git checkout --ours/--theirs -- path/to/my/file.txt
但这将覆盖我工作树中的文件。在合并过程中如何获取我们的/他们的文件状态的文件内容,而不覆盖工作树?
git show :1:file/path # base
git show :2:file/path # ours
git show :3:file/path # theirs
当由于merge
操作触发合并冲突时,HEAD
仍指向原始提交,MERGE_HEAD
指向尝试合并的提交,因此:
git show HEAD:file/path # ours
git show MERGE_HEAD:file/path # theirs
这也能起作用,并且可能对用户更加明确。
当你在调用时:
git merge-tool -- file/path
如果正确配置,git 将使用所有有用的文件版本启动此工具:当前版本、theirs 版本、ours 版本和 base 版本(两个分支的共同祖先版本)。
有许多工具可帮助解决合并冲突:kdiff3
、meld
。我最喜欢的是 beyond compare
(非免费 - 试用期为 30 个工作日 - 如果您不使用它,它不会减少试用天数)。它有“三方合并”视图,在顶部的 4 个子视图中,左侧是 ours
,中间是 base
,右侧是 theirs
,底部是合并结果。
找到最适合您的工具。
git ls-files -u
和 git cat-file blob
的组合来检索不同的我们/他们版本。
当您遇到冲突并运行命令git ls-files -u
时,它会显示一些带有文件模式值、blob id、阶段值和文件名的行,例如以下内容:
$ git ls-files -u
100644 ad5e6cfb620eb3086a399bd8dd63f039fa120358 1 .gitignore
100644 73dab4ca75450b2aeb048a5e5632011d95064e58 2 .gitignore
100644 12c32798081dd59a51295275ce1119f5d1662422 3 .gitignore
$
0 Normal, no conflict
1 Common ancestor
2 Current branch (version merged on to)
3 The other branch (version merged from)
git cat-file blob
命令检索相应的文件内容,例如:$ git cat-file blob ad5e6cfb620eb3086a399bd8dd63f039fa120358 > .gitignore.common-base
$
以上是我的脚本git-resolve-conflict-using-kdiff3的操作基础,它会自动执行上述操作,并为每个冲突文件提供启动KDiff3的所有贡献版本的选择。
git checkout --ours file
,那么应该也有类似的方法可以使用git show --ours file
。这是一个关于不良设计的评论。 - Andy