2017-01-04 37 views
1

所以,你現在知道你需要在你的git repo中做一些清理工作,可能使用rebase或者其他的東西,如果你做錯了,可能會讓它變得非常混亂。Git中是否有沙盒功能,讓您可以保存整個回購狀態以安全地玩遊戲?

有沒有辦法告訴Git 「保存整個本地git倉庫的這種狀態,這樣我就可以將所有事情回滾到這一點,以防出現問題?」 類似於「沙箱模式」,它可以讓您安全地玩轉回購,執行潛在的災難性操作,而不會有任何混亂的風險。

我不是在爲歷史中的某個特定點添加標籤或其他內容,而是關於在某些特定狀態下及時重置所有分支上所做的所有更改的操作。回滾的一切潛力(所有的git歷史/狀態)。類似於OSX Time Machine的東西。

回答

4

你可以複製你的文件夾與其他地方的Git倉庫,並做任何你想在那裏(假設只有本地操作)。這不會影響您的原始本地回購,並且如果您想放棄副本中的更改 - 只需將其刪除並再次複製即可。

+1

此外,在Git中製作不容易逆轉的東西非常困難。只有很少的命令可以像'git clean -fdx'或'git checkout一樣被撤銷。'你可能會放棄未經版本控制的改變。所有已經提交或隱藏的東西都是相對節省的,除非你做了一些沒有提交的東西,並且它們是垃圾回收的,但是因爲reflog在默認情況下是30天,所以你真的不得不在那段時間內放棄那些提交有一些不可思議的東西。 – Vampire

+0

如果您希望保留副本中所做的更改,而不必在原始回購中對其進行重做,您會做什麼?你會刪除原始的回購,並使用副本?這會帶來失去一些參考/鏈接到遠程回購的風險,還是git遠程和所有這樣的參考也複製到回購副本? – Magne

+1

Git遙控器也被複制。您可以切換並繼續進行復制,也可以將其從遠程副本推送到遠程,然後恢復到原始數據倉庫並從遠程執行更改。 –

2

Git非常努力地嘗試不會丟失或損壞數據,並且已經提供了幫助您恢復工作的工具。 它的basic build blocks是持久不變的數據結構。

例如,而不是直接基礎重建分支foo,創建一個名爲foo/rebase其中foo目前,檢查出來,變基foo/rebase,而不是新的分支。您會看到從foo可訪問的任何提交都不會被修改,因此您可以安全地在新分支上工作。就像交易一樣,您可以回滾工作(只需刪除foo/rebase)或提交該操作(使foo指向foo/rebasereset --hard,或者合併)。

在任何情況下,您仍然有reflog,它保持對任何分支或標記當前無法訪問的對象的引用。 您也可以克隆您的存儲庫,但在大多數情況下這有點矯枉過正。 就你而言,你似乎要大規模地改變分支,所以我必須承認克隆存儲庫可能是最好的方法。

+1

使用指定的rebase分支的提示是有啓發性的。 – Magne

2

Git存儲庫本身就是一個沙箱。

克隆您的存儲庫並在克隆的回購中播放。你可以做任何事情,甚至可以徹底摧毀它(刪除它)。只要你不git push,原始保持不變。

如果您想重新開始,只需刪除克隆並重新創建它。或執行命令

git checkout master 
git reset --hard origin/master 

checkout命令使master對當地回購當前分支。 reset命令將本地當前分支和工作樹恢復爲origin遠程分支master的狀態(假設您開始在master分支上播放)。

+1

謝謝。那裏的最後一個命令假設你剛剛在主分支上進行了更改。它也不會同時重置您可能進行更改的所有其他分支。所以它不會「重置整個回購」。就像你說的那樣,刪除克隆並重新創建回購,將會完成這項工作。 – Magne