你自己做這樣的命令會非常容易。
export STORE=/home/me/.git_backup
mkdir $STORE
export ROOT=/home/me/src/somegitrepos
alias git='tar czf /$STORE/state.tar.gz -C $ROOT . ; /usr/bin/git'
alias git-undo='rm -rf $ROOT/* $ROOT/.??* ; cd $ROOT/ ; tar xzf /$STORE/state.tar.gz'
(顯然,魯棒性需要被添加,即確保在$STORE/state.tar.gz
之前rm -rf
實際存在,並支持多種不同的存儲庫等)
當然,這僅僅是一個概念證明。對於較大的存儲庫,解決方案會很刺激。在這種情況下,使用快照文件系統,只需在您的git
別名中創建快照,並存儲快照的名稱而不是完整的tar.gz
存檔。非常簡單,而且在一個好的FS(例如xfs)中,就速度和空間使用而言,它是絕對可忽略的。你甚至可以平凡的,有多步撤消...
該解決方案是死的簡單,所以它是完全瘋狂的實施一個「複雜」版本內部git本身將能夠實際跟蹤各種只是爲了使空間使用更爲理想(與快照相比,不是tar
「解決方案」)。
順便說,至少有兩個原因,爲什麼沒有內置git undo
:
- 這將是一種「橫向」的特點,即,每一個最後
git
命令,它是不是隻讀(例如,status
,log
)將不得不被觸及。此外,每一個未來的命令都需要包括對此的支持。有可能或不可能有命令,在這種情況下根本不可能做到這一點(而不會回落到像這裏所建議的那樣愚蠢的解決方案tar
)。
經過多年的cvs,svn和git經驗,我發現git似乎對數據丟失非常非常抵抗。我不是在討論bug,而是使用git命令來「破壞」某些東西。除了像git reset --hard
這些修改git存儲之外的文件的命令(即,在工作目錄中未添加的更改)之外,從字面上看,所有內容都可以通過非常簡單的方式恢復(直到垃圾回收刪除內容...)。
git的數據存儲方案也很容易理解,併爲普通用戶「看到」(heck,gitk
,你就完成了)。這與我使用其他工具的經驗截然不同,我絕對害怕svn
中的複雜合併...因此,當您知道如何撤消內容時,git undo
類型的「需求」將消失。
功能強大的工具,如git rebase -i
或簡單的事實,分行只是「即時貼」讓你幾乎所有的東西恢復很容易地(如,以某種方式合併一個重建基礎分支,你已經合併了原分公司和任何愚蠢的東西在發生實踐 ;) )。
有趣的項目的想法! – tbodt
@tbodt同意,我想我可能會在本週嘗試構建它:D – adao7000
您可以通過創建一個名爲'git-undo'的命令來完成此操作,當您鍵入'git undo'時,git會調用該命令。 – tbodt