上一節最後留了三個問題,本節我們就Git的版本回退和gitignore做一個詳細介紹。
本節內容預告:
- git版本回退
- gitignore介紹以及使用
- 總結回顧
1.git版本回退
日常開發中,我們可能會遇見的一個問題是提交錯了內容,不管是提交到了暫存區,還是提交到了版本庫,都需要涉及到版本的回退,如果不熟悉這些操作導致誤操作,可能會關聯引發一系列的問題,很影響工作效率,所以通過本節課學習,希望讀者能掌握版本回退常見問題以及解決辦法,而不是每次遇見問題就去百度。
- 已經被git跟蹤但是工作區有修改沒保存到暫存區的文件想丟棄工作區的內容怎麼做?
可以看到,上面先是修改了一個已經被git追蹤的文件test.txt ,然後Git status查看當前狀態,git 提示有沒保存到暫存區的文件,此時如果使用命令git checkout -- 文件名
,將會丟棄工作區的變更。此時,工作區和暫存區的內容保持一致。
一個文件可以通過指定文件名回滾,如果很多文件呢?不能一個一個回滾吧?多個文件可以通過命令git checkout -- .
實現當前工作區全部回滾。 - 已經保存到暫存區,但是沒提交到版本庫的內容,怎麼回滾?
上面我們修改文件後將文件添加到了暫存區,使用命令git reset HEAD test.txt
就會將當前在緩存區的test.txt 文件移出到工作區。移出後使用git status
,會發現文件已經到了暫存區。
一個文件可以通過文件名指定回滾,如果很多文件呢?逐個指定文件名回滾會很影響效率,通過命令git reset HEAD *
可以回滾所有文件到工作目錄。
- 對已經提交到版本庫的內容,想要回滾怎麼辦?
上面圖片可以看到,剛開始本地有兩個文件有變更,然後提交到版本庫,git log
顯示提交日誌如下,可以看到最新的提交日誌就是剛纔提交的內容,現在如果想回滾剛纔的提交怎麼辦?
先q
鍵退出查看日誌模式,然後使用命令git reset --hard HEAD^
可以看到:最新的提交已經不在,當前HEAD指向前一個提交。
使用命令git log
顯示,當前最新的是上一次提交內容,最新的提交記錄已經看不到了。
剛纔的命令可以回滾一次,如果有要回滾到兩個,三個提交之前的怎麼實現?
第一種命令方式是git reset HEAD^^
(會將變更回滾到工作區),git reset --hard HEAD
(會強制覆蓋本地內容)通過在HEAD後面加幾個符號^
,可以實現回滾到哪幾個提交之前
第二種命令方式是git reset HEAD~2
(會將變更回滾到工作區),git reset --hard HEAD~2
(會強制覆蓋本地內容)通過在HEAD後面加數字,實現往前回滾幾個提交
這兩種方式可以本地自己實踐,這裏就不重複操作了。
這裏簡單強調一下回滾命令加的參數–hard有風險,回滾需謹慎,(實際上就算hard也可以恢復的,後面會提到)
第三種方式是指定提交id,即使用命令git reset COMMITID
,實現回滾到指定的提交id
至此,git提交到暫存區,版本庫的回滾操作基本都有了解決辦法,那麼有個問題是這樣子的,如果你回滾錯了怎麼辦?比如剛開始你以爲自己要回滾,結果回滾後發現這部分代碼實際上是需要的,這時候你想恢復回去,如果你記得以前回滾之前的提交id的話,是可以的,通過git reset 提交id
可以實現恢復,但是不記得呢?
細心的同學會發現,回滾後git log
是不會顯示已經回滾掉的提交id的,那麼有沒有辦法可以看到我們的已經回滾調的提交id麼?
git給我們提供了一個命令git reflog
,git log裏面保存的是我們每次提交的提交id,git reflog 保存的是操作日誌,git reflog
可以看到每次分支切換或者在某個提交基礎上做的提交或者回滾操作,這樣就能通過命令指定提交id回滾
比如gitlog顯示當前提交爲:
我們通過命令git reset HEAD^
回滾到上一個提交,使用git log
,最新的提交已經回滾,並且看不到他的提交id
這時候我們想恢復回滾的話,使用git reflog
找到丟失的提交id
然後使用命令git reset 提交id
,恢復回滾內容
2. gitignore
我們在開發過程中項目經常會自動生成一些與你本地環境相關的文件,比如idea的.idea文件和eclipse生成的.eclipse,還有一些文件是你只想自己本地使用不想提交到版本庫的等等,這些文件實際上是不需要也不應該提交到git的版本庫中的,因爲不同電腦環境不同,提交上去,多人協作的話可能會出各種環境問題。
這部分文件我們也可以通過人爲的方式控制不提交,但是這樣每次變更就要留意這部分變動,很花精力而且容易出錯,所以Git提供給我們一種方式處理這種情況。
通過在當前git倉庫根目錄加一個名稱爲.gitignore
的文件,放在這裏面的文件實際上是不會被git追蹤的。
配置語法
以斜槓“/”開頭表示目錄;
以星號“*”通配多個字符;
以問號“?”通配單個字符
以方括號“[]”包含單個字符的匹配列表;
以歎號“!”表示不忽略(跟蹤)匹配到的文件或目錄。
注意: git 對於 .gitignore配置文件是按行從上到下進行規則匹配的
如下面截圖:這裏需要留意如果你創建.gitignore文件之前就push了某一文件,那麼即使你在.gitignore文件中寫入過濾該文件的規則,該規則也不會起作用,git仍然會對該文件進行版本管理。
可以看到.gitignore
文件添加了一個文件ignoretest.txt 文件,然後我們修改這個文件,發現git沒有跟蹤到這個變更
3.總結回顧
本節剛開始引入了兩個問題:
- 如果提交錯了需要回滾怎麼辦?這裏涉及到工作區,暫存區,版本庫的回滾。並針對每種情況的處理方式做了說明。包括一個文件和多個文件的回滾,後面提到一種情況是你回滾錯了怎麼辦?針對已經保存到版本庫的內容,回滾錯了可以通過 git reflog找到對應的提交id實現恢復回滾。
針對保存到暫存區的內容,如果回滾到了本地工作區的話,可以重複提交,重新添加到暫存區,工作區內容如果回滾覆蓋,因爲還沒有被git記錄,可能會出現丟失無法恢復。但是如果用IDEA開發的話,idea會緩存你的代碼痕跡,可以通過歷史記錄恢復這部分內容,這個後面說到idea和git結合使用會提到。 - 第二個問題是針對項目運行的環境相關文件以及編譯的文件,這部分代碼是不需要也不應該提交到版本庫中的,git提供了一個git ignore的功能,可以通過在.gitignore 實現提交忽略這部分文件。具體規則就不展開陳述了,有問題可以留言一起討論。
本節內容暫時告一段落,下一節我會就Git分支管理和git分支之間代碼合併等做一個簡單介紹。
最後,感謝閱讀,如有錯誤,請不吝指正