如何找出正在进行的合并的父修订版?

时间:2014-09-28 13:19:23

标签: git git-merge merge-conflict-resolution

我已经开始合并,但它已经解决了冲突,现在它已经准备好提交了。我只想仔细检查我合并了哪些父版本。

到目前为止所做的事情:

  • git show使用%P格式说明符 - 除了我无法弄清楚如何让它告诉我未提交合并的父母
  • git rev-list有多种选择,但无济于事
  • 搜索等同于hg parents的git,brings me back to git rev-list但没有成功:它列出了五个修订版,但未能列出我实际传递给{的修订版{ {1}}
  • git merge <rev>并查看提交消息

最后一个是唯一可行的选项,除了它只显示我未提交合并的父项之一。

必须有比git commit更好的方法!我该怎么做呢?

1 个答案:

答案 0 :(得分:5)

请注意,由于合并提交尚不存在,您将无法将git loggit show%P格式说明符(对应于父哈希值)一起使用)访问未来合并提交的父母。

简单合并

如果将一个分支简单合并到另一个分支,则可以运行

git log -n 1 --pretty=format:"%H"
git log -n 1 --pretty=format:"%H" MERGE_HEAD

将打印

的完整SHA
  • 当前分支的提示,
  • 正在合并的分支,

分别

八达通合并

如果在章鱼合并期间出现任何冲突,包括将多个分支合并到另一个分支,Git将中止合并;因此,您的问题通常不适用于该案件。正如安德鲁在his comment中指出的那样,--no-commit标志可用于故意中断合并,即使它没有冲突。但是,在这种情况下,运行

git log -n 1 --pretty=format:"%H" MERGE_HEAD

只会打印正在合并的分支的一个的SHA;它不会列出那些分支的所有的SHA。

但是,一切都没有丢失;有一种方法可以打印所有这些。事实证明,.git/MERGE_HEAD文件包含所有正在合并的分支的SHA;因此,更健壮的方法包括简单地转储该文件的内容:

cat .git/MERGE_HEAD

为了解决问题,这里是一个(自愿设计)中断章鱼合并的例子:

# set things up
$ mkdir test_octopuss
$ cd test_octopuss
$ git init

# create an initial commit
$ printf "foo\n" > README.md
$ git add README.md
$ git commit -m "add 'foo' in README"

# create three different commits on branches whose tips count the root commit as parent
$ printf "bar\n" >> README.md 
$ git commit -am "add 'bar' in README"
$ git checkout -b another master^
$ printf "bar\n" >> README.md 
$ git commit -am "add 'bar' in README"
$ git checkout -b yetanother master^
$ printf "bar\n" >> README.md 
$ git commit -am "add 'bar' in README"

# get our bearings
$ git log --oneline --graph --all --decorate
* 93e4667 (HEAD, yetanother) add 'bar' in README
| * a114920 (another) add 'bar' in README
|/  
| * 7adc927 (master) add 'bar' in README
|/  
* bc400cd add 'foo' in README

# merge using the --no-commit flag (to pretend that the merge failed)
$ git merge --no-commit master another
Trying simple merge with master
Trying simple merge with another
Automatic merge went well; stopped before committing as requested

# the following command fails to list all the heads being merged in
$ git log -n 1 --pretty=format:"%H" MERGE_HEAD
7adc927d9f7a0c8864d0ff784c0c53b0ded00616

# list of all the heads being merged in the current branch
$ cat .git/MERGE_HEAD
7adc927d9f7a0c8864d0ff784c0c53b0ded00616
a114920072210417a1fa6c9b2b33b5729097ee93