git: 查找 `mine` 中不存在的最旧提交 `theirs`

标签 git branch git-branch

我希望能够在我的 git-graph 中找到上游不存在的最长路径。该路径的一端显然是 HEAD,所以这很容易。另一端是我最早的提交,上游不存在。我不知道如何找到它。

图表

[otherguy]   H--I--J   
            /       \
[master]   A--B--C--M1--D--E--M2--F--G
              \      \             \
[mine]         H---I--M3---J---K---M4--M--HEAD

我想要一个将我指向 H(或 B)的命令,给定 HEADmaster。请注意,一个简单的 git merge-base master HEAD 给了我 F.

最佳答案

这应该可以合理地工作:

git rev-list --topo-order --reverse mine ^master | head -1

使用您的设置副本进行测试,它会打印您标记为“H”的提交。我不是 100% 相信它在所有可能的情况下都能找到“最远”的路径,或者这样的概念甚至是明确定义的,因此您可能希望在依赖它之前对对您重要的情况进行测试。

(请注意,通常会指定用于限制 git rev-list 输出的 -1 选项与 --reverse 不能很好地结合,所以需要 head -1。)


更新:

一些解释:

  • git rev-list mine ^master 请求可从 mine 访问的提交,但不能从 master 访问。在您的情况下,我们请求所有以 HEAD 开头的提交,不包括可从 G 访问的提交,它给出了提交列表 (M, M4, K, J, M3, I, H),我们选择最后一个。

  • --topo-order 需要确保提交的拓扑顺序(提交总是出现在其父项之前),而不是默认的时间顺序。我们还指定了 --reverse,因为我们需要最后一个。

  • commit1 ^commit2 也可以拼写为 commit2..commit1,当 commit1commit1 的后代时,这是首选语法提交 2。在这种情况下,minemaster 发生了分歧,因此更清楚地说明了我们想要什么。也允许多个排除项,例如 git log branch1 ^branch2 ^branch3。这适用于所有采用范围的 git 命令,并记录在 git rev-parse manual 中。 .

关于git: 查找 `mine` 中不存在的最旧提交 `theirs`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516169/

相关文章:

tfs - 我应如何正确摆脱TFS分支?

git - 如何快进分支而不切换到它们?

Git 扩展——为什么我看到同一个分支有多个标签?

git - 特定git命令的颜色输出

Git - 获取当前工作副本版本

Git:仅列出 "untracked"文件(还有自定义命令)

git - 阻止新分支获取 Git 中的旧提交历史记录

git 附件/ssh : ControlPath too long

git - 我应该使用 Git 分支来存储不相关的代码吗?

git - 如何获取 Rails 应用程序中的 git 分支列表?