在冲突的合并状态下,如何获取父提交的sha?

时间:2013-11-20 22:15:44

标签: git

我想解决的问题是我想得到文件的差异,而不是带有冲突标记的文件。这是一个脚本,所以管道命令是最好的。我认为最好的方法是找出父母的沙子,然后用它们来获得差异,但如果有更直接的方式,请告诉我。

1 个答案:

答案 0 :(得分:2)

冲突文件数据存储在索引中,可以使用git-ls-files命令检索文件。索引中的每个条目都有一个" stage"值,在0-3之间,表示条目的类型:

  • 0:索引中的正常条目,暂存的文件
  • 1:冲突中的共同祖先文件
  • 2:"我们的"冲突中的一面; HEAD中存在的文件
  • 3:"他们的"冲突中的一面;您正在合并的分支中存在的文件

发生冲突时,将删除文件的第0阶段条目,并在适当时写入第1,2和3阶段,以指示文件存在冲突。解决冲突并git add相应的分辨率后,将添加阶段0条目并删除高阶段条目。

例如,如果我尝试合并在a.txt上创建冲突的分支:

% git merge br
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

然后,您可以查看a.txt中涉及的文件的哈希值及其与git-ls-files冲突的阶段:

% git ls-files --stage
100644 6041e76b484cbe25004efdf4e5faf3396d6f95a6 1       a.txt
100644 0b6a7cf8dc44738a17d322c315ded9265f38a3fa 2       a.txt
100644 67244df04c82140ad8e763a52daa670878b9d574 3       a.txt

如果您想要一种简单的方法来获取单个条目的哈希值,您可以使用git revision syntax来引用某个阶段的项目。要获取#34中冲突文件的哈希值,他们的"分支(合并):

% git rev-parse :3:a.txt
67244df04c82140ad8e763a52daa670878b9d574

手动合并文件后,我可以使用git add

暂存解决方案
% echo "resolved!" > a.txt
% git add a.txt

只剩下第0阶段的条目:

% git ls-files --stage a.txt
100644 8a1c1b8cc46d9c722630b3bf561ecde155554831 0       a.txt