2016-12-27 82 views
0

我想知道下面是否有任何不同。應用隱藏的更改和櫻桃採摘更改是否有區別?

(1)

  • git checkout some-branch
  • (做出一些局部變化)
  • git stash save
  • git stash pop

(2)

  • git checkout some-branch
  • (做一些局部改變)
  • git commit -m "too lazy to write a good message";假設提交哈希3282a23d5ddb41328e8a61b4ed5c9faf59af673e
  • git reset --hard origin/some-branch
  • git cherry-pick 3282a23d5ddb41328e8a61b4ed5c9faf59af673e

如果是這樣,有什麼區別?

+0

我有點困惑......它看起來像是在「將」更改「移動」到原來的位置,對嗎?在第一種情況下,你將變化存儲起來立即彈出;這沒有我能想到的淨效果。您仍然在工作樹中進行更改並未提交。在第二種情況下,除非你的分支在這個序列開始時先於原點,櫻桃選擇只是將變化「移動」到他們已經存在的位置......我在這裏錯過了什麼? –

回答

0

git倉庫內部可能會有一些小的差異,因爲在第二種情況下,將創建一個提交,並且commitreset操作將前後移動分支。相反,當git stash不更新分支。如果你想知道,git stash添加內容作爲提交(實際上,它添加2或3個提交條目,我不記得確切)。

你應該能夠看到的差異,如果你嘗試雙雙出局,然後檢查即引用日誌或像其他一些擴展視圖:

gitk --all $(git fsck --no-reflog | awk '/dangling commit/ {print $3}') 

一般而言,對於普通用戶和正常未來的淨效應使用將會是一樣的:分支得到了新的內容,並且臨時提交被隱藏(不一定完全消失 - 作爲reflog或上面的命令顯示)。

0

首先回答標題中的問題:

應用藏匿的變化是從什麼櫻桃採摘提交完全不同。

當您應用隱藏的更改時,存儲器中的更改將作爲未提交的編輯文件應用於工作樹中。

櫻桃挑選一個提交,就是說你想在一個指定的提交中應用「diff」到當前分支並進行提交。你基本上只是從任何地方選擇一個提交,並將其作爲當前分支上的下一個提交。例如,如果您在錯誤的分支上進行了一些提交,並且您希望稍後將它們選擇到正確的分支,那麼這很有用。

然後解釋兩個命令序列之間的差:

有相當一些差異。

git checkout some-branch 
# (make some local changes) 
git stash save 

在實踐中是完全一樣:

git checkout some-branch 
# (make some local changes) 
git commit -a -m "My manually stashed away changes" 
git reset --hard origin/some-branch 

在這兩種情況下,你最終會停留在「一些分支」有沒有存在新的局部變化,但「藏」走。在第一種情況下,當你輸入「git stash list」時,隱藏的變化將會出現,而在第二種情況下,你將不得不運行「git reflog」來找到「隱藏」的變化。

在你的第一個案例(1)中,你之後做了一個「git stash pop」。它會直接撤消上一行(git stash save)。它會將隱藏的更改添加回本地工作樹,但不會添加任何新的提交。 HEAD仍將指向原來的「某個分支」。它還會從「git存儲列表」的輸出中刪除存儲條目。

在你的第二個案例(2)中,你做了一個「git cherry-pick SHA1」。這將直接撤銷前面的命令(git reset --hard)。你會得到提交。爲了得到相同的情況下,(1),你必須運行

git commit -a -m "too lazy to write a good messsage" 
後「混帳藏匿彈出」

我們也可以說:

git checkout some-branch 
# (make some local changes) 
git stash save 
git stash pop 

是多還是少一樣:

git checkout some-branch 
# (make some local changes) 
git commit -a -m "My manually stashed away changes" 
git reset origin/some-branch   # without --hard 

兩個基本上無所作爲(不考慮你得到「無法訪問」承諾,你會能夠在reflog中找到。請注意,無法訪問並不意味着您無法恢復它們。)