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
Original link: Phanix's Blog