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

Arn*_*sen 40 git git-branch

我在git中有一个分支,想要弄清楚它最初分支的分支和什么提交.

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

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

master -- ongoing development
2.2    -- stable maintenance
Run Code Online (Sandbox Code Playgroud)

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

 feature branch:    B'-C'-C--D--E'
                   /     /       
 source branch: A--B--C--D--E-- ...
Run Code Online (Sandbox Code Playgroud)

现在我想合并feature回它的源代码,但我不确定它是否最初是分支master或者2.2.为了将功能合并到正确的来源,有没有发现如果源科是一个纲领性的方式master还是2.2

Fro*_*sty 18

Git仅跟踪单个存储库中的"上游"信息,并且此信息不是静态的,也不是同一存储库的单独克隆之间共享的信息.

从命令行设置此关系的命令是:

git branch --set-upstream <branch> [<start-point>]
Run Code Online (Sandbox Code Playgroud)

查看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
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用gitk或git log来浏览一下:

gitk --all
git log --graph --color --decorate --oneline --all
Run Code Online (Sandbox Code Playgroud)

  • @Arne Claassen:是的.分支只是提交的指针.并且该提交指向其自己的父级,依此类推. (2认同)

AK *_* 12 10

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

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


小智 8

git branch -r
Run Code Online (Sandbox Code Playgroud)

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

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

# git branch -r --contains HEAD~1
  origin/HEAD -> origin/master
  origin/master
Run Code Online (Sandbox Code Playgroud)

或者

git branch -r --contains refs/heads/<local_branch_name>~1
Run Code Online (Sandbox Code Playgroud)

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

# git branch -r --contains HEAD~2
  origin/<parent_remote_branch>
Run Code Online (Sandbox Code Playgroud)

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

#!bin/bash

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

echo "$res"
Run Code Online (Sandbox Code Playgroud)

当然,为了安全起见,您可以限制迭代次数。