在 git 中显示未提交合并的父级

Posted

技术标签:

【中文标题】在 git 中显示未提交合并的父级【英文标题】:Show parents of uncommitted merge in git 【发布时间】:2012-11-15 10:59:42 【问题描述】:

如何在 git 中查看未提交合并的父级?我可以通过git log -1 看到一位家长,但我如何看到另一位家长?

这在 Mercurial 中很容易做到:

$ hg parents
changeset:   2:b65656dbfff6
tag:         tip
parent:      0:1806d848df54
user:        Stephen Rasku 
date:        Tue Nov 27 10:14:31 2012 -0800
summary:     c

changeset:   1:9aaa22944f41
user:        Stephen Rasku 
date:        Tue Nov 27 10:14:01 2012 -0800
summary:     b

在 git 中有什么等价的吗?我知道您可以在 git 中看到已提交合并的父级。这是专门用于查看未提交合并的父级。

【问题讨论】:

cat .git/MERGE_HEAD 将显示您正在合并到 HEAD 中的提交 ID。 cat .git/HEAD 当然会向你展示 HEAD。 那行得通。您可以使用git log -1 获得一个人头,使用git log -1 `cat .git/MERGE_HEAD` 获得另一个人头。如果你把它作为答案,我会接受它。否则我会自己做。 【参考方案1】:

未提交合并的源存储在.git/MERGE_HEAD 中。如果您正在执行章鱼合并,您将在此文件中有多个提交 ID,以换行符分隔。合并的目标,当然是HEAD

如果您想要详细的输出,类似于您从 Mercurial 提供的示例,您可以将其输入到git log,正如您所指出的。编写一个 shell 脚本来处理这个可能是最简单的。

如果您将此脚本命名为 git-parents,并将其放在您的路径中,您只需运行 git parents 即可获得与您描述的类似的体验:

#!/bin/sh
git --no-pager log -1

WORKDIR=`git rev-parse --show-toplevel`
if [ -f "$WORKDIR/.git/MERGE_HEAD" ]; then
    for a in `cat "$WORKDIR/.git/MERGE_HEAD" | xargs` ; do
        git --no-pager log -1 $a
    done
fi

【讨论】:

你为什么要管猫?我尝试了它存在和不存在的脚本,它似乎对我的简单(非章鱼)测试用例没有影响。 git log,无论如何,对我来说,总是发送到$PAGER。对我来说,$PAGERless,它总是会在 EOF 处停止,即使行数小于您的显示尺寸。 more 可能没有这个限制,而且我不知道在 Win32 上使用 msys 或 cygwin 会发生什么。管道到 cat 将避免分页。 啊哈,手册页中没有 --no-pager 选项,但在 ***.com/questions/13824165/git-for-windows-paging 中引用了这将是一个更好的解决方案。 (已编辑。) 我注意到,如果您在未进行合并的地方运行解决方案,则该解决方案不起作用。我提出了一个解决方案,但被拒绝了。你看到编辑了吗? 我没有。您是什么意思“在不进行合并的地方运行它”?【参考方案2】:

我没有 repo 可以在这里尝试,但这不起作用吗?

$ git show HEAD^ # shows first parent
$ git show HEAD^2 # shows second parent
$ git show HEAD^3 # and so on...

是否需要向所有父母展示,无论有多少?我想你可以用git log -1 --parents 或类似的东西编写一些脚本。

【讨论】:

这将显示提交的父项,而不是未提交合并的父项。

以上是关于在 git 中显示未提交合并的父级的主要内容,如果未能解决你的问题,请参考以下文章

如何找到最近的 Git 分支的父级

如何找到最近的 Git 分支的父级

Cherry 选择从开发分支到部署分支的父合并提交

Mercurial - 如何从fork的父级获取最新更改?

如何将本地未提交的更改合并到另一个 Git 分支?

Git说文件未合并,我无法提交,但文件似乎已合并