如何确定特定分支的源分支?

时间:2011-06-16 15:38:38

标签: git git-branch

我在git中有一个分支,想要从最初分支的分支和什么提交中找出它。

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

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

master -- ongoing development
2.2    -- stable maintenance

创建了一个功能分支feature(位于下面的提交B)并处理了(B'C'& E')并合并了来源分支接听CD

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

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

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:2)

git show-branch [--all]
git merge-base

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

答案 2 :(得分:1)

git branch -r
  

使用--contains,仅显示包含命名提交的分支   (换句话说,提示提交的分支是其后代   命名提交)。使用--merged,只有分支合并到命名   commit(即提示提交的分支)          将列出从命名提交可到达的。使用--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"

当然,您可以将迭代数限制为安全方。