2016-03-29 80 views
0

我最近就遇到了這個Web項目:git可以提示我爲rebase上的每個文件嗎?

git branch new-feature 
git checkout new-feature 

砍砍砍......

「博斯曼:哎,有一個在主人需要修復bug,彈指一揮間」

git commit -a -m "Partially completed migration changes" 
git checkout master 
git branch bugfix 
git checkout bugfix 

砍砍砍...... 測試測試測試...

「OK,固定的!」

git checkout master 
git merge bugfix 

走上完成的功能,但我們不要再介紹的bug ......

git checkout new-feature 
git rebase master 

First, rewinding head to replay your work on top of it... 
Applying: some commit info 
Using index info to reconstruct a base tree... 
... 
Auto-merging /some/buggy/file 
CONFLICT (content): /some/buggy/file 
Auto-merging /some/buggy/file 
CONFLICT (content): /some/buggy/file2 
Auto-merging /some/buggy/file 
CONFLICT (content): /some/buggy/file3 
... 

如果我碰巧知道特定文件是無關的新功能,我該怎麼辦交互強制文件從rebase源複製?

有沒有辦法告訴git提示我的東西,如:

copy /some/buggy/file master? y/n 
copy /some/buggy/file2 master? y/n 
... 

回答

1

再次基於由重複git cherry-pick操作(或一個單一的EN-集體挑在某些情況下,但是這相當於同樣的事情):它將基於您的重設規範(基本上爲<upstream>..HEAD)所選的所有提交併將這些提交複製到新提交,其中--onto參數(缺省爲<upstream>參數的提示)上生成的新鏈。

做的櫻桃採摘需要的角度小的變化:通過提交-ID的它保存從<upstream>..HEAD離開較早之前就變基通過檢查在--onto點匿名(分離的HEAD)的分支開始,然後遍歷脫離HEAD。這是挑選合併衝突的挑選步驟(這就是爲什麼您經常需要反覆解決合併衝突的原因,每次提交都會被挑選出來)。

這意味着要回答您的問題,除git rebase文檔外,我們可能還想查看the git cherry-pick documentation。在那裏,我們發現:

當不明顯如何應用的改變,會發生以下情況:

  1. 在最後的當前分支和HEAD指針停留提交成功進行。

  2. CHERRY_PICK_HEAD ref被設置爲指向引入難以應用的更改的提交。

這意味着,在這種狀態下,我們可以使用git checkout HEAD -- path/to/file(該--實際上並不在這裏必需的,但a good habit)或git checkout CHERRY_PICK_HEAD -- path/to/file

因爲我們現在挑肥揀瘦,不重訂(仍在繼續的底墊,我們只是在這一點上,摘櫻桃階段),HEAD指最近成功提交。如果衝突發生在第一次提交時,HEAD引用與您的具體示例中的master相同的提交,而CHERRY_PICK_HEAD引用從原始new-feature分支複製的提交。如果衝突進一步發展,HEAD指的是在未來的匿名分支上增加的一個新提交(再次使用您的示例)master。在這兩種情況下,這是你真正想要的。

(附註:如果你知道你沒有觸及該文件,這將是相同的,在這種情況下,無論是CHERRY_PICK_HEAD提交master提交,這樣你就可以使用git checkout master -- path/to/file相反,但是,這是假設您正在使用master的頂端,而使用名稱CHERRY_PICK_HEAD可以使其與目標提交無關。)

一旦櫻桃採摘階段完成,git rebase需要然後通過更改重新設計的分支名稱來完成重新分配,在這種情況下,指向新匿名分支上的最小部分提交(此例中爲new-feature)。在所有這些櫻桃採摘之前,舊的(預先轉發)分支小費仍然在new-feature(如[email protected]{1}或其他任何命名方式)的推薦日誌中。它也可在ORIG_HEAD這一點,直到你運行的東西,覆蓋ORIG_HEAD(各種git命令,包括git am,git mergegit reset,也寫ORIG_HEAD)。如果你不小心加入了rebase,這個特別方便。

相關問題