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

时间:2013-09-18 08:01:48

标签: git git-stash

如果我在分支中存储更改然后删除该分支会发生什么?

(1)我是否会失去隐藏的变化?

示例:

git stash
git checkout other_branch
git branch -D previous_branch

(2)此外,上述存储和删除步骤是否等同于在分支中提交更改然后删除该分支(就最终状态而言)?即:

git commit -m "Dummy commit, I am terminating this branch"
git checkout other_branch
git branch -D previous_branch

2 个答案:

答案 0 :(得分:10)

(1)否。git stash保存的更改将保存为一对(或有时是三个)提交。这些提交由名称stash引用。如果您将分支名称和标记视为提交的标签(它们是 ),那么您可以绘制图片,例如:

          O1 - O2             <-- other_branch
        /
M1 - M2 - M3 - M4             <-- master
   \
     B1 - B2 - B3             <-- branch
      .
       .......................<-- tag

(如果我可以对标签进行不同的着色,这可能会更好;我使用点来表示标记tag指向提交B1,即“在分支branch上”

如果你在分支机构branch上并且有一些未保存的更改并运行git stash,那就是它的作用:

        /
M1 - M2 - M3 - M4             <-- master
   \
     B1 - B2 - B3             <-- HEAD=branch
                | \
                i - w ........<-- stash

(我将other_branchtag从图中移出,但它们仍然存在。我写HEAD=branch暗示HEAD指向{{1} }},branch指向提交branch。)

此处B3i表示您w编辑的“索引”和“工作树”。名称stash直接指向提交stashw有两个父项(即,它是“合并提交”,即使它根本不是合并),{{1 }}作为其第一个父项,w作为其第二个。

当您运行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指向w。所以一切都仍在那里,并且只要存储(或reflog,或两者)将w保留在git的内部雷达上,它就会一直存在。

(2)否:正如您所看到的,存储仍然具有对分支的引用。但是,一旦你删除那个藏匿 - 例如,删除B3标签 - 例如B3 - 你得到这个:

stash

如果您git stash drop - 编辑并 O1 - O2 <-- HEAD=other_branch / M1 - M2 - M3 - M4 <-- master \ B1 - B2 - B3 | \ i - w 编辑了所有更改,您将获得(单一,非合并)提交,我们可以在{{git add上调用git commit 1}}。分支标签已移至指向B4,然后您将检出branch并删除标签,并提供:

B4

几乎(但不完全)相同。

(请注意,如果标记other_branch仍指向 O1 - O2 <-- HEAD=other_branch / M1 - M2 - M3 - M4 <-- master \ B1 - B2 - B3 - B4 ,则提交tag将一直存在,直到标记也被删除。通过B1提交B1 ,或B2B4,只有在它们停留在那里时才会保留 - 但在reflog中不可见。在30天后(或者你为reflog到期设置的任何内容),reflog条目到期,这些提交有资格进行垃圾收集。)

答案 1 :(得分:1)

  1. Stashing获取工作目录的脏状态并将其保存在堆栈中。如果您隐藏了某些内容然后删除了上一个分支,则您的隐藏更改不会消失。您可以使用以下命令列出存储堆栈上的内容:
  2. git stash list

    实际上,您可以保存存储,切换到另一个分支,然后尝试重新应用存储。不必在同一分支上应用存储。

    在第二种情况下,你仍然需要在应用存储后进行git commit。