Git 在终端 window 关闭后合并获取源分支名称

Git merge get source branch name after terminal window was closed

在Git中如何获取合并源分支的名称?

我昨天开始合并,遇到了我没有解决的冲突,然后 windows 更新重新启动了我的电脑,关闭了我的终端 window。

TL;DR

.git/MERGE_MSG的第一行。

多头

根据评论,我们有以下情况:

  • 某事——也许不是你,或者你可能会记得你做过什么——运行 git merge <em>string</em>.
  • 这次合并有冲突,所以在合并中途停止了。
  • 然后,当您正在处理该问题时,其他东西重启了机器(大概是安全的,但您失去了上下文)。
  • 其他 Git 命令可能已经或可能没有 运行,但您仍处于冲突合并的中间。
  • 您现在想要取回 string

Git只有一个地方保存了文字串,那就是Git目录下的MERGE_MSG文件。如果你有一个典型的设置并且在你的工作树的顶层,那就是:

$ cat .git/MERGE_MSG
Merge branch 'A' into B

# Conflicts:
#   new-filename

第一行将显示为:

Merge branch 'string'

或:

Merge branch 'string' into <name>

其中 name 是合并开始时您所在的 b运行ch 的名称。 (当且仅当 <name> 是文字文本 master 时, into <name> 部分被省略。这是 Git 中名称 master 的少数几个地方之一得到特殊对待:它稍微改变了默认的合并消息。)

如果您的 Git 目录(正确的存储库)在其他地方,请使用 git rev-parse --git-dir 找到它。

原始提交哈希 ID 更容易获得:

$ git rev-parse MERGE_HEAD
243e415273b34b1553ce5eaeb6a189595d322015

你可以把它变成一组 b运行ch 名称,直接指向这个提交 git branch --points-at:

$ git branch --points-at MERGE_HEAD

但是这个可能根本不产生任何名字——例如,如果你运行git merge一个原始哈希ID,或者b运行ch 名称从那时起就被移动了——或者它可能产生多个名称。所以 .git/MERGE_MSG 的第一行可能是要看的地方。

请注意,顺便说一句,您可以像往常一样使用 git log 查看从 MERGE_HEAD 可访问的提交:

$ git log MERGE_HEAD

这有时是 查看 您正在合并的内容的有用方法,具体取决于每个 b运行ch 的每个 "leg" 上的提交数量:

$ git log --decorate --oneline --graph --boundary MERGE_HEAD...HEAD

对于我一直使用的存储库,这会产生:

* 243e415 (A) modify renamed file too
* 57b6097 rename in branch A
| * c8d5dd8 (HEAD -> B) remove orig-filename
|/  
o 3a5c9ae (master) add orig-filename

在这种情况下,可视化可能就足够了,但在更复杂的图形中,添加 --left-right 可能会有所帮助:

$ git log --decorate --oneline --graph --left-right --boundary MERGE_HEAD...HEAD
< 243e415 (A) modify renamed file too
< 57b6097 rename in branch A
| > c8d5dd8 (HEAD -> B) remove orig-filename
|/  
o 3a5c9ae (master) add orig-filename

请注意 "our" b运行ch,HEAD aka B,如何位于三个点 MERGE_HEAD...HEAD 的右侧,并且一些提交是标记为 > 因为它们在我们的 b运行ch 上。 "Their" b运行ch,MERGE_HEAD aka A,被标记为 < 因为 MERGE_HEADMERGE_HEAD...HEAD 的左边。

--boundary 选项调整包含在 git log 输出中的提交集,以便我们在此处看到最后一次提交,在本例中为 master。没有这个提交已从 git log 输出中排除。)