簡體   English   中英

Git 藏匿兩個分支

[英]Git stash two branches

情況是這樣的:

  1. 我在分支 A 上進行了更改
  2. 分支 A 上的git stash
  3. git checkout B
  4. 對分支 B 進行了更改
  5. 分支 B 上的git stash
  6. git checkout A
  7. 分支 A 上的git stash pop

在上面列表的第 7 步之后,我在存儲之前在分支 A 上所做的更改沒有回來,但是我在分支 B 上所做的更改在分支 A 上彈出。我在分支 A 上使用了cmd z並且文件轉到了之前的狀態,其中包含我所做的更改。 似乎分支 A 的 HEAD 移動到分支 B 的 HEAD。當我在該分支上git checkout Bgit stash pop時發生了同樣的情況:分支 B 在分支 A 上進行了所有更改,但沒有在分支上進行的更改B. 我再次使用cmd z恢復到我需要的分支狀態。

這在一段時間內給我帶來了很多問題,直到我被允許再次在項目上提交代碼(暫時沒有人可以提交,因為在提交時自動推送到服務器並且經理不希望在項目中添加新代碼)服務器,直到他們運行了一些測試)。 我怎樣才能只彈出在分支上所做的更改而不是在其他分支上所做的更改?

git stash所做的是提交。 1

當然, git commit所做的就是進行一次提交。 那么為什么我們有git stash呢?

這些命令之間的一個顯着區別是git stash所做的提交不在任何分支上 這允許您在一個分支上stash ,然后移動到另一個分支並在那里應用存儲。 換句話說,它可以讓您移動正在進行的工作。

無論如何,您通常可以(但並非總是)移動正在進行的工作。 當當前分支上有未提交的更改時,請參閱Git-checkout another branch 但是,當你不能時,你可以使用git stash來處理這個問題。

另一方面,如果你想“藏在一個分支上”,就像你的情況一樣,你可能最好只進行常規提交,而不是特殊的藏匿提交。 這樣的提交更容易處理,而且也沒有git stash的錯誤 您不太可能遇到此錯誤,但“定期提交更簡單,更容易處理”(在分支上提交,與隱藏)是避免git stash一個很好的理由。

如果你更喜歡使用git stash ,請注意每個新的 stash 都會在“stash stack”中“推動”之前的。 舊的 stash 變為stash@{1} ,而stash@{1}變為stash@{2} ,依此類推。 當您drop (丟棄)或pop (嘗試應用,然后丟棄)一個藏匿處時,其上方堆疊的那些會移回原處——因此,如果您在擁有stash@{4}時使用git stash drop stash@{3} stash@{4}並且stash@{5}也是如此,您現在將剩下stash@{3}stash@{4}

您可以這樣命名任何 stash,包括最近的一個: stash@{0}stash含義相同。 (Git 實際上使用stashreflog實現了所有這些。)


1事實上,它至少進行兩次提交,有時會進行三次。 兩次提交存儲索引和工作樹狀態; 第三次提交(如果存在)來自-u-a並存儲未暫存 ( -u ) 或所有 ( -a ) 文件。 工作樹提交是一個非常奇怪的合並提交,索引提交作為它的第二個父級,第三個提交(如果存在)作為它的第三個父級。 工作樹提交的第一個父級以及索引提交的唯一父級是您運行git stash時當前的提交。

如果你繪制提交圖片段——每當你在 Git 中做任何復雜的事情時,這是一個好主意——索引和工作樹提交對有點懸在原始提交之外, refs/stash引用指向對,而不是分支名稱。 它看起來幾乎像一個小手提包,或者掛在樹枝上以防止熊進入的食物儲藏室,或者類似的東西,所以我喜歡把它稱為“藏匿袋”。

Torek(像往常一樣)提供了一個很好的答案,但我相信這里的簡潔答案只是要注意存儲包含作為堆棧的數據 (LIFO)。 所以當你推送A的工作然后B的工作時,它首先彈出B然后A。所以當你回到A然后做第一個彈出時,你得到了保存的B工作。

無論您從哪個分支藏匿,彈出一個藏匿處都會重新應用最后一個藏匿處! 因此,您發布的問題是在分支 B 上創建的最后一個存儲被重新應用於分支 A。下次,您必須指定要彈出的存儲。

給定問題的解決方案:

  1. 再次隱藏當前狀態
  2. 彈出最后一個之前的藏匿處

僅此而已。

如果您輸入git stash list則會根據您的給定情況顯示類似的內容

stash@{0}: WIP on branch-b
stash@{1}: WIP on branch-a

輸入git stash pop將始終獲得stash@{0}節點。

因此,如果您在branch a並且想要在該分支中應用您的進度。 根據列表,您應該鍵入:

git stash pop stash@{1}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM