(以下情况是我们的一位开发小哥哥遇到了提交失败,来找我,我给他解决的过程,以前我也没遇到,所以记录下来)
我们会遇到这样的情况,在develop分支上,第一天修改的文件,已经执行了git commit 添加了提交记录信息commit1,忘记push了,然后第二天,执行了git pull,拉取了服务器的一大堆提交下来,比如有commit2,commit3,commit4之类的,第一天的提交commit1已经被冲到前面去了,但是现在我本地也有一些其他改动,我又想提交之前的commit1,只提交这个,我要怎么办呢?
注意,此时本地的提交已经变成下面这样了:
merge_new
commit4
commit3
commit2
commit1
commit0
其中的“merge_new”是你执行git pull时,拉取下来的服务器代码和本地代码的一个合并记录,如果你想直接push的话,这条记录也会跟着推上去,所以平时都建议大家,修改代码之前先pull拉取服务器的新代码下来,然后开始修改,提交之前就不要在拉取新代码了,就是为了防止这条记录的产生。
此时,如果我只提交commit1呢,我要怎么提交?
这里说下我尝试了好几种错误的方式,包含
(1)git diff commit0 commit1 > test.patch ,然后再新的仓库路径下git apply test.patch(开发小哥哥直接说patch里没有他的提交,不科学啊)
(2)git show commit1 > test.patch , 然后再新的仓库路径下git apply test.patch,显然,这不是patch的正确生成方式,打patch毫无疑问的失败了
(3)git push commit1:develop 这是网上找的一种方式,但是还是失败了
正确的步骤如下:
(1)基于工作分支develop(根据自己的时间情况修改下)的最新节点创建并切换到新的分支test:git checkout -b test remotes/origin/develop,操作执行后,本地会新建一个test分支,并且切换到test分支,git branch 可以看到当前所在的分支
(2) (此时已经在test分支上了)cherriy-pick commit1到test分支上:git cherry-pick commit1
(3) git log 我们可以看到commit1 已经在test分支上了, 并且是最后一个提交
(4)现在直接push到工作分支develop就可以了:我们用的是gerrit做代码审核的,所以,我们的命令是git push origin HEAD:refs/for/develop,如果你没有gerrit审核,直接git push 就ok 了