網(wǎng)站建設(shè)需求方案平臺推廣渠道
大家好,我是 17。
今天和大家聊一聊 git check-pick,git patch 與 git stash 的用法。
git cherry-pick
為什么要用 cherry-pick?
不適合 merge 的場景就可以考慮 cherry-pick。
試想下面這些場景
-
只想同步分支的部分提交。兩個分支是兩上完全獨立的 feature,不適合 merge。
-
不想過早的同步分支。
下面舉幾個例子。 dev 為 分支 ,A、B 為 commit。
git cherry-pick dev 將 dev 分支的最近一次提交,轉(zhuǎn)移到當(dāng)前分支。
git cherry-pick A 可以轉(zhuǎn)移有權(quán)訪問的任意分支的任意提交。
git cherry-pick A B 一次可以同步多個提交 轉(zhuǎn)移從 A 到 B 的所有提交,不包含 提交 A。提交 A 必須早于提交 B,否則命令將失敗,但不會報錯。
git cherry-pick A..B 包含提交 A
git cherry-pick A^..B
如果沒有沖突會在當(dāng)前分支形成一個新的提交,提交的內(nèi)容和 message 完全一樣,只是 hash( commit id) 值不一樣。
如果有沖突,解決沖突的方法前面在 git checkout
那一節(jié)已經(jīng)說過,解決的方法是一樣的,最后用 git cherry-pick --contine
,如果想撤銷用 git cherry-pic --abort
git patch
為什么要用 patch?
不適合 merge,也不方便 cherry-pick 的場景,可以考慮 patch。
試想下面這些場景
- 兩個不同的 git 庫,其中的某段代碼需要同步。
- 有些修改會影響所有開發(fā)者,但你想做這個修改,來驗證一些東西。你需要另一個開發(fā)配合,需要把這個修改同步給他。直接 copy 是個辦法,但如果修改較多,容易出錯,用 patch 比較合適。
雖然 check-pick 也可以同步不同的庫,但實操的時候,因為權(quán)限或安全問題,不大方便聯(lián)網(wǎng)同步。
patch 方案
pach 有兩種方案,diff 和 format-patch。
diff 僅保留了文件重 A 狀態(tài)變成 B 狀態(tài)的差別,而不會保留 commit 記錄消息等信息,diff可以多個commit生成單個patch。用 git apply
應(yīng)用補丁。
format-patch 完整保留了每次提交的完成信息,每個commit都生成一個patch文件。用 git am
應(yīng)用 補丁。
檢查都是用 git apply --check。查看 都是 git applay -stat
diff 生成 patch,apply 應(yīng)用patch
制作 patch
git diff >fix.patch git diff 38d8e02 >fix.patch 相當(dāng)于
git diff 38d8e02 HEAD >fix.patch
總之,diff 的結(jié)果都可以制作 patch。
應(yīng)用 patch
git apply --check fix.patch
git apply fix.patch
format-patch 制作 patch ,am 應(yīng)用 patch
git format-patch -2 用最近的兩次提交制作 patch
git format-patch commitId 某次提交以后的所有patch,不包括本次提交
git format-patch --root commitId 從第一次提交到指定提交的所有 patch
git format-patch -o patch -2 輸出 patch 文件到 patch 文件夾
format-patch
制作的 patch 是一個提交一個文件,正序排列。
0001-第一次提交.patch
0002-第二次提交.patch
應(yīng)用提交
git apply --check *.patch
git am *.patch
git stash
stash 的英文原意是 貯藏。git stash
的功能就是把當(dāng)前工作區(qū)的內(nèi)容存起來。和提交到暫存區(qū)不同,git stash
貯藏的內(nèi)容不受分支切換的影響。
應(yīng)用場景
- 開發(fā)了一陣,發(fā)現(xiàn)分支錯了。這時最好的文案就是
git stash save
,切到新分支后git stash pop
。 - 開發(fā)到一半,有一個緊急的 bug 要 fix,這時提交會造成無效的提交記錄??梢韵?
git stash save
,切換分支修復(fù) bug,再切回來git stash pop
。
注意:沒有被 add 過的文件不會被 stash 起來,如果想把這些文件也一起 stash,可以加上
-u
參數(shù),它是--include-untracked
的簡寫, git stash -u。