代码之家  ›  专栏  ›  技术社区  ›  Joe White

如何检测Git提交是否是其他提交的父级?

  •  1
  • Joe White  · 技术社区  · 14 年前

    我正在编写一个脚本,它进行一些细微的更改,然后将它们提交给Git。因为这些是微不足道的变化,我想做 git commit --amend 每当我能摆脱它——特别是当一个修正案不会“弄乱”任何其他分支的历史时。如果一个修正案会搞乱另一个分支,我想做一个标准 git commit 相反。

    例如,如果我的分支看起来像这样(GitGUI中的la“可视化所有分支历史”):

    * [experimental branch] Added feature.
    * [master branch] Trivial change from script
    * ...
    

    我在主分支运行这个脚本,所以我不想做修改,因为我将替换实验分支的一部分历史。从技术上讲,这实际上不会破坏任何东西——原始提交仍将是实验历史的一部分,并且仍将被引用,因此不会被垃圾收集——但是在两个不同的分支中有几乎但不完全相同的提交会使我以后想要重新平衡或合并时的生活变得困难,所以这是一种我想要无效。

    如何使脚本自动检测提交是否有分支?

    如果简化假设有帮助,我总是在master的头上运行这个脚本,并且我只使用git作为本地存储库——我不会在任何地方推或拉更改。

    这个脚本是用Ruby编写的,所以我可以直接使用git命令行,或者使用Ruby绑定git——无论哪种方式都可以使这个任务更简单。

    2 回复  |  直到 14 年前
        1
  •  12
  •   Brian Phillips    14 年前

    只是运行 git branch --contains HEAD 获取包含此提交的分支的列表。如果清单是空的,那么该提交应该是安全的。您还可能希望包括 -a 用于列出本地和远程分支的标志。

    或者,您可以比较 git rev-parse HEAD 具有 git merge-base HEAD other-branch . 如果这些提交ID相同,则当前提交位于其他分支的提交历史记录中。

        2
  •  3
  •   John Feminella    14 年前

    提交图是单向的:给定提交,您知道它的所有祖先,但不知道它的任何子代。您必须从端点开始并回溯到您想要的提交。

    使用 git rev-list [some commit] --children (默认为head):

    $ git rev-list HEAD --children
    6edbee61c87fb063700751815f0ad53907d0b7a4
    aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
    ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
    6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
    bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
    [...]
    

    左边的列是按时间倒序排列的commit sha-1列表。孩子们是对的( --children )这一承诺。最高的承诺是头,因此没有孩子。

    因此,如果您在这个列表中选择了您的SHA-1,并且它有任何权利,那么它至少有一个孩子:

    $ git rev-list --children | grep '^6910'
    6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
    

    在上面的示例中,提交 6910... 有一个孩子, ef8a... .

    推荐文章