2016-11-14 23 views
-1

處理一些代碼並希望稍後保存它的一部分。假設在兩個變更集之間沒有太多的事情發生,我決定去git stash -p。一個小時左右後,我們意識到它會變得毛茸茸的,並且不想鬆開我的藏匿處。所以我想創建一個分支。從git stash中自動引用合併分支

不幸的是做一個簡單的

git branch stash-branch [email protected]{0} 

不會產生我想要的結果。望着樹我看到

* 99b0d0c (refs/stash, stash-branch) WIP on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|\ 
| * d45ddae index on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|/ 
* 2af1f8b (HEAD -> my-dev-branch) PARTIAL but it builds again! 
| * d8bb99f (origin/my-dev-branch) PARTIAL but it builds again! 
|/ 
* fe1296d PARTIAL (doesn't compile) 

我的預期是什麼stash-branch是在d45ddae,但並沒有出現這樣的工作。噢,我會去尋找另一種自動執行此操作的方法。

經過一番搜索,找不到任何東西。所以我的問題:是否有一種自動的方式在[email protected]{N}的提示之前引用提交?我所有的努力導致新制作的分支指向my-dev-branch

編輯:上面的git branch命令是不正確的。已更正。

此外,據我所知git stash branch總是自動檢出分支。在這種情況下,我只想在現有的sha上創建一個新的分支。

基本上,我想創建一個新的分支,而不檢查出來,在d45ddae

回答

1

你形容「創建分支出來藏匿的」,這是與完成:

git stash branch <branchname> [<stash>] 

,但你看作爲一個命令:

git branch [email protected]{0} 

(這是缺乏一個分支名,並運行git branch命令而不是git stash命令)。

好像你什麼是git stash branch,例如:

git stash branch newbr 

(默認是使用主藏匿,[email protected]{0})。這會創建一個新的分支,指向當前保存存儲時的提交,然後應用存儲(與git stash apply),然後成功 - 其中應該「始終」 - 放置存儲。

+0

'git branch'命令是一個錯字。它已被糾正。因爲它只是返回「不是有效的分支名稱」。校正結果如下所示。帶有'git stash branch'的問題在於它自動檢出分支。這不是我想要的。 –

+0

是的,'git stash branch'創建並檢出新分支,以便應用和刪除存儲。創建一個指向存儲的父提交的分支名稱*沒有*切換到它是沒有意義的,因爲該提交將保持引用(通過存儲)直到存儲被刪除,並且您可以隨時通過' ^2'。直到閱讀才能開始使用未隱藏的隱藏提交進行提交,並且希望爲他們提供分支名稱行爲,則不需要分支名稱*。 (不是它*傷害了*,給這些東西的名字很好。) – torek

+0

你比我更努力。我的藏匿名單經常被污染。我通常用快速的'git stash clear'來解決這個問題。使用分支我至少可以給它一個明智的名字,並且更有意識地刪除它。 –

0

直到現在,我完全放棄了大腦的解決方案。這很簡單。基本上我想解決藏匿的第二個父母。

* 99b0d0c (refs/stash, stash-branch) WIP on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|\ 
| * d45ddae index on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|/ 
* 2af1f8b (HEAD -> my-dev-branch) PARTIAL but it builds again! 

因此,爲了創建一個具有正確變更集的新分支,所有需要完成的操作都是遵循第二個父級。即

git branch stash-branch [email protected]{0}^2 

導致以下:

* 99b0d0c (refs/stash) WIP on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|\ 
| * d45ddae (stash-branch) index on my-dev-branch: 2af1f8b PARTIAL but it builds again! 
|/ 
* 2af1f8b (HEAD -> my-dev-branch) PARTIAL but it builds again! 

現在,你爲什麼會想這樣做?說多個文件已經被編輯,只有一些已經被添加。看看下面:

$ git status 
On branch my-dev-branch 
Changes to be committed: 
    (use "git reset HEAD <file>..." to unstage) 

     modified: Makefile 

Changes not staged for commit: 

     modified: README.md 

現在運行下面的命令來看看,我第一次看到的,意想不到的輸出:

$ git show [email protected]{0} 
commit 2cbcfa95123ab775107311286418f95180a0ca55 
Merge: 9e620e0 26f500a 
Author: Trevor Norris <[email protected]> 
Date: Tue Nov 15 11:51:09 2016 -0700 

    WIP on my-dev-branch: 9e620e0 working on stuff 

diff --cc README.md 
index d15916e,d15916e..1cf2d60 
--- a/README.md 
+++ b/README.md 
@@@ -2,6 -2,6 +2,8 @@@ 



++FOO BAR 
++ 

哪兒緩存的變化去了?他們坐在分支承諾存儲(可以通過做git show [email protected]{0}^2驗證這一點)。這意味着可以創建一個新的分支,而不需要檢查它,只需指向緩存的更改:

git branch cached-changes [email protected]{N}^2 
+0

我認爲更好的答案是「緩存更改在哪裏」:他們沒有*去*任何地方。他們是正確的,他們一直在這裏。你在這裏做的是創建一個指向* index * commit的名字。 (這兩者都沒有問題,但是您可能需要考慮工作樹提交,以及第三次提交(如果存在)。請參閱http://stackoverflow.com/a/20412685/1256452和http://stackoverflow.com/ a/20589663/1256452。) – torek

+0

優秀的參考文獻。在閱讀完這些內容後,我會修改我的答案。 –