我在git中有一个分支,想要从最初分支的分支和什么提交中找出它。
Github似乎知道,因为当你执行pull请求时,它通常会自动设置它应该进入的分支,但我无法弄清楚如何从命令行手动执行此操作。
让我添加一个具体的例子:
master -- ongoing development
2.2 -- stable maintenance
创建了一个功能分支feature
(位于下面的提交B
)并处理了(B'
,C'
& E'
)并合并了来源分支接听C
和D
feature branch: B'-C'-C--D--E'
/ /
source branch: A--B--C--D--E-- ...
现在我想将feature
合并回其来源,但我不确定它最初是master
还是2.2
的分支。为了将该功能合并到正确的源中,是否有一种编程方式来确定源分支是master
还是2.2
?
答案 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"
当然,您可以将迭代数限制为安全方。