【问题标题】:How do I determine the source branch of a particular branch?如何确定特定分支的源分支?
【发布时间】:2011-06-16 15:38:37
【问题描述】:

我在 git 中有一个分支,想弄清楚它最初是从哪个分支分支以及在什么提交时分支的。

Github 似乎知道,因为当您发出拉取请求时,它通常会自动设置它应该进入的分支,但我无法弄清楚如何从命令行手动执行此操作。

让我添加一个具体的例子:

master -- ongoing development
2.2    -- stable maintenance

创建了一个功能分支feature(在下面的提交B)并处理(B'C'E')并与源分支合并以获取C 和@987654329 @

 feature branch:    B'-C'-C--D--E'
                   /     /       
 source branch: A--B--C--D--E-- ...

现在我想将feature 合并回它的源,但我不确定它最初是master 还是2.2 的分支。为了将功能合并到正确的源中,是否有编程方式来确定源分支是master 还是2.2

【问题讨论】:

  • 尝试重新表述您的问题,不要使用含糊不清的术语“刷新”。据我所知,它还没有接受意义。也许你的意思是“变基”?还是“合并”?
  • @Frosty - 我已经澄清,从你的回答中听起来我正在寻找的信息不存在。我只能通过查看提交或图表来“判断”起源并做出有根据的猜测。
  • 很好地使用了 ASCII 艺术。 +1。 (顺便说一句,这也是个好问题)

标签: git git-branch


【解决方案1】:

Git 仅跟踪各个存储库中的“上游”信息,并且该信息不是静态的,也不是在同一存储库的不同克隆之间共享。

从命令行设置这种关系的命令是:

git branch --set-upstream <branch> [<start-point>]

查看 git-diff 的输出可能会给你一个线索:

git diff <mybranch>..master # commits in master that are not in mybranch
git diff <mybranch>..2.2 # commits in 2.2 that are not in mybranch

很可能列出的提交较少的那个是分支点(但这显然不能保证。

你也可以用gitk,或者git log来看看:

gitk --all
git log --graph --color --decorate --oneline --all

【讨论】:

  • 我认为你的回答意味着创建一个分支仅仅是一个开始新提交的指针,所以我可以追踪分支之间的常见提交,但提交不“属于”分支,所以它是无法找到启动当前分支的提交以及它当时属于哪个分支。
  • @Arne Claassen:是的。分支只是指向提交的指针。该提交指向它自己的父级,依此类推。
  • git log --graph --color --decorate --oneline --all 似乎是让我最容易弄清楚的那个,但这肯定不是一个简单的答案。我想知道 github 如何知道拉取请求应该针对哪个分支。他们只是有一种算法可以做出有根据的猜测吗?
【解决方案2】:
git show-branch [--all]
git merge-base

第一个将向您显示分支并为您提供合并信息。第二个将帮助您了解两个特定分支之间的关系(它们最后分歧的地方)。

【讨论】:

    【解决方案3】:
    git branch -r
    

    使用--contains,只显示包含命名提交的分支 (换句话说,尖端提交的分支是 命名提交)。使用--merged,只有分支合并到命名的 提交(即提示提交的分支是 可从命名的提交访问)将被列出。使用 --no-merged 只会列出未合并到命名提交中的分支。如果缺少参数,则默认为 HEAD(即 当前分支的尖端)。

    考虑到之前的提交已经推送到远程分支,可以使用 --contains 键过滤可用的远程分支。

    # git branch -r --contains HEAD~1
      origin/HEAD -> origin/master
      origin/master
    

    git branch -r --contains refs/heads/<local_branch_name>~1
    

    如果您还有 2 个未推送的提交,则相应地更改数量以达到已推送的提交:

    # git branch -r --contains HEAD~2
      origin/<parent_remote_branch>
    

    如果本地非推送提交的数量未知,您可以循环直到获得结果,例如:

    #!bin/bash
    
    i=0;
    res=; 
    while [ -z "$res" ]; do 
        res=$(git branch -r --contains HEAD~$i); 
        echo "$i"; 
        i=$(($i+1)); 
    done
    
    echo "$res"
    

    当然,您可以限制迭代次数以确保安全。

    【讨论】:

      【解决方案4】:

      如果您已经在系统中创建了分支,您可以使用git reflog 来检查源分支。它将有一行指示您的checkout 操作。例如:

      6f52daa (origin/master, origin/HEAD, master) HEAD@{4}: checkout: moving from master to sample-branch
      

      【讨论】:

        猜你喜欢
        • 2012-12-06
        • 2017-05-05
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 2017-02-17
        • 2021-12-29
        • 2022-01-13
        • 2019-10-10
        相关资源
        最近更新 更多