git cherry-pick、git rebase、git revert

git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在master合入dev某次分支的提交时,我们不能对整个dev分支进行合并,因为可能有未开发完成的内容,而是只想将dev某一次提交合入到master分支上,那么就要使用git cherry-pick了。

git cherry-pick 挑拣式提交

基本语法
1
2
3
4
5
6
7
8
9
// git cherry-pick [<options>] <commit-id>
// 常用options
/*
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息
*/
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。
-------------本文结束感谢您的阅读-------------
0%