git rebase
git rebase branch_A branch_B
: 在分支A上rebase分支B,该操作会把整条B分支的与A分支无关的commits悬挂到A分支的后面,需要解决冲突
-
常见问题
这时如果远程仓库有B分支,则
git rebase
后无法commit,因为本地commits树和远程commits树“分叉了” -
解决方法
git pull --rebase
: 将rebase到分支A的分支B重新rebase回原来的位置(origin/branch_B),这时重新rebase后的分支B就会包含分支A的属性,再git push
git cherry-pick
git cherry-pick commit_1 commit_2 ...
: 将其他的提交commit_1、commit_2等悬挂到当前HEAD的后面,需要解决冲突
-
常见问题
git cherry-pick
是以commit为单位的操作,如git cheery-pick commit_1
后,当前HEAD得到的更新仅仅是commit_1针对与commit_1上一个commit的更新
(即更新的信息为git diff commit_1_HEAD^ commmit_1_HEAD
)。该操作并不能得到commit_1所在分支的之前的commits的更新 -
解决方法
-
如果还想同时获得commit_1之前的提交的更新,则需:
git cherry-pick commit_1_HEAD^^ commit_1_HEAD^ commit_1_HEAD ...
,这种操作有点类似于git rebase
的拷贝复制版 -
按照上述方法操作,很可能在
cherry-pick commit_1_HEAD^^
时就遇到了冲突,这时需要解决冲突,但不用git commit
,而是在git add
后直接git cherry-pick --continue
就能继续cherry-pick
了 -
如果想撤销上次的
git cherry-pick
,则需:git cherry-pick --abort
-
git revert
git revert HEAD
: 重做当前的这次提交,版本会滚回到HEAD^
,但重做的版本会悬挂到当前HEAD
的后面
-
常见问题
如果
git merge
后想执行git revert HEAD
操作,则会出现歧义问题,git不知道你要滚回到哪条分支的上一个commit -
解决方法
git revert HEAD -m 1(or 2,3...)
: 选择-m 1
则代表滚回父分支,2、3…则代表合并的其他分支