(如下狀況是咱們的一位開發小哥哥遇到了提交失敗,來找我,我給他解決的過程,之前我也沒遇到,因此記錄下來)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 了