2011-10-18 46 views
5

我在這裏有2個分支,比如說branch1和branch2。 branch1中增加了許多新功能,並且branch2是穩定的。今天,我想從branch1合併1個特徵到branch2。所以,我只是運行git cherry-pick <commit-for-feature1-in-branch1。我想應該只有<commit-for-featur1-in-branch1中的變化纔會合併到branch2中。但我發現其他功能還包含更多更改。爲什麼選櫻桃選擇改變多個提交?

我認爲它會得到僅用於該指定提交的差異,對吧?

僅供參考,分支1中的提交是從其他開發分支合併的,這是否可能導致此問題?

有什麼問題嗎?

謝謝。

+2

你肯定指定承諾不包括更多變化比你想象的要多? – VonC

+0

是的,我試圖看到該提交的差異:git diff revision^revision。那是我需要的。 – Rocky

回答

3

git cherry-pick所做的是需要您指定的提交,並讀取它與它的父級之間的差異。這有效地使補丁。然後它將這個補丁應用到當前檢出的分支。

在你的情況下,提交包含了其他功能的增加。您可以仔細檢查,確保提交信息對應於您認爲該功能是通過看這個承諾將與git log生成補丁什麼:

git log -p -1 <sha1-of-your-commit> 

-p告訴登錄到不僅顯示提交信息,如作者,日期和提交信息,還包括提交引入的補丁(或差異)。 -1選項告訴git日誌在1次提交後停止列出歷史記錄。

+0

感謝您的回答。我檢查了日誌。這正是我想要的。但是在我運行git cherry-pick之後,它在該提交中添加了額外的代碼。而FYI,branch1的提交是從其他開發分支合併的,這是否可能導致此問題? – Rocky

+0

代碼在您的分支。在你櫻桃採摘的分支上運行'git log -p -1'並查看添加的內容。如果額外的東西不存在,這意味着它已經存在於該分支。要檢查哪個提交添加了一段代碼,'git log -Ssometextfromafeature'將顯示添加該代碼的內容。 –

1

我也碰到過這樣的行爲......我跟蹤它到下面的解釋,但也許有人澄清這是一個更:

  • 你挑櫻桃的提交,提交包含1在1個文件
  • 您會注意到包含在提交而且更多的變化(主要是圍繞這種改變被包括在內)

這是因爲在提交的變化取決於先前的變化不僅改變而改變。所以這個代碼區域在你想要挑選目標分支後被多次改變。

Git追溯到歷史記錄中,直到櫻桃挑選來源與目標匹配並根據此修訂創建補丁。這就是爲什麼越來越多的變化可能會出現...

我覺得這種行爲有點嚇人,因爲人們會認爲只能從指定的提交哈希值的變化採摘