2016-07-26 45 views
4

看一些有史以來最受歡迎的問題,似乎取消git錯誤是一個很常見的問題。這些問題都得到了很好的回答,並且git命令本身相當簡潔,但我想知道git是否有 - 或者計劃在即將發佈的版本中實現 - 一個通用的git undo命令。這個命令會從字面上撤銷你最近執行的任何git命令。是否有一個通用的git「undo」命令?

編輯:就專一,我的意思是,混帳撤銷着眼於倉庫右側的狀態,你輸入你的錯命令之前,並把它回到了那個狀態是什麼

的精確副本

例如,如果我做了一個git add --all,然後鍵入如git undo,git會暫停所有剛上演的文件,並且存儲庫看起來與我輸入git之前的文件相同全部添加。

而且,這裏是一個偉大的resource summarizing undoing git commands

+5

有趣的項目的想法! – tbodt

+0

@tbodt同意,我想我可能會在本週嘗試構建它:D – adao7000

+1

您可以通過創建一個名爲'git-undo'的命令來完成此操作,當您鍵入'git undo'時,git會調用該命令。 – tbodt

回答

2

沒有,有沒有這樣的功能。據我所知,沒有人提出要添加它。

實際上我沒有任何可以引用的文檔來證明-此功能的存在,並且Stack Overflow不是討論或提出軟件功能的地方,所以我將放棄這一點。

+1

我不是在提議一個新功能,我只是寫這個來建議命令的意圖。而且我編輯它以便它看起來沒有被定義得太差......它實際上只是將存儲庫的狀態恢復到鍵入命令之前的狀態。我確信我不是第一個想知道是否有意外鍵入git命令後才能鍵入的命令,並且只想撤銷我剛輸入的命令,所以我認爲這對於至少知道是否有價值的人是否有價值它從SO存在。一個新手git的人當然可以看到這個問題,以及先進的 – smaccoun

+0

當我回答這個問題時,它肯定讀了(對我來說)更像是一個精簡的功能請求,而不是實際的問題,但是您的編輯改進了它。我已經刪除了「定義不明確」的部分。 – trentcl

3

你自己做這樣的命令會非常容易。

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或簡單的事實,分行只是「即時貼」讓你幾乎所有的東西恢復很容易地(如,以某種方式合併一個重建基礎分支,你已經合併了原分公司和任何愚蠢的東西在發生實踐 ;) )。

+0

這將無法撤消影響遠程系統的更改,例如'git push'。 – Jesper

+0

是的,當然不是。 – AnoE