【问题标题】:Where did I branch from?我从哪里分支?
【发布时间】:2012-04-11 11:44:42
【问题描述】:

我回到了一个旧项目,我运行了漂亮的git status 来弄清楚发生了什么,我注意到分支太多了!我想在重新开始工作之前做一些家务,但我不确定哪个分支来自哪个..

例如“branchA”是否源自“develop”? “branchB”是从“master”还是“branchA”派生的??

我该如何回答上面的示例问题?

【问题讨论】:

  • 可能的重复确实有点脆弱 - 它可能正是您想要的某些分支,但可能并不涵盖所有内容。可能应该只是链接到它,抱歉。
  • 这无法完成。如果您想了解有关分支的任何信息,git 不是正确的工具。分支(在 git 中)是短暂的,因此非常不可靠。图形工具可以给你提示但没有答案。

标签: git branch git-branch


【解决方案1】:

git merge-base 显示作为两个分支的共同祖先的提交。

简单用法:git merge-base <branch> <branch> 显示两个分支的共同提交。

【讨论】:

  • 参见git-scm.com/docs/git-merge-base 正如它所说,您提供了两个提交ID进行比较。因此,如果您在某个项目中有 master 和 devel 分支,git merge-base master devel 会告诉您提交是这两个分支的共同祖先。
  • 这个命令只返回一个提交哈希。如需更多信息,例如:git log -1 commit-hash ?
【解决方案2】:

对此没有规范的答案,因为分支只是指向 DAG 中某些提交的指针。例如,masterfoo 可能指向同一个提交;如果然后从foo 创建一个分支,它实际上与从master 创建一个分支相同。

也就是说,如果您可视化提交图(通过gitk 或其他一些图形历史工具),您可以大致了解提交图中分支点的位置,以及各种分支指针指向的位置。

【讨论】:

  • 如果您使用 git 的“移植”,您可以创建循环,使其不再是 DAG。显然这很糟糕。 :-)(毫不奇怪......尽管它应该主要是“正常工作”,但我没有尝试过。)我怀疑你也可以使用filter-branch 创建循环,我也没有尝试过。至少,直截了当的合并似乎拒绝了创建循环的尝试。
【解决方案3】:

如果您已经在一个分支上,那么您可以获得从另一个分支分叉的提交点,例如 master,如下所示:

git merge-base --fork-point master

然后使用git show <commit-id> 获取提交消息。 如果你没有提交 ID,那么这个分支就不是来自那个。

例如,我不确定我是从dev 还是master 分叉的:

$ git checkout my-branch
$ git merge-base --fork-point master
$ git merge-base --fork-point dev
1770f75fa178df89a40ddc5f13ecd6bc597c17df
$ git show 1770f75fa178df89a40ddc5f13ecd6bc597c17df
commit 1770f75fa178df89a40ddc5f13ecd6bc597c17df (origin/popup-stack-12, dev)
Merge: 37f79cf f8a9795
Author: Superman <super@example.com>
Date:   Sun Mar 29 23:14:40 2020 +0000
...

我从 dev 分支了这个分支。

【讨论】:

    【解决方案4】:

    正如其他人所提到的,没有规范的答案,但 git reflog 在某些情况下可以通过显示您的本地 git 历史记录来提供帮助:

    a1b2c3d4 (HEAD -> my_current_working_branch) HEAD@{0}: pull origin master: Merge made by the 'recursive' strategy.
    aaaa1111 (origin/my_current_working_branch) HEAD@{1}: commit: Added bar
    def123aa (forgotten_branch) HEAD@{2}: checkout: moving from forgotten_branch to my_current_working_branch
    
    

    在这种情况下,我可以看到我从forgotten_branch 分支到my_current_working_branch,并合并了master

    它不会总是为您提供所需的信息,但在某些情况下会有所帮助。

    【讨论】:

      【解决方案5】:

      您可以使用图形树查看器,我使用gitg 来查看分支和差异,尽管我大部分时间都在使用命令行进行实际工作。

      【讨论】:

        【解决方案6】:

        如果您在 Windows 或 Linux(带有 GUI)上工作,只需安装漂亮的 git-extensions。他们可以完美地可视化您的分支/合并树。

        http://code.google.com/p/gitextensions/downloads/detail?name=GitExtensions207.zip&can=4&q=

        您好,

        【讨论】:

          【解决方案7】:

          命令行 git 可执行文件还能够显示分支和合并的基本树,使用 --graph 选项来 git log。您可以使用其他选项对其进行各种不错的增强。试穿这些尺寸:

          最简单的:git log --graph

          不错:git log --graph --decorate --simplify-by-decoration --color --oneline --date=local

          完整的蒙蒂: git log --graph --decorate --simplify-by-decoration --color --oneline --date=local --pretty=format:'%C(auto) %h %d % C(reset)%s (%C(青色)%ad %ae%C(reset))'

          【讨论】:

            【解决方案8】:

            坚持命名约定,避免所有混乱。

            当从master 创建一个分支时——比如说,实现一个电子邮件功能——你可以将它命名为master_emailfeature。然后,如果您需要从该分支创建一个子分支来实现电子邮件的 ssl,那么您可以将其命名为 master_emailfeature_sslandtls

            这可以通过查看分支的名称来明确哪个分支是从哪个分支创建的。

            【讨论】:

              【解决方案9】:

              如果你想弄清楚你的本地分支是从哪个远程分支派生的,这个命令可以提供一些启示。

              git remote show origin
              

              向下滚动,直到您看到“为 'git pull' 配置的本地分支:”,在其下方,将显示所有本地分支的列表,并且每个远程分支都将与之合并。

              【讨论】:

              • 问题是关于分支点而不是从哪里推送和拉取更改
              • 它帮助了我:)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-09-22
              • 1970-01-01
              • 1970-01-01
              • 2013-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多