Git patch
由于公司有Gerrit进行code review所以与日常的直接使用Git有所不同
为什么使用Git patch
之前单独看Git的时候知道有patch这个方式,但是由于没有用到,所以也只是知道有这个方式而已。这次为什么用到了呢?
首先公司的代码一般为先git pull
,再cherry-pick
,什么是cherry-pick
,简单的说就是把自己已经push
到Gerrit的代码拉下来再跟本地代码合并。
重点来了,对于先git pull
,再cherry-pick
的代码,提交时需要使用git commit --amend
命令,该命令中描述的信息是基于cherry-pick
的代码,在git commit --amend
命令后便可使用git push
命令将修改后的代码上传。若提交时使用的是git commit -s
命令呢?坑来了,你会重新填写commit的信息,但是push不上去!
为啥?因为对于这个change而言,他的changeId就是cherry-pick
的changeId,你使用git commit -s
命令就会生成一个新的changeId,对于该change而言,只有一个changeId,所以造成冲突,导致不能push代码
解决方案1——修改changeId
该方案本人在公司里试过,一直不行,按照同事的说法,这是一个Git的Bug。。。个人感觉这如果是个Bug,Git不会不知道吧,不知道是什么情况。那还有啥方法可以提交代码呢?
解决方案2——Git patch(也就是打补丁)
Git patch的好处:只有能够有两个版本代码的diff的数据,就可以以极低的代价更新程序
接下来先对Git merge, Git rebase,Git cherry-pick, Git patch
进行比较
Git merge
另一个分支与当前分支合并,举例如下图
Git rebase
把当前分支的提交在另一分支上重演。(如果可以成功重演,当前分支将会消失。即先取消当前分支的每个commit,保存为补丁(patch),然后按照顺序把这些补丁应用到另一个分支上。举例如下图
cherry-pick
把其他分支的某一次或某几次提交,在当前分支上重演(按顺序添加commit),一般不在master上使用,而是在当前分支使用。patch
把一次或几次提交,做成补丁文件(可以远程发送给其他人,这是与cherry-pick
最大的不同)。这个补丁文件可以被应用到其它分支上。
现在就开始使用patch
来push我们的代码
1. 新建一个新的分支
git checkout -b "ccc" origin/master
2. 拉下master最新代码
git pull
3. 找到master上最近提交的commit id
git log
4. 切回已经关闭的change的分支
git checkout recoverImage
5. 找到该分支下刚提交commit的log
git log
6. 在该分支下进行生成patch操作
git diff ccc的commitid recoverImage的commitid > ~/ccc.diff
7. 切回ccc分支
git checkout ccc
8. 打patch操作
git apply ~/ccc.diff
9. 在ccc分支正常的add,commit和push操作
patch也可以使用在change关闭后再提交的方法