指定第 n 个未完成的 git 提交,相对于上游分支

Specifying nth outstanding git commit, relative to upstream branch

当我阅读 git: push a single commit 并考虑小批量推送提交时,我开始想知道我是否可以指定相对于我想要一次推送的提交数量的本地修订版。

例如,假设我有 12 个未完成的提交要推送。我可以使用 HEAD~9 来推送前 3 个未完成的提交;要推送下一个 3,我必须使用 HEAD~6 等等。但我希望能够使用我的 shell 的历史记录,而不必为每个批次编辑它。

$ git log --oneline myremote/mybranch..mybranch
0a594a4 Blah blah 12
9a4b42e Blah blah 11
d81227e Blah blah 10
803f1d3 Blah blah 9
aa7dcbc Blah blah 8
fc410e6 Blah blah 7
d57198e Blah blah 6
75f8ed6 Blah blah 5
4e801b4 Blah blah 4
7333461 Blah blah 3
3bc453e Blah blah 2
562690f Blah blah 1

显然我可以用 git push myremote 7333461:mybranch 推 1-3,我也可以用 HEAD~9:mybranch,但是有什么方法可以说 myremote/mybranch+3 之类的东西来获得相同的哈希值吗?我用 rev-parse 尝试过的所有事情都会让我倒退,相对于 HEADmyremote/mybranch (当它在全部)。

坏消息是不能等同于向前看的 HEAD^,因为 Git 提交结构只知道其父项。对不起。您可以编写一个实用程序来完成它。

它必须有一个地方可以回顾过去。您 可以 通过从每个分支或标记返回直到找到 HEAD 来完成此操作,但这可能需要完整的树遍历(不像您想象的那样低效)并且模棱两可。

但是,你的具体问题有一个婴儿床。可以从当前分支的远程分支which is available as @{u}("u" for "upstream")向后看。将此程序作为 git-unpushed-ref 或其他内容放入您的 PATH。

#!/bin/sh

NUMBER=

git log --pretty=format:%H @{u}..HEAD | tail -n$NUMBER | head -n1

现在您可以编写 git push origin $(git unpushed-ref 3):master 或构建一个 shell 包装器。