git rebase的结果与git文档中显示的结果不同



假设我按照git rebase:的主文档中所示的示例创建一个简单的本地repo

A---B---C topic
/
D---E---F---G master

我在windows上,所以我使用Powershell来做这件事,为了方便起见,包括:

md first-example
cd first-example
git init
function Create-Commits
{
param (
$Commits,
$Branch
)
foreach ($commit in $commits)
{
git checkout $Branch
new-item "$commit.txt"
git add "$commit.txt"
git commit -m "$commit"
git tag $commit
}
}
Create-Commits -Commits @("D", "E") -Branch master
git branch topic
Create-Commits -Commits @("A") -Branch topic
Create-Commits @("F") -Branch master
Create-Commits -Commits @("B") -Branch topic
Create-Commits -Commits @("G") -Branch master
Create-Commits -Commits @("C") -Branch topic
git log --graph --format="%(describe:tags=true)" --all
cd ../

现在,根据文档中的文本:

假设存在以下历史,并且当前分支是";主题":

A---B---C topic
/
D---E---F---G master

从这一点开始,以下任一命令的结果:

git rebase master

git rebase master topic

将是:

A'--B'--C' topic
/
D---E---F---G master

当我尝试这个时,以下是我对git log --graph --format="%(describe:tags=true)" --all:的了解

* G-3-g57a4992
* G-2-gcb715a5
* G-1-g5334a53
* G
* F
| * C
| * B
| * A
|/  
* E
* D

以下是git log --graph --format="%(describe:tags=true)" topic

* G-3-g57a4992
* G-2-gcb715a5
* G-1-g5334a53
* G
* F
* E
* D

以下是我对git log --graph --format="%(describe:tags=true)" master的了解

* G
* F
* E
* D

除了生成的修订历史与文档中所述的不同之外,带有标记ABC的提交似乎不属于任何分支。

这些提交发生了什么,为什么没有按照文档的建议完全删除?它们现在属于任何特定的分支吗?

历史记录仍然匹配,Git文档只在两条平行线上绘制它们,您的历史记录将它们显示为一行。

A-B-C-D

A-B

C-D

是完全相同的历史。

至于为什么您仍然可以看到旧的提交:git rebase从不删除提交,它只重新创建/复制它们,然后设置";分支";标签指向新提交。旧的提交仍然在Git对象数据库(.git/objects目录(中。

git logrefs(分支或标记(开始,并将显示通过这些refs可访问的所有提交;从ref指向的提交开始,然后遍历每个提交的parent:指针。

您正在为每个提交运行git tag $commit,因此即使在创建了它们的副本并移动了原始分支指针之后,它们仍然可以访问。

最新更新