廣州網(wǎng)站建設優(yōu)化中國輿情觀察網(wǎng)
概述
無論項目大小,當你和一群程序員一起工作時,處理多個 Git 分支之間的變更都會變得很困難。有時,與其把整個 Git 分支合并到另一個分支,不如選擇并移動幾個特定的提交。這個過程被稱為 "挑揀", 即 Cherry-pick。
本文將介紹 "Cherry-pick" 的內(nèi)容、原因和方法。
讓我們開始吧~
什么是 Cherry-pick?
通過 cherry-pick
命令,Git 可以將任何分支中的選定提交合并到當前的 Git HEAD 分支中。
在執(zhí)行 git merge
或 git rebase
時,一個分支的所有提交都會被合并。而 cherry-pick
命令則允許你選擇單個提交進行整合。
區(qū)別圖示如下:
△ 使用 merge 的情況: 在執(zhí)行 merge 或 rebase 時,一個分支的所有提交都會被整合。
△ 使用 cherry-pick 的情況: 允許你選擇個別提交進行整合。在本例中,只有 C2 被整合到主分支,而不是 C4。
為什么要用 Cherry-pick?
下面的情況可能更容易理解 "Cherry-pick" 的作用。
想象一下,您正在為即將到來的每周 spring 實施新功能。代碼準備就緒后,您將把它推送到遠程分支,準備進行測試。
然而,客戶并不滿意所有的修改,要求你只提交某些修改。因為客戶還沒有批準下次發(fā)布的所有修改,所以 git rebase
不會產(chǎn)生預期的結(jié)果。因為 git rebase
或 git merge
會將上一次沖刺的所有調(diào)整都納入其中。
而 "Cherry-pick" 就能解決這個問題!因為 "Cherry-pick" 只關(guān)注提交中添加的改動,所以它只會帶來已批準的改動,而不會添加其他提交。
使用 "Cherry-pick" 還有其他一些原因:
- 這對修復 bug 非常重要,因為開發(fā)分支中的 bug 都是用它們的提交設置的。
- 通過使用
git cherry-pick
,而不是其他應用指定提交的改動的選項(如git diff
),可以避免不必要的爭斗。 - 如果因為各 Git 分支的版本不兼容而無法進行完整的分支合并,它就是一個很有用的工具。
什么時候用 Cherry-pick?
簡而言之就是:盡量少用。之所以要盡量少用 cherry-pick,是因為它很容易產(chǎn)生 "重復"提交:當你使用 cherry-pick 將一個提交整合到 HEAD 分支時,Git 必須創(chuàng)建一個內(nèi)容完全相同的新提交。不過,這是一個全新的提交對象,有自己的 SHA 標識符。同時也會失去跟蹤提交歷史的能力。
如果你不按順序提交了很多提交,這些提交就會被記錄在你的分支中,這可能會導致你的 Git 分支出現(xiàn)不理想的結(jié)果。
只要能用傳統(tǒng)的合并或重置來整合,就應該這么做。Cherry-pick 應保留給不可能這樣做的情況,例如必須創(chuàng)建 Hotfix 或只想從一個廢棄的分支中保存一個或幾個提交。
如何使用 Cherry-pick 命令?
流程概述
下面是使用步驟:
- 拉取本地分支。使用
git fetch
。 - 回到要合并的分支。你可能會通過運行
git checkout main
來做到這一點。 - 找到要拉入分支的提交。轉(zhuǎn)到
git log
,為每條提交獲取唯一的提交哈希值。 - "Cherry-pick" 您想要加入該分支的提交。運行以下命令:
git cherry-pick <commit sha>
。這將只把這個提交拉入當前分支。 - (可選) 在某些情況下, 可能需要手動解決沖突.
- 像往常一樣推送這個分支:
git push origin main
。
具體命令
在 cherry-pick
命令的最簡單形式中,你只需使用要集成到當前 HEAD 分支中的提交的 SHA 標識符即可。
要獲取提交哈希值,可以使用 git log
命令:
git log --oneline
知道 commit 的哈希值后,就可以使用 cherry-pick
命令。
語法如下:
git cherry-pick <commit sha>
📝Notes:
<commit sha>
可以是多個
例如:
git cherry-pick 85c5532
這將把指定的更改專用于當前已簽出的分支。
如果你想做進一步修改,也可以指示 Git 在你的工作副本中添加提交改動。
語法如下:
git cherry-pick <commit sha> --no-commit
如:
git cherry-pick 85c5532 --no-commit
如果您想同時選擇多個提交,請?zhí)砑铀鼈兊奶峤还V?#xff0c;中間用空格隔開:
git cherry-pick hash1 hash3
在挑選提交時,不能使用 git pull
命令,因為它會從一個版本庫中獲取提交并自動合并到另一個版本庫中。cherry-pick
命令是專門用來避免這種情況發(fā)生的工具;取而代之的是使用 git fetch
,它會獲取提交但不應用它們。
Cherry-pick 實戰(zhàn)
要嘗試該過程,請啟動終端并生成一個示例項目:
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)建一個項目的 fork 來代表遠程開發(fā)者:
mkdir ~/fruit.fork
cd !$
echo "Strawberry" >> fruit.txt
git add fruit.txt
git commit -m 'Added a fruit"
這是一個有效的提交?,F(xiàn)在,創(chuà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
將更改推送到遠程服務器,就大功告成了!
Cherry-pick 多個提交實戰(zhàn)
從 dev 挑選數(shù)個 commits 進行合并:
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
, 會提示你沒有在運行的任務.
此時, 可以提交:
git push origin main
總結(jié)
Cherry-pick 是一個功能強大的命令,如果沒有正確理解可能發(fā)生的情況,使用它可能會帶來麻煩。不過,當你搞砸并提交到錯誤的分支時,它可能會拯救你的生命(至少是你的日常工作)。
📚?參考文檔
- 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ī)? 知識共享, 天下為公. 本文由東風微鳴技術(shù)博客 EWhisper.cn 編寫.