Git push to the wrong branch

其實就是同事弄錯的事情經過

起因是同事想把Branch A倒退回前先前的 commit (rollback),下命令要直接對remote上的 branch 改指到某個 commit 上,但是因為工時太常(x)恍神(o)下錯命令…

#當下在3d_new這個branch上,要rollback一個commit,所以理論上要這樣
~/testGit/gittest$ git push --force origin HEAD^:3d_new
#但是下錯命令變成改到3d_test去
~/testGit/gittest$ git push --force origin HEAD^:3d_test
Total 0 (delta 0), reused 0 (delta 0)
To git@git_url:group_name/gittest.git
 + 62f6af0...36b6b05 HEAD^ -> 3d_test (forced update)

這樣的結果變成 3d_test 的 HEAD 被定到 3d_new 的 HEAD^ 去,如果這時候比較 local 與 remote repository 會發現,local上3d_test的commit從與 3d_new 的 common ancestor commit node 之後就不一樣了。解決方法其實很簡單,先切換到被弄錯的branch上(在這邊是3d_test),因為 local 還有正確的 commits,所以只要 force push 就解決了:

~/testGit/gittest$ git checkout 3d_test
~/testGit/gittest$ git push --force origin 3d_test

不過,可以這樣做的前提,是 local 還有著 3d_test 的commit,萬一不小心手殘或者硬碟掛了,別人也沒有這個備份的話,那只能透過 git reflog 去撈回來。

#原本應該是這樣
~/testGit/gittest$ git reflog origin/3d_test
f0dc3b8 refs/remotes/origin/3d_test@{0}: update by push
....

#手殘做了 git push --force origin HEAD^:3d_new 會變這樣
~/testGit/gittest$ git reflog origin/3d_test
36b6b05 refs/remotes/origin/3d_test@{0}: update by push
f0dc3b8 refs/remotes/origin/3d_test@{1}: update by push
....

可以發現到 origin/3d_test 指到 36b6b05 這個commit去了,而正確的commit是前一個 f0dc3b8 ,所以只要再來做個 force push 就可以

~/testGit/gittest$ git push --force origin f0dc3b8:3d_test

Leave a Reply

Your email address will not be published. Required fields are marked *