2012-10-17 95 views
1

Git版本:1.7.12.3爲什麼`git push -f`力推動所有跟蹤分支?

正如問題所述,這對我來說似乎是一個非常糟糕的主意。沒有任何額外的標誌或確認git push -f將強制推動所有的跟蹤分支到遠程。

如果開發人員有幾個過時的分支機構正在跟蹤遠程,並且他執行了該命令,那麼所有跟蹤分支將被回滾到他過期的副本,這會導致寶貴的工作損失。

這可以意外完成,或由某人不熟悉git。這真的好像git應該在這樣一個危險的情況下多做一些手工操作,並且需要一個額外的標誌,或者要求確認。

這是否有補救措施?

回答

6

由於它是一月2016,現在,我想這是值得一些更新的信息添加到這個問題:

  1. 正如霍布斯所說,git push --force行爲正是像正常git push在推動方面當前或所有的改變了分支。
  2. git push推動要麼所有分支機構或單一依賴的push.default
  3. 更多細節在這個post此配置,但爲了推動當前分支而已,你.gitconfig應該看起來像:
 

    [user] 
      name = User Name 
      email = [email protected] 
    [push] 
      default = simple 

  1. 爲了看到您的.gitconfigUnix-like OS只是做cat ~/.gitconfig。這post顯示如何在Windows上做到這一點。
  2. 僅推送當前分支(simple模式)僅在Git 2.0(發佈於2014-12-17)中成爲默認值。
  3. 那些正在使用Git 1.7(或已從1.7更新的人)的matching模式爲默認模式(推送所有分支)。
2

因爲git push -f做什麼git push,只有一個-f。並且由於git push默認情況下配置爲在沒有分支參數的情況下推送所有匹配的分支。您應該執行git config push.default upstreamgit config push.default simple以更改默認推送行爲(有關此功能的更多信息,請參閱git help config)。

+6

對於提問者來說,如果默認行爲是「你配置了git push來推送所有匹配的分支,如果沒有給出參數」,這就相當苛刻! –

3

如上所述,git push的默認行爲是推送遠程所有分支名稱匹配的名稱。

由於單證說,有關-f/- 力:

通常情況下,命令拒絕更新遠程裁判不是一個 祖先的地方裁判所使用的覆蓋它。該標誌禁用 檢查。這會導致遠程存儲庫丟失提交;小心使用它 。

因此,在-f行爲中添加一個額外的檢查就像詢問「你確定要刪除文件嗎?」然後「你確定嗎?」

git push的默認行爲在git的未來主要版本(1.9或2.0,但肯定不是1.8)中會改變,只會推送您正在使用的分支。直到這種情況下,您可以設置以下選項:

git config remote.origin.push HEAD 

但還是如果使用-f和你對你的擔憂仍然存在過時的分支。

相關問題