GIT - 如何知道分支机构的分支?

时间:2015-04-09 08:28:21

标签: git git-branch

支持我从提交中创建多个分支(aaa,bbb,ccc)。然后,我从一个分支(bbb)创建一个新分支(ddd)并对其进行提交。

然后我将所有东西推到遥控器上。另一个人怎么知道新分支(ddd)来自哪个分支?

我做的git命令是:

  git branch aaa   
git branch bbb   
git branch ccc   
git branch ddd bbb   
git checkout ddd   
echo 2>>文件   
git add file   
git commit -m“2”

git log会显示

  


* commit d259a3b(HEAD,ddd)   
|   
| 2   
|
  
*提交efb038c(develop,ccc,bbb,aaa)   
|   
| 1   
|
  
* commit dd24bb6(master)

甚至可以知道ddd是从bbb分支的?

由于

4 个答案:

答案 0 :(得分:3)

一般来说确实是不可能的。 Git仅记录 1 引用名称(例如分支或标记)指向的单个commit-ID(SHA-1)。 commit 的历史记录仅由该提交的父ID确定,这些父ID不记录分支名称。当你推到遥控器时,你的"推"操作发送您正在推送的提交的SHA-1(对于任何其他链接的对象 - 树和文件,父提交等,以及所有这些对象的内容,根据需要基于&#发送更多SHA-1) 39;在遥控器上丢失了),并要求遥控器将分支设置为指向新的SHA-1。

换句话说,你告诉远程:"这里,提交1234567,并设置分支标签ddd = 1234567"。它可能告诉你这样做我需要另外五个提交",其中一个你标记为bbb,但如果你不告诉遥控器"哦,通过将标签bbb设置为另一个提交的方式"然后它就不会在任何地方获得这些信息。


1 这有点夸大其辞:git还在reflog中记录了存储在标签中的每个SHA-1,包括分支标签。因此,可以回顾标签的历史记录到"找出它的起始位置"。但是有两个限制:reflogs纯粹是本地的,从不通过fetch或push传输;并且reflogs在这些情况下通常在90天后过期(尽管这是可配置的并且还有其他复杂性)。因此,只要我们说这是一个推动步骤,或者允许超过3个月通过,就没有办法说出来。

答案 1 :(得分:1)

分支只不过是指向特定提交的指针。您只能看到从哪个提交ddd分支,而不是从哪个分支。

答案 2 :(得分:1)

分支只是提交的指针。因此,除了观察两个分支在某个点上具有相同的历史之外,不可能看到分支的起源位置。

对于上游某人而言,它与分支的起源无关,只与它包含某个提交(或提交序列)无关。这决定了git如何/如果能够快进或合并分支。

答案 3 :(得分:1)

将这两个函数添加到您的.bashrc中:

function newbranch() {
    history_file=".git/branching_history"
    from=`git rev-parse --abbrev-ref HEAD`
    to=$1
    git checkout -b $1 > /dev/null 2>&1
    DATE=`date '+%Y-%m-%d %H:%M:%S'`
    echo "$DATE: from $from created branch $1" >> $history_file
}

function branchinghistory() {
    cat .git/branching_history
}

然后,当您创建新分支时,请勿运行git checkout -b mybranch,但可以执行以下操作:

newbranch mybranch

这会将您的分支日志存储在.git/branching_history文件中。您可以使用以下方法查看日志:

branchinghistory

输出应为:

2020-04-22 23:59:06: from master created branch mybranch