GIT - 如何知道一个分支从哪个分支分支出来?
GIT - How to know the branch a branch branched from?
支持我从一次提交创建多个分支(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 >> file
git add file
git commit -m "2"
git 日志会显示
* commit d259a3b (HEAD, ddd)
|
| 2
|
* commit efb038c (develop, ccc, bbb, aaa)
|
| 1
|
* commit dd24bb6 (master)
甚至可以知道ddd是从bbb分支出来的?
谢谢
分支只不过是指向特定提交的指针。您只能看到 ddd
从哪个提交分支,而不是哪个分支。
分支只是指向提交的指针。因此,除了观察到两个分支在某个点上具有相同的历史之外,不可能看到分支起源于何处。
对于上游的某个人来说,分支起源于何处并不重要,只在于它包含某个提交(或提交序列)。这决定了 how/if git 能够快进或合并分支。
总的来说确实是不可能的。 Git 仅记录1 引用名称(例如分支或标记)指向的单个提交 ID (SHA-1)。 commit 的历史仅由该提交的父 ID 决定,不记录分支名称。当您推送到远程时,您的 "push" 操作会发送您正在推送的提交的 SHA-1(加上更多用于任何其他链接对象的 SHA-1——树和文件、父提交等——加上内容所有这些对象,根据需要根据遥控器上缺少的内容),并要求遥控器设置 its 分支以指向新的 SHA-1。
换句话说,你告诉遥控器:"here, have commit 1234567, and set branch label ddd
= 1234567"。它可能会告诉您 "to do that I need five other commits",其中一个您已标记为 bbb
,但如果您不告诉遥控器 "oh by the way set label bbb
to this other commit too",那么它在任何地方都不会有该信息。
1这有点夸张:git还在reflog中记录了存储在标签中的每个SHA-1,包括分支标签.因此可以通过标签的历史返回到 "figure out where it started"。不过,这有两个限制:reflogs 是纯粹本地的,从不通过 fetch 或 push 传输;并且 reflogs 过期,在这些情况下通常在 90 天后(尽管这是可配置的并且有额外的复杂性)。所以只要我们说有一个push步骤,或者允许超过3个月过去,就没法说了。
将这两个函数添加到您的 .bashrc 中:
function newbranch() {
history_file=".git/branching_history"
from=`git rev-parse --abbrev-ref HEAD`
to=
git checkout -b > /dev/null 2>&1
DATE=`date '+%Y-%m-%d %H:%M:%S'`
echo "$DATE: from $from created branch " >> $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
支持我从一次提交创建多个分支(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 >> file
git add file
git commit -m "2"
git 日志会显示
* commit d259a3b (HEAD, ddd)
|
| 2
|
* commit efb038c (develop, ccc, bbb, aaa)
|
| 1
|
* commit dd24bb6 (master)
甚至可以知道ddd是从bbb分支出来的?
谢谢
分支只不过是指向特定提交的指针。您只能看到 ddd
从哪个提交分支,而不是哪个分支。
分支只是指向提交的指针。因此,除了观察到两个分支在某个点上具有相同的历史之外,不可能看到分支起源于何处。
对于上游的某个人来说,分支起源于何处并不重要,只在于它包含某个提交(或提交序列)。这决定了 how/if git 能够快进或合并分支。
总的来说确实是不可能的。 Git 仅记录1 引用名称(例如分支或标记)指向的单个提交 ID (SHA-1)。 commit 的历史仅由该提交的父 ID 决定,不记录分支名称。当您推送到远程时,您的 "push" 操作会发送您正在推送的提交的 SHA-1(加上更多用于任何其他链接对象的 SHA-1——树和文件、父提交等——加上内容所有这些对象,根据需要根据遥控器上缺少的内容),并要求遥控器设置 its 分支以指向新的 SHA-1。
换句话说,你告诉遥控器:"here, have commit 1234567, and set branch label ddd
= 1234567"。它可能会告诉您 "to do that I need five other commits",其中一个您已标记为 bbb
,但如果您不告诉遥控器 "oh by the way set label bbb
to this other commit too",那么它在任何地方都不会有该信息。
1这有点夸张:git还在reflog中记录了存储在标签中的每个SHA-1,包括分支标签.因此可以通过标签的历史返回到 "figure out where it started"。不过,这有两个限制:reflogs 是纯粹本地的,从不通过 fetch 或 push 传输;并且 reflogs 过期,在这些情况下通常在 90 天后(尽管这是可配置的并且有额外的复杂性)。所以只要我们说有一个push步骤,或者允许超过3个月过去,就没法说了。
将这两个函数添加到您的 .bashrc 中:
function newbranch() {
history_file=".git/branching_history"
from=`git rev-parse --abbrev-ref HEAD`
to=
git checkout -b > /dev/null 2>&1
DATE=`date '+%Y-%m-%d %H:%M:%S'`
echo "$DATE: from $from created branch " >> $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