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

Pra*_*tal 15 git git-stash

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

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

例:

git stash
git checkout other_branch
git branch -D previous_branch
Run Code Online (Sandbox Code Playgroud)

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

git commit -m "Dummy commit, I am terminating this branch"
git checkout other_branch
git branch -D previous_branch
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 11

(1)否.保存的更改将git stash保存为一对(或有时是三个)提交.这些提交由名称引用stash.如果您认为分支名称和标签为标签的提交(这是他们什么),那么你可以画一幅画,如:

          O1 - O2             <-- other_branch
        /
M1 - M2 - M3 - M4             <-- master
   \
     B1 - B2 - B3             <-- branch
      .
       .......................<-- tag
Run Code Online (Sandbox Code Playgroud)

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

如果你在分支上branch并且有一些未保存的更改并运行git stash,那么它就是这样做的:

        /
M1 - M2 - M3 - M4             <-- master
   \
     B1 - B2 - B3             <-- HEAD=branch
                | \
                i - w ........<-- stash
Run Code Online (Sandbox Code Playgroud)

(我离开other_branch,并tag出图,但他们仍然有太多.我写HEAD=branch暗示HEAD指向branch,并且branch指向提交B3.)

这里iw是"指数"和"工作树"说你stash编.该名称stash直接指向commit w,并且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
Run Code Online (Sandbox Code Playgroud)

没有标签直接打开,B3但是藏匿点指向w,并w指回B3.所以一切都还在那里,并且只要存储(或reflog,或两者)保持B3在git的内部雷达上,它就会一直存在.

(2)否:正如您所看到的,存储仍然具有对分支的引用.然而,一旦你丢下那个藏匿 - 即删除stash标签 - git stash drop例如 - 你得到这个:

          O1 - O2             <-- HEAD=other_branch
        /
M1 - M2 - M3 - M4             <-- master
   \
     B1 - B2 - B3
                | \
                i - w
Run Code Online (Sandbox Code Playgroud)

如果您git add编写了git commit所有更改,您将获得(单个,非合并)提交,我们可以调用B4branch.分支标签将被移动到指向B4,然后您将检出other_branch并删除标签,给出:

          O1 - O2             <-- HEAD=other_branch
        /
M1 - M2 - M3 - M4             <-- master
   \
     B1 - B2 - B3 - B4
Run Code Online (Sandbox Code Playgroud)

几乎(但不完全)相同.

(请注意,如果标记tag仍然指向B1,则提交B1将一直存在,直到标记也被删除.只要它们保留在那里 - 但是在reflog中看不见,B2通过B4B2通过w,只会保留.30天后(或者其他)你为reflog expiry设置了,reflog条目到期了,那些提交有资格进行垃圾回收.)


Shu*_*nya 6

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

git 存储列表

事实上,你可以保存一个 stash,切换到另一个分支,然后尝试重新应用这个 stash。没有必要在同一个分支上应用 stash。

在第二种情况下,您仍然需要在应用 stash 后执行 git commit。