假设我按照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
除了生成的修订历史与文档中所述的不同之外,带有标记A
、B
和C
的提交似乎不属于任何分支。
这些提交发生了什么,为什么没有按照文档的建议完全删除?它们现在属于任何特定的分支吗?
历史记录仍然匹配,Git文档只在两条平行线上绘制它们,您的历史记录将它们显示为一行。
A-B-C-D
和
A-B
C-D
是完全相同的历史。
至于为什么您仍然可以看到旧的提交:git rebase
从不删除提交,它只重新创建/复制它们,然后设置";分支";标签指向新提交。旧的提交仍然在Git对象数据库(.git/objects
目录(中。
git log
从refs(分支或标记(开始,并将显示通过这些refs可访问的所有提交;从ref指向的提交开始,然后遍历每个提交的parent:
指针。
您正在为每个提交运行git tag $commit
,因此即使在创建了它们的副本并移动了原始分支指针之后,它们仍然可以访问。