如果我将更改存储在一个分支中然后删除该分支会怎样?
(1) 我会丢失 stash 的更改吗?
例子:
git stash
git checkout other_branch
git branch -D previous_branch
(2) 此外,上述 stash 和删除步骤是否等同于提交分支中的更改然后删除该分支(就实现的最终状态而言)?即:
git commit -m "Dummy commit, I am terminating this branch"
git checkout other_branch
git branch -D previous_branch
最佳答案
(1) 否。git stash
保存的更改保存为一对(有时是三个)提交。这些提交由名称 stash
引用。如果您将分支名称和标签视为提交的标签(它们是),那么您可以画一张图,例如:
O1 - O2 <-- other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3 <-- branch
.
.......................<-- tag
(如果我可以用不同的颜色标记标签,这可能会更好;我用点表示标签 tag
指向提交 B1
,它“在分支 分支
").
如果你在分支 branch
上并且有一些未保存的更改并运行 git stash
,这就是它的作用:
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3 <-- HEAD=branch
| \
i - w ........<-- stash
(我将 other_branch
和 tag
留在了图中,但它们仍然存在。我写了 HEAD=branch
来暗示HEAD
指向 branch
,branch
指向提交 B3
。)
此处 i
和 w
是您 stash
的“索引”和“工作树”状态。名称 stash
直接指向提交 w
,并且 w
有两个父项(即,是一个“merge 提交”,尽管它实际上不是一个完全 merge ),B3
作为其第一个父级,i
作为其第二个。
当你运行 git branch -D
时,你所做的只是删除标签。因此,假设您 git checkout other_branch
然后删除标签 branch
。现在你有这个:
O1 - O2 <-- HEAD=other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3
| \
i - w ........<-- stash
B3
上没有标签,但 stash 指向 w
,w
指向 B3
。所以一切都还在那里,只要 stash(或 reflog,或两者)将 B3
保持在 git 的内部雷达上,就会一直留在那里。
(2) 否:如您所见,存储仍然具有对分支的引用。然而,一旦你删除那个存储——即删除stash
标签——例如使用git stash drop
——你会得到这个:
O1 - O2 <-- HEAD=other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3
| \
i - w
如果您使用git add
-ed 和git commit
编辑所有更改,您将获得(单个、非 merge )提交,我们可以将其称为B4
,在分支
。分支标签将被移动到指向 B4
,然后您将检查 other_branch
并删除标签,给出:
O1 - O2 <-- HEAD=other_branch
/
M1 - M2 - M3 - M4 <-- master
\
B1 - B2 - B3 - B4
这几乎(但不完全)相同。
(请注意,如果标记 tag
仍然指向 B1
,提交 B1
将一直存在,直到标记也被删除。提交 B2
到 B4
,或 B2
到 w
,只要它们留在那儿,就会一直留在附近——但在reflog。30 天后(或您为 reflog 设置的任何期限),reflog 条目将过期,并且这些提交将有资格进行垃圾收集。)
关于git - 如果我将更改存储在一个分支中然后删除该分支会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866837/