Git denying non-fast forward 問題

最近幫別公司處理 denying non-fast forward 的 git server 問題,沒事就別動檔案權限,不管是不是修改內容,只要用 chmod 指令,Git 還是會判別檔案變動。處理 git push 直接給我噴
$ git push --force origin master
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'
會遇到這問題的原因是使用者將不該 commit 的程式碼都 push 到伺服器上面,例如資料庫帳號密碼,個人帳蜜等等,這真的是不應該,解決方式也沒有很難,只要用 git reset –hard 到您需要的 commit hash 值,並且 git push –force 方式蓋掉 Server 上面的程式碼,但是如果遇到 git push –force origingit push –force origin master 都無作用,那就請加上底下設定
$ git config --system receive.denyNonFastForwards false
在 Github 上面怎麼用 force 都可以直接覆蓋,私人自己架設的,請加入此設定,但是這設定基本上蠻危險的,如果用 git reset –hard xxxx,xxx 為很久以前的版本,並且 force 到 Server 上面,那就等於沒救了 XD,所以用 –force push 到 server 上面時,請小心阿,基本上可以搭配 git cherry-pick 來撿還需要的 commit 內容。 Ref: git cherry-pick 處理專案 pull request Git reset –hard and a remote repository 7.1 Customizing Git – Git Configuration
  • Miles

    Git真是一門高深的技術 ._.*

  • appleboy48

    XD 是的,不過用起來真的很爽,跟 svn 差太多了

  • 柯布丁

    應該還是有救吧,只要任何一個client曾經同步過,就可以用git reflog救回,再用force去覆蓋server