2009-09-10 34 views
74

採取這樣的場景:使用GIT,我怎樣纔能有選擇地從另一個'fork'中取出/合併更改?

  1. 我決定「叉」上github.com一個代碼庫,並開始做我的例行:編輯 - 提交 - 推;又名黑客黑客入侵。
  2. 在我做了一些改動之後,我看到另一個人在同一個項目上做了一些改變,我喜歡他們!
  3. 我決定我想將它們合併到我的。問題是,我只想要一個特定提交的'部分',他提出了幾個提交。

什麼是最有效的方法來獲得這些選擇的變化量,合併到我的'叉'?

回答

112

曳IRC世界波後,有人給了一個很好的解決方案:

git cherry-pick SHA1 --no-commit 
git add --patch 

希望幫助別人同樣的問題!

編輯:好的,也許它不是那麼簡單。下面是完整的步驟:

  1. 首先,你必須在你的倉庫,做必要的cd -ing到你的工作目錄。

  2. 您現在需要添加遠程分支,然後獲取它。通過這樣做:

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. 您現在可以運行命令如git log someUser/master找到你想要的「部分」合併提交SHA1。

  4. 一旦你的SHA,你就可以執行:

    git cherry-pick -n SHA1

    其中SHA1是提交SHA,咄!

  5. 很可能會有衝突,具體取決於承諾的年齡以及項目特定領域的變化頻率。對不起,您必須使用可靠的編輯器手動解決這些問題。因此,請拔出VIM或其他任何您使用的軟件,然後徹底解決衝突,直到您進入喜歡更改的階段。

  6. 現在你必須重置索引和HEAD版本,那麼你就可以使用值得信賴的GIT add --patch命令來挑選你想要什麼樣的變化:

    git reset HEAD

    git add --patchgit add -p

  7. 耶!提交時間:

    git commit -m "I merged a select amount of changes"

  8. 爲了收拾殘局,並只保留在你的工作庫中選擇的改變(你在git add --patch說沒有的東西),運行:

    git reset --hard HEAD

    顯然git checkout -f也是另一種選擇。

+0

我很高興你發現'git add -p';它非常強大。如果你已經有了提交的問題(例如沒有在cherry-pick上使用'--no-commit',或者它是你的提交之一),你可以使用'git reset HEAD ^'來倒回索引提交返回,然後使用'git add -p'將這些更改添加回來,然後逐步提交。如果提交不在分支提示,您可以使用'git rebase -i'並選擇編輯提交的問題。 – Cascabel 2009-09-10 16:11:18

+0

非常感謝! – 2011-01-31 21:26:22

+1

不錯的演練。 記住,如果你只是想要**整個**提交,你只需在步驟4中發出'-n'。像這樣:'git cherry-pick SHA1' – Hulvej 2014-10-17 08:01:48

1

如果你只想提交一個提交的端口,你可能最好選擇你想要的提交併重置你不想觸及的文件。

git cherry-pick SHA1 
git checkout HEAD file1 file2 ... fileN 

當然,如果你有一個文件修改幾個部分,只希望保留他們中的一些你沒有選擇,只能手動編輯文件,切割出自己的變化。

+2

這裏需要檢出嗎?櫻桃挑選命令不會將更改放到工作目錄中嗎? – 2010-09-10 22:36:35

2

我不清楚你想要什麼。如果您只想從其他叉子中引入某些提交,則可以使用git cherry-pick SHA。關於gitready的完整說明。

+0

我只是在一個特定提交的'部分'/'部分'/'幾行'之後,合併到了我的存儲庫中。不特別針對文件。 – Tim 2009-09-10 12:45:42

+0

在這種情況下,git format-patch SHA,git apply 是一個選項 – hgmnz 2009-09-10 13:00:53

2

我真的很喜歡蒂姆的解決方案,但有時候我喜歡在vimdiff中修飾。我對這個問題的解決方案很粗糙,但它對我很有用,因爲我喜歡vim。

我已經Vimdiff可以設置爲我的difftool,然後有選擇地合併I DIFF分支:

git difftool <branch> <file> 

然後我去與當前分支的版本窗格和編輯原始的VIM(有時這ISN 「T必要的,但有時Vimdiff可以打開/ tmp下的版本),並禁用只讀模式:

:e <file> 
:set readonly! 

現在我可以使用vim的補丁工具,如dodp申請我想要什麼,並進行其他小我去的時候編輯。當我完成後,我保存文件,退出vim,然後在git中定期和提交文件,就像常規編輯一樣。如我所說,這並不是特別複雜,但它非常強大,而且仍然純粹在命令行中。只要確保添加一個明確的提交消息,因爲git不會自動爲您包含合併消息。

vimdiff example http://j.mp/1dZVllt

+0

我不認爲這個答案完全符合值得成爲一個獨立的完全答案。有用的信息,但不是特別相關。 (爲什麼這是答案的頂部?) – 2015-07-13 03:20:50

相關問題