git_patch

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关闭后再提交的方法

Share