採取這樣的場景:使用GIT,我怎樣纔能有選擇地從另一個'fork'中取出/合併更改?
- 我決定「叉」上github.com一個代碼庫,並開始做我的例行:編輯 - 提交 - 推;又名黑客黑客入侵。
- 在我做了一些改動之後,我看到另一個人在同一個項目上做了一些改變,我喜歡他們!
- 我決定我想將它們合併到我的。問題是,我只想要一個特定提交的'部分',他提出了幾個提交。
什麼是最有效的方法來獲得這些選擇的變化量,合併到我的'叉'?
採取這樣的場景:使用GIT,我怎樣纔能有選擇地從另一個'fork'中取出/合併更改?
什麼是最有效的方法來獲得這些選擇的變化量,合併到我的'叉'?
曳IRC世界波後,有人給了一個很好的解決方案:
git cherry-pick SHA1 --no-commit
git add --patch
希望幫助別人同樣的問題!
編輯:好的,也許它不是那麼簡單。下面是完整的步驟:
首先,你必須在你的倉庫,做必要的cd
-ing到你的工作目錄。
您現在需要添加遠程分支,然後獲取它。通過這樣做:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
您現在可以運行命令如git log someUser/master
找到你想要的「部分」合併提交SHA1。
一旦你的SHA,你就可以執行:
git cherry-pick -n SHA1
其中SHA1
是提交SHA,咄!
很可能會有衝突,具體取決於承諾的年齡以及項目特定領域的變化頻率。對不起,您必須使用可靠的編輯器手動解決這些問題。因此,請拔出VIM或其他任何您使用的軟件,然後徹底解決衝突,直到您進入喜歡更改的階段。
現在你必須重置索引和HEAD版本,那麼你就可以使用值得信賴的GIT add --patch
命令來挑選你想要什麼樣的變化:
git reset HEAD
git add --patch
或git add -p
耶!提交時間:
git commit -m "I merged a select amount of changes"
爲了收拾殘局,並只保留在你的工作庫中選擇的改變(你在git add --patch
說沒有的東西),運行:
git reset --hard HEAD
顯然git checkout -f
也是另一種選擇。
如果你只想提交一個提交的端口,你可能最好選擇你想要的提交併重置你不想觸及的文件。
git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN
當然,如果你有一個文件修改幾個部分,只希望保留他們中的一些你沒有選擇,只能手動編輯文件,切割出自己的變化。
這裏需要檢出嗎?櫻桃挑選命令不會將更改放到工作目錄中嗎? – 2010-09-10 22:36:35
我真的很喜歡蒂姆的解決方案,但有時候我喜歡在vimdiff中修飾。我對這個問題的解決方案很粗糙,但它對我很有用,因爲我喜歡vim。
我已經Vimdiff可以設置爲我的difftool,然後有選擇地合併I DIFF分支:
git difftool <branch> <file>
然後我去與當前分支的版本窗格和編輯原始的VIM(有時這ISN 「T必要的,但有時Vimdiff可以打開/ tmp下的版本),並禁用只讀模式:
:e <file>
:set readonly!
現在我可以使用vim的補丁工具,如do
和dp
申請我想要什麼,並進行其他小我去的時候編輯。當我完成後,我保存文件,退出vim,然後在git中定期和提交文件,就像常規編輯一樣。如我所說,這並不是特別複雜,但它非常強大,而且仍然純粹在命令行中。只要確保添加一個明確的提交消息,因爲git不會自動爲您包含合併消息。
我不認爲這個答案完全符合值得成爲一個獨立的完全答案。有用的信息,但不是特別相關。 (爲什麼這是答案的頂部?) – 2015-07-13 03:20:50
我很高興你發現'git add -p';它非常強大。如果你已經有了提交的問題(例如沒有在cherry-pick上使用'--no-commit',或者它是你的提交之一),你可以使用'git reset HEAD ^'來倒回索引提交返回,然後使用'git add -p'將這些更改添加回來,然後逐步提交。如果提交不在分支提示,您可以使用'git rebase -i'並選擇編輯提交的問題。 – Cascabel 2009-09-10 16:11:18
非常感謝! – 2011-01-31 21:26:22
不錯的演練。 記住,如果你只是想要**整個**提交,你只需在步驟4中發出'-n'。像這樣:'git cherry-pick SHA1' – Hulvej 2014-10-17 08:01:48