代码之家  ›  专栏  ›  技术社区  ›  Paul Biggar

“git diff head^”的对立面是什么?

git
  •  19
  • Paul Biggar  · 技术社区  · 14 年前

    在Git中,我可以通过说 HEAD^ HEAD~1 . 换个方向怎么样?假设我在修订版X上,我知道 git checkout X^ . 我该怎么回去?

    类似的东西 git checkout X+ ?

    3 回复  |  直到 14 年前
        1
  •  30
  •   Cascabel    14 年前

    你不能真的那样做。Git中的历史是一个有向无环图-每个提交都包含对其父级的引用,但父级没有对其子级的引用。

    当您考虑从中创建多个分支的提交时,这里的问题应该变得明显。你说的“下一个承诺”是什么意思?对于父级,您可以取消编号(正常的合并提交有第一个和第二个父级),但是对于子级,您如何做到这一点?即使你知道你想在哪个分支机构工作(例如,你已经退房了 master~4 现在你想看看 master~3 )它没有很好的定义-你可能遇到这样的情况:

    - X (HEAD) - o - o - o - Y (master)
       \                    /
        o - o - o ----------
    

    也就是说,在简单的情况下,您可以这样做:

    git checkout $(git rev-list HEAD..master | tail -n 1)
    

    显然,这对于线性历史来说是很好的。与合并… rev-list 历史上从现在到过去的作品,遵循它的落后。我相信它首先跟随第一个父对象,所以最后打印的内容将是之后的提交 HEAD 通过跟踪所有最后的父母找到。

    编辑:假设您知道要向前移动到哪个分支。如果你不…好吧,您很难在所有引用中找到以当前头部为父级的提交,这可能会使 git rev-parse :

    git rev-list --all --children | grep ^$(git rev-parse HEAD)
    

    然后从线上抓起另一个sha1(使用awk,随便什么)。但是,如果有多个结果,您必须手动检查或做出任意选择…

        2
  •  3
  •   fat-lobyte    14 年前

    我认为这是不可能的,因为Git提交只存储 起源 承诺,但不是它的子项。

    想象一下一个提交可以存储它的子项。如果您将在此提交中创建多个分支,那么多个提交将此提交作为父提交会发生什么?那么“head+”是什么?这是模棱两可和错误的。

    我从数据结构中了解到: Git将历史存储为单个链接列表,而您的操作将需要一个双链接列表。

        3
  •  2
  •   kenm    14 年前

    据我所知,没有任何象征性的方式来指代承诺的孩子。

    我现在能给你的最好的是 --children 选择权 git rev-list . 在这里,我要求最近的四项承诺都要印刷得很好,加上他们孩子的信息。请注意,在每个条目的“提交”行(最近的条目除外)上都有一个额外的提交编号,它指定了该节点的子节点。您可以手动或者通过一些shell脚本来获取它,从而找到这个孩子。

    $ git rev-list --children --pretty HEAD~3...
    
    commit 20dba296ad1d48ec90f9319e2c13b245e849f698
    Author: Somebody <____@____.net>
    Date:   Thu May 6 19:10:38 2010 -0400
    
        Support for complex trig/pow.
    
    commit 9d42b5bac1721a847a39c25672e577c7101c8ff0 20dba296ad1d48ec90f9319e2c13b245e849f698
    Author: Somebody <____@____.net>
    Date:   Wed May 5 21:55:07 2010 -0400
    
        Fix doc formatting warning.
    
    commit 72bed3baa9df71cb224dfa8388b5969d50f5567c 9d42b5bac1721a847a39c25672e577c7101c8ff0
    Merge: b8244cb61491c9cdb83d36e57f8eb49773e44f6b 899c3dd3f9f419f200b84ca0abe59d7ac3d5bb53
    Author: Somebody <____@____.net>
    Date:   Wed May 5 21:54:59 2010 -0400
    
        Merge branch 'master' 
    
    commit 899c3dd3f9f419f200b84ca0abe59d7ac3d5bb53 72bed3baa9df71cb224dfa8388b5969d50f5567c
    Author: Somebody <____@____.net>
    Date:   Wed May 5 21:19:11 2010 -0400
    
        Fix link