(如下状况是咱们的一位开发小哥哥遇到了提交失败,来找我,我给他解决的过程,之前我也没遇到,因此记录下来)git
咱们会遇到这样的状况,在develop分支上,第一天修改的文件,已经执行了git commit 添加了提交记录信息commit1,忘记push了,而后次日,执行了git pull,拉取了服务器的一大堆提交下来,好比有commit2,commit3,commit4之类的,第一天的提交commit1已经被冲到前面去了,可是如今我本地也有一些其余改动,我又想提交以前的commit1,只提交这个,我要怎么办呢?服务器
注意,此时本地的提交已经变成下面这样了:app
merge_new
commit4
commit3
commit2
commit1
commit0spa
其中的“merge_new”是你执行git pull时,拉取下来的服务器代码和本地代码的一个合并记录,若是你想直接push的话,这条记录也会跟着推上去,因此平时都建议你们,修改代码以前先pull拉取服务器的新代码下来,而后开始修改,提交以前就不要在拉取新代码了,就是为了防止这条记录的产生。开发
此时,若是我只提交commit1呢,我要怎么提交? rem
这里说下我尝试了好几种错误的方式,包含it
(1)git diff commit0 commit1 > test.patch ,而后再新的仓库路径下git apply test.patch(开发小哥哥直接说patch里没有他的提交,不科学啊)test
(2)git show commit1 > test.patch , 而后再新的仓库路径下git apply test.patch,显然,这不是patch的正确生成方式,打patch毫无疑问的失败了apply
(3)git push commit1:develop 这是网上找的一种方式,可是仍是失败了di
正确的步骤以下:
(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 了