2010-04-28 29 views
10

我讀到Git主要添加了有關存儲庫歷史記錄的信息,試圖記住所做的每個更改,但也有一些命令會做出不可逆轉的更改。git中的破壞性命令是什麼?

我應該真正注意哪些命令,避免錯誤使用,因爲沒有回頭路可走?

+0

當你回答下面的問題時,請記住解釋命令的作用! – 2010-04-28 14:51:51

回答

9

這裏有兩種「破壞性的」 - 對你的git歷史和命令的破壞性的命令,可以放棄工作副本中的更改。

命令是放棄工作樹改變

  1. git reset
  2. git checkout

正如其他人所提到的,引用日誌和事實Git對象,切勿立即的組合被丟棄(除非你打開自動清理)意味着你通常可以撤銷像git reset/rebase/merge這樣的操作。

這些命令,雖然,實際上丟棄GIT中對象,消除撤消能力:

  1. git gc(默認情況下,該修剪是至少2周老不可獲得的對象)
+1

在我看來,破壞性最大的git命令就是那些丟棄工作樹的命令。使用'git stash'進行「備份」應該總是安全的;混帳藏匿流行'。您可以稍後(直到您的gc修剪限制)通過以下命令恢復「丟失」版本:gitk --all -n 5000 --all $(git fsck | awk'/ dangling commit/{print $ 3}'; git log -g --pretty ='format:%H')[這會打開gitk前端,最多包含5000次提交,包括所有「丟失」提交]。 – 2011-09-06 07:26:31

2

的git的復位 - 硬不能撤消

+0

是真的,沒有提交時 – Lauri 2010-04-28 10:03:11

7

根據http://blog.reverberate.org/2009/07/30/gits-needs-a-new-interface/

$ git checkout foo.c 

...將覆蓋您可能需要foo.c的任何本地修改,而不問。

+1

確實如此 - 它比我想象的更具破壞性。我只是做了一個'git checkout 6bb33a8。'希望得到那個提交中改變的那個文件,但是它也消除了我對其他文件的階段性更改,用它們中的內容替換它們。我認爲它可能會在reflog中保留一些東西來保護我,但沒有這樣的運氣。 – 2016-04-12 18:41:54

3

使用git reset命令可能會丟失未提交的更改。如果您的更改已提交,則在受到清除gc清除之前,您將受到reflog多天的保護。

例如,如果你checkoutrebasereset,或merge所有引進的變化,你可以回到以前的通過運行reflog命令,並使用reset重置你的頭一個老犯犯。