概述
無論項(xiàng)目大小,當(dāng)你和一群程序員一起工作時,處理多個 Git 分支之間的變更都會變得很困難。有時,與其把整個 Git 分支合并到另一個分支,不如選擇并移動幾個特定的提交。這個過程被稱為 "挑揀", 即 Cherry-pick。
本文將介紹 "Cherry-pick" 的內(nèi)容、原因和方法。
讓我們開始吧~
什么是 Cherry-pick?
通過 cherry-pick
命令,Git 可以將任何分支中的選定提交合并到當(dāng)前的 Git HEAD 分支中。
在執(zhí)行 git merge
或 git rebase
時,一個分支的所有提交都會被合并。而 cherry-pick
命令則允許你選擇單個提交進(jìn)行整合。
區(qū)別圖示如下:
△ 使用 merge 的情況: 在執(zhí)行 merge 或 rebase 時,一個分支的所有提交都會被整合。
△ 使用 cherry-pick 的情況: 允許你選擇個別提交進(jìn)行整合。在本例中,只有 C2 被整合到主分支,而不是 C4。
為什么要用 Cherry-pick?
下面的情況可能更容易理解 "Cherry-pick" 的作用。
想象一下,您正在為即將到來的每周 spring 實(shí)施新功能。代碼準(zhǔn)備就緒后,您將把它推送到遠(yuǎn)程分支,準(zhǔn)備進(jìn)行測試。
然而,客戶并不滿意所有的修改,要求你只提交某些修改。因?yàn)榭蛻暨€沒有批準(zhǔn)下次發(fā)布的所有修改,所以 git rebase
不會產(chǎn)生預(yù)期的結(jié)果。因?yàn)?git rebase
或 git merge
會將上一次沖刺的所有調(diào)整都納入其中。
而 "Cherry-pick" 就能解決這個問題!因?yàn)?"Cherry-pick" 只關(guān)注提交中添加的改動,所以它只會帶來已批準(zhǔn)的改動,而不會添加其他提交。
使用 "Cherry-pick" 還有其他一些原因:
- 這對修復(fù) bug 非常重要,因?yàn)殚_發(fā)分支中的 bug 都是用它們的提交設(shè)置的。
- 通過使用
git cherry-pick
,而不是其他應(yīng)用指定提交的改動的選項(xiàng)(如git diff
),可以避免不必要的爭斗。 - 如果因?yàn)楦?Git 分支的版本不兼容而無法進(jìn)行完整的分支合并,它就是一個很有用的工具。
什么時候用 Cherry-pick?
簡而言之就是:盡量少用。之所以要盡量少用 cherry-pick,是因?yàn)樗苋菀桩a(chǎn)生 "重復(fù)"提交:當(dāng)你使用 cherry-pick 將一個提交整合到 HEAD 分支時,Git 必須創(chuàng)建一個內(nèi)容完全相同的新提交。不過,這是一個全新的提交對象,有自己的 SHA 標(biāo)識符。同時也會失去跟蹤提交歷史的能力。
如果你不按順序提交了很多提交,這些提交就會被記錄在你的分支中,這可能會導(dǎo)致你的 Git 分支出現(xiàn)不理想的結(jié)果。
只要能用傳統(tǒng)的合并或重置來整合,就應(yīng)該這么做。Cherry-pick 應(yīng)保留給不可能這樣做的情況,例如必須創(chuàng)建 Hotfix 或只想從一個廢棄的分支中保存一個或幾個提交。
如何使用 Cherry-pick 命令?
流程概述
下面是使用步驟:
- 拉取本地分支。使用
git fetch
。 - 回到要合并的分支。你可能會通過運(yùn)行
git checkout main
來做到這一點(diǎn)。 - 找到要拉入分支的提交。轉(zhuǎn)到
git log
,為每條提交獲取唯一的提交哈希值。 - "Cherry-pick" 您想要加入該分支的提交。運(yùn)行以下命令:
git cherry-pick <commit sha>
。這將只把這個提交拉入當(dāng)前分支。 - (可選) 在某些情況下, 可能需要手動解決沖突.
- 像往常一樣推送這個分支:
git push origin main
。
具體命令
在 cherry-pick
命令的最簡單形式中,你只需使用要集成到當(dāng)前 HEAD 分支中的提交的 SHA 標(biāo)識符即可。
要獲取提交哈希值,可以使用 git log
命令:
git log --oneline
知道 commit 的哈希值后,就可以使用 cherry-pick
命令。
語法如下:
git cherry-pick <commit sha>
??Notes:
<commit sha>
可以是多個
例如:
git cherry-pick 85c5532
這將把指定的更改專用于當(dāng)前已簽出的分支。
如果你想做進(jìn)一步修改,也可以指示 Git 在你的工作副本中添加提交改動。
語法如下:
git cherry-pick <commit sha> --no-commit
如:
git cherry-pick 85c5532 --no-commit
如果您想同時選擇多個提交,請?zhí)砑铀鼈兊奶峤还V?,中間用空格隔開:
git cherry-pick hash1 hash3
在挑選提交時,不能使用 git pull
命令,因?yàn)樗鼤囊粋€版本庫中獲取提交并自動合并到另一個版本庫中。cherry-pick
命令是專門用來避免這種情況發(fā)生的工具;取而代之的是使用 git fetch
,它會獲取提交但不應(yīng)用它們。
Cherry-pick 實(shí)戰(zhàn)
要嘗試該過程,請啟動終端并生成一個示例項(xiàng)目:
mkdir fruit.git
cd fruit.git
git init .
創(chuàng)建一些數(shù)據(jù)并提交:
echo "Kiwifruit" > fruit.txt
git add fruit.txt
git commit -m 'First commit'
現(xiàn)在,創(chuàng)建一個項(xiàng)目的 fork 來代表遠(yuǎn)程開發(fā)者:
mkdir ~/fruit.fork
cd !$
echo "Strawberry" >> fruit.txt
git add fruit.txt
git commit -m 'Added a fruit"
這是一個有效的提交?,F(xiàn)在,創(chuàng)建一個糟糕的提交,代表你不想合并到項(xiàng)目中的內(nèi)容:
echo "Rhubarb" >> fruit.txt
git add fruit.txt
git commit -m 'Added a vegetable that tastes like a fruit"
返回你的權(quán)威版本庫,從你假想的開發(fā)者那里獲取提交(使用 git fetch
獲取):
$ cd ~/fruit.git
$ git remote add dev ~/fruit.fork
$ git fetch dev
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done...
$ git log –oneline dev/master
e858ab2 Added a vegetable that tastes like a fruit
0664292 Added a fruit
b56e0f8 First commit
你已經(jīng)從假想的開發(fā)者那里獲取了提交,但還沒有將它們合并到你的版本庫中。你想接受第二個提交,但不想接受第三個,所以要使用 cherry-pick
:
git cherry-pick 0664292
現(xiàn)在,第二個提交就在你的版本庫中:
$ cat fruit.txt
Kiwifruit
Strawberry
將更改推送到遠(yuǎn)程服務(wù)器,就大功告成了!
Cherry-pick 多個提交實(shí)戰(zhàn)
從 dev 挑選數(shù)個 commits 進(jìn)行合并:
git cherry-pick 85c5532 366a196 53ebe44 --no-commits
然后, 可能第一個合并會出現(xiàn)沖突, 手動解決沖突, 并git add
具體文件或 git rm
.
繼續(xù) cherry-pick:
git cherry-pick --continue
第二個提交可能沒有沖突, 直接合并.
第三個提交可能又有沖突, 手動解決沖突, 并git add
具體文件或 git rm
.
繼續(xù) cherry-pick:
git cherry-pick --continue
最后再執(zhí)行 git cherry-pick --continue
, 會提示你沒有在運(yùn)行的任務(wù).
此時, 可以提交:
git push origin main
總結(jié)
Cherry-pick 是一個功能強(qiáng)大的命令,如果沒有正確理解可能發(fā)生的情況,使用它可能會帶來麻煩。不過,當(dāng)你搞砸并提交到錯誤的分支時,它可能會拯救你的生命(至少是你的日常工作)。文章來源:http://www.zghlxwxcb.cn/news/detail-642201.html
???參考文檔
- What is Git cherry-picking? | Opensource.com
- How to merge only specific commits from a pull request with git cherry-pick | MattStauffer.com
- Git Cherry Pick - How to use the "cherry-pick" command in Git | Learn Version Control with Git
三人行, 必有我?guī)? 知識共享, 天下為公. 本文由東風(fēng)微鳴技術(shù)博客 EWhisper.cn 編寫.文章來源地址http://www.zghlxwxcb.cn/news/detail-642201.html
到了這里,關(guān)于Git Cherry-pick使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!