2015-09-07 66 views
0

關於此問題的幾個問題,但我無法找到一個明確的最小示例。比方說,我們希望將特定分支的提交應用於多個分支,而不需要補丁提交之前的遺留提交。例如。應用git補丁 - 基本示例

mkdir cherry_test 
cd cherry_test 
git init 
printf "one\ntwo\nfour\n" > file.txt 
git add file.txt; git commit -m 'master: 1' 
git branch dev 
echo five >> file.txt 
git add file.txt; git commit -m 'master: 2' 
git checkout dev 
echo FIVE >> file.txt 
git add file.txt; git commit -m 'dev: 3' 
echo SIX >> file.txt 
git add file.txt; git commit -m 'dev: 4' 

現在,讓我們做一個補丁來填補空白(插入缺失行的「三」):

perl -0777 -i -pe 's/two\nfour/two\nthree\nfour/igs' file.txt 
git add file.txt; git commit -m 'dev patch' 

在這一點上,我不清楚如何應用這個補丁掌握無額外的大寫數字提交也修補。說..

git log 
commit d44425da786e161dd066b5db6db8b649b99ba575 
author etc 
    dev patch 

然後this answer表明,我們需要使用git format-patch -1 d44425da。但那麼如何將這與master和其他分支合併?我的努力似乎都導致以前的dev提交也合併。

+3

'git checkout master有什麼問題; git cherry-pick d44425da786e161dd066b5db6db8b649b99ba575'? – nishantjr

+0

就是這樣。我從給出的例子中想到,'cherry-pick'調用是由'dev'完成的。那麼所有使用'patch','apply'和'am'的業務都是爲了修補所有分支? – geotheory

+0

我認爲這通常是電子郵件補丁。 – nishantjr

回答

1

cherry-pick命令從特定提交創建一個補丁,它是父代,並將該提交應用於當前的分支。這應該適合你:

git checkout master 
git cherry-pick <commit-id> 

Git用戶命令很少修改未檢出的分支的分支指針。所以如果一個命令修改了一個分支,假設它是簽出分支。


因此補丁的所有業務,應用和我是打補丁的所有分支?

看看man pages,這些似乎是通過電子郵件發送補丁或從「補丁」文件中應用補丁。

git的格式補丁 - 準備電子郵件提交
混帳上午補丁 - 從郵箱中應用了一系列的補丁
混帳應用 - 應用一個補丁文件和/或索引


的「手冊頁」的混帳通常是找出如何使用一個git命令非常好的資源。 您可以通過運行git help cherry-pickman git cherry-pick查看它們或看它online

另一個偉大的文章,以git的起步是Git for computer scientists。它解釋了(令人驚訝的簡單)git的內部工作,一旦你明白了,使用git變得非常直觀。

+1

感謝您的解釋和有用的eagain.net文章鏈接 – geotheory

+1

顯示幫助的Windows兼容命令是'git help cherry-pick'。 – Melebius

+0

@Melebius:謝謝,編輯。 geotheory樂於提供幫助 – nishantjr

0

正如nishantjr建議的那樣,您當然可以用櫻桃挑選來做到這一點。

但是,這取決於你如何做開發,我可能會想到是這樣的:

就掌握的修復程序:

git checkout master 
perl -0777 -i -pe 's/two\nfour/two\nthree\nfour/igs' file.txt 
git add file.txt; git commit -m 'master patch' 

現在,合併來自主變爲開發。我會用git merge,但git rebase將同樣的工作:

git checkout dev 
git merge master 

對於您正在試圖做的,你可能不應該使用git format-patchgit apply,或git am什麼。例如,只有在需要時才需要這些文件,以便將修補程序文件通過電子郵件發送給其他人。但是現在這是一個非常罕見的用例,因爲從github之類的應用中獲取比應用補丁文件要容易得多。

編輯: 合併主之後,你將有一個衝突,因爲您在Dev分支加入主分支fiveFIVE\nSIX。運行git status將提供有關如何解決衝突的基本信息。你的file.txt看起來是這樣的:

one 
two 
three 
four 
<<<<<<< HEAD 
FIVE 
SIX 
======= 
five 
>>>>>>> master 

你必須編輯這個文件來告訴git你想要哪個改變。由於我們在開發分支,讓我們保持開發分支的變化。編輯這個文件,看起來像這樣:

one 
two 
three 
four 
FIVE 
SIX 

保存它,然後git add file.txt,然後git commit

+0

謝謝mkasberg,但你的'merge master'調用導致CONFLICT(內容):在file.txt中合併衝突。自動合併失敗;修復衝突,然後提交結果。' – geotheory

+0

我編輯了我的答案,以解釋在這種情況下要做什麼。 – mkasberg

+0

手動編輯文件並不是我真正想到的!然而,「cherry-pick」方法確實可以完美工作,因爲它只是應用了提交的新編輯。 – geotheory