個人主人有兩個分支: html
有沒有辦法將昨天的提交從wss複製到v2.1? git
您能夠從要複製的提交中建立補丁 , 並將補丁應用於目標分支。 bash
你應該有一個工做流程,讓你經過合併完成全部這些: spa
- x - x - x (v2) - x - x - x (v2.1) \ x - x - x (wss)
因此你要作的就是git checkout v2.1
和git merge wss
。 若是因爲某種緣由你真的不能這樣作,而且你不能使用git rebase將你的wss分支移動到正確的位置,從某個地方獲取單個提交併將其應用到別處的命令就是git cherry-pick 。 只需查看要應用它的分支,而後運行git cherry-pick <SHA of commit to cherry-pick>
。 .net
rebase能夠爲您節省的一些方法: code
若是您的歷史記錄以下: htm
- x - x - x (v2) - x - x - x (v2.1) \ x - x - x (v2-only) - x - x - x (wss)
您可使用git rebase --onto v2 v2-only wss
將wss直接移動到v2: blog
- x - x - x (v2) - x - x - x (v2.1) |\ | x - x - x (v2-only) \ x - x - x (wss)
而後你能夠合併! 若是你真的,真的, 真的沒法達到你能夠合併的程度,你仍然可使用rebase一次有效地作幾個櫻桃選擇: 索引
# wss-starting-point is the SHA1/branch immediately before the first commit to rebase git branch wss-to-rebase wss git rebase --onto v2.1 wss-starting-point wss-to-rebase git checkout v2.1 git merge wss-to-rebase
注意:爲了作到這一點須要額外工做的緣由是它在您的存儲庫中建立了重複的提交。 這不是一件好事 - 簡單分支和合並的關鍵在於可以經過將提交放在一個地方並將它們合併到須要的任何地方來完成全部事情。 重複提交意味着永遠不會合並這兩個分支的意圖(若是您決定之後再進行,則會產生衝突)。 get
使用
git cherry-pick <commit>
將<commit>
應用於當前分支 。
我本身可能會交叉檢查我在gitk
選擇的gitk
,而後經過右鍵單擊提交條目來選擇它們。
若是你想更自動化(帶有全部危險)並假設自昨天以來全部提交都發生在wss上你可使用git log
生成提交列表( --pretty
由Jefromi建議的--pretty)
git log --reverse --since=yesterday --pretty=%H
因此一切都假設你使用bash
for commit in $(git log --reverse --since=yesterday --pretty=%H); do git cherry-pick $commit done
若是這裏出現問題(有不少潛力),你就會遇到麻煩,由於這會影響實時結帳,因此要麼手動挑選,要麼像Jefromi建議的那樣使用rebase。
對於將最後一次提交從分支wss複製到v2.1的簡單狀況,你能夠簡單地獲取提交id( git log --oneline | head -n 1
)並執行:
git checkout v2.1 git merge <commit>
git cherry-pick
:應用一些現有提交引入的更改
假設咱們有分支A和(X,Y,Z)提交。 咱們須要將這些提交添加到分支B。 咱們將使用cherry-pick
操做。
當咱們使用cherry-pick
,咱們應該按照提交出如今分支A中的相同時間順序在分支B上添加提交。
cherry-pick確實支持一系列提交,但若是你在該範圍內有合併提交,它會變得很是複雜
git checkout B git cherry-pick SHA-COMMIT-X git cherry-pick SHA-COMMIT-Y git cherry-pick SHA-COMMIT-Z
工做流程示例:
咱們能夠用cherry-pick
與選擇
-e或--edit :使用此選項,git cherry-pick將容許您在提交以前編輯提交消息。
-n或--no-commit :一般命令會自動建立一系列提交。 此標誌應用必要的更改來挑選您的工做樹和索引的每一個命名提交,而不進行任何提交。 此外,使用此選項時,索引沒必要與HEAD提交匹配。 櫻桃選擇是針對索引的開始狀態完成的。