git cherry-pick
可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在master
合入dev
某次分支的提交时,我们不能对整个dev
分支进行合并,因为可能有未开发完成的内容,而是只想将dev
某一次提交合入到master
分支上,那么就要使用git cherry-pick
了。
git cherry-pick 挑拣式提交
基本语法
1 | // git cherry-pick [<options>] <commit-id> |
git cherry-pick commitid
- 当
cherry-pick
时,成功自动提交,则直接git push
即可 - 当
cherry-pick
时,存在冲突,未成功提交,解决冲突后再git commit
手动提交 或者git add .
再使用git cherry-pick --continue
继续1
2
3
4
5$ git cherry-pick 2555c6e
error: could not apply 2555c6e... [Description]:branch2 commit 2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
git cherry-pick –quit
- 中断
cherry-pick
,当前分支中未冲突的内容状态将为modified
git cherry-pick –abort
- 取消
cherry-pick
当前分支恢复到cherry-pick前的状态,没有改变。
从一个分支cherry-pick多个commit
想在该分支合并多个连续的
commit
提交时, 只需要在commitId中添加两个点..
1
2// git cherry-pick commitId1..conmmitId5
// 注意 此时合并的commit 不包括第一个commitiId 只合并 conmmitId2到conmmitId5想在该分支合并多个不连续
commit
提交时, 将commitId用空格隔开即可`1
2// git cherry-pick commitId1 conmmitId3
// 注意 此时合并 conmmitId1 conmmitId3 到当前分支
git rebase 变基(使提交记录更简洁)
将本地未push到远程的多条commit提交记录合并成一条记录提交到远程
1
2
3// git rebase -i 将本地的多次提交合并为一个,以简化提交历史
// git rebase -i HEAD~n 将本地的n次提交合并为一个,以简化提交历史
// 在弹出的交互式界面中完成合并操作 将需要合并的commit选择s操作合并
不要通过rebase对任何已经提交到远程公共仓库中的commit进行修改(你自己一个人玩的分支除外)
rebase 用法小结
使用
git pull --rebase
可以避免无用的Merge branch xxxbranch of xxx into xxxbranch
在你开发提交后未push到远程时,如果其他人提交了远程记录,当你在push时,需要先git pull拉取代码,如果无冲突,再push到远程后,可以在提交记录中发现有一条类似 Merge branch xxxbranch of xxx into xxxbranch的体积记录,显然不太美观,最好的操作是使用git pull --rebase进行变基拉取代码,再提交时,就不会产生Merge这种无用的提交信息,如果有冲突需要先解决冲突再push
1
2
3// git fetch + git rebase 替换 git pull 减少分支的分叉
git fetch origin dev
git rebase origin/dev当使用git rebase产生冲突时,需要先解决冲突,然后按照操作 git rebase --continue 继续执行合并提交记录
git revert 撤销某个已经提交的的快照
和reset 重置到某个指定版本不一样。它是在提交记录最后面加上一个撤销上次更改的新提交,而不是从项目历史中移除这个提交,这避免了 Git 丢失项目历史。
git revert HEAD
生成一个撤销最近的一次提交的新提交git revert HEAD^
生成一个撤销最近一次提交的上一次提交的新提交git revert HEAD^^
生成一个撤销最近一次提交的上两次提交的新提交git revert HEAD~n
生成一个撤销最近一次提交的上n次提交的新提交git revert <commit_id>
生成一个撤销指定提交版本的新提交revert(撤销)是撤销公共提交的安全方式,reset(重设/回退)是重设/回退本地更改。因为两个命令的目的不同,它们的实现也不一样:重设完全地移除了一堆更改,而撤销保留了原来的更改,用一个新的提交来实现撤销。千万不要用 git reset 回退已经被推送到公共仓库上的 提交,它只适用于回退本地修改(从未提交到公共仓库中)。如果你需要修复一个公共提交,最好使用 git revert。