git - 如果我将更改存储在一个分支中然后删除该分支会发生什么

标签 git git-stash

如果我将更改存储在一个分支中然后删除该分支会怎样?

(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_branchtag 留在了图中,但它们仍然存在。我写了 HEAD=branch 来暗示HEAD 指向 branchbranch 指向提交 B3。)

此处 iw 是您 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 指向 ww 指向 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 将一直存在,直到标记也被删除。提交 B2B4,或 B2w,只要它们留在那儿,就会一直留在附近——但在reflog。30 天后(或您为 reflog 设置的任何期限),reflog 条目将过期,并且这些提交将有资格进行垃圾收集。)

关于git - 如果我将更改存储在一个分支中然后删除该分支会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866837/

相关文章:

git - 在重置之前将 git 重置撤消至未提交状态?

php - 如何连接 PHP 和 Git 存储库

Git 推送错误 "cannot lock ref" "reference already exists"

git - 使用 Atlassian SourceTree,存储应用期间出错。不知道该怎么办

Git 工作流程 - 从发布分支恢复功能分支

git - Github Action通过时如何 merge 到 protected 分支?

Git 专门列出一个分支的 stash

git - 为什么存储表示为 2 次提交?

Git-branch 切换所有未提交的更改都消失了

git - 如何打印当前分支以外的分支的日志?