cherry-pick可用於把其餘分支的commit,移到當前分支。git
1 在master分支新建git.txtgithub
2 在git.txt輸入 「master第一次提交」json
3 在master分支提交segmentfault
git add git.txt
git commit -m 'master第一次提交'複製代碼
4 基於master新建test分支bash
git checkout -b test複製代碼
5 在git.txt加一行 「test第一次提交」ui
6 在test分支提交url
git add git.txt
git commit -m 'test第一次提交'
寫法2: 此時git.txt已經add過了,能夠用偷懶的寫法
git commit -am 'test第一次提交'複製代碼
7 在git.txt加一行 「test第二次提交」spa
8 在test分支提交3d
git commit -am 'test第二次提交'複製代碼
9 參照上面 4 ~ 8,基於master新建test2分支,在test2中也提交兩遍。code
此時,在master分支有一次提交,在test和test2分支有兩次提交,以下圖所示。
若是咱們須要把test和test2分支的第一次提交移到master上,那麼能夠使用cherry-pick(注意:使用merge合併的方式會把全部提交合並過來,而這裏咱們只須要test和test2第一次提交)
使用git log查看test和test2中第一次提交的commit id,在cherry-pick中使用。
而後在master分支中cherry-pick
// 4d5a7b1 爲test第一次提交的commit id, 3d56b9a爲test2第一次提交的commit id
git cherry-pick 4d5a7b1 3d56b9a複製代碼
此時若是無衝突,那麼test和test2分支第一次提交的內容將會移到master中
若是有衝突,那麼解決後使用git add,添加後再執行git cherry-pick --continue
固然你也能夠退出cherry-pick,使用git cherry-pick --quit 會退出cherry-pick,可是剛剛cherry-pick的結果會留下
若是你但願回到cherry-pick以前,那麼能夠使用 git cherry-pick --abort
若是cherry-pick已經順利執行完,而你又想回到cherry-pick以前,那麼能夠使用版本回退啦。
1 cherry-pick一個分支的多個commit時,請按順序填寫commit id,或者使用 "..." 限定範圍,以下。
// 從start-commit-id 到 end-commit-id 不包含 start-commit-id
git cherry-pick <start-commit-id>…<end-commit-id>
// 從start-commit-id 到 end-commit-id 包含 start-commit-id
git cherry-pick <start-commit-id>^…<end-commit-id>複製代碼
2 假若有一個commit,是從其餘分支合併過來造成的,那麼cherry-pick這個commit將會報錯,是由於git不知道取哪一個分支的內容,使用-m選項便可。參考這裏
error: commit fd30d42926885f792976a094b1aa0c96e8228240 is a merge but no -m option was given.複製代碼
git log --all --full-history -- package-lock.json複製代碼
--all 展現包括其餘分支的全部歷史
--full-history 查看某個文件歷史時,git會自動簡化歷史(History Simplification),甚至會隱藏一些提交。--full-history能夠關閉History Simplification。
git 2.9 後默認不容許合併兩個不相關的沒有共同祖先的分支,好比新建本地倉庫,新建github倉庫,本地倉庫 git remote add origin <repository url> ,而後git pull origin master,會報錯。
fatal: refusing to merge unrelated histories複製代碼
能夠使用--allow-unrelated-histories解決
// pull時
git pull origin <branch> --allow-unrelated-histories
// merge時
git merge <branch> --allow-unrelated-histories複製代碼
git checkout --orphan <new-branch>複製代碼
--orphan建立出來的分支沒有任何提交歷史
// 克隆倉庫,且只克隆最近 1 次提交歷史,若是想克隆最近 n 次的歷史,把 1 改爲 n 便可。
git clone --depth=1 <repository url>複製代碼