GIT學習筆記
修改管理、撤銷
管理修改
- 爲什麼Git比其他版本的控制系統設計的優秀,因爲Git跟蹤並管理的是修改,而非文件。也就是說,所有修改,比如增加一行、刪除一行、甚至創建一個新文件也算是修改。
- 爲什麼說Git管理的是修改而不是文件呢?我們可以做一個實驗,第一步,對
readme.txt
做一個修改,比如加一行內容並添加:
$ git add readme.txt
$ git status
位於分支 master
要提交的變更:
(使用 "git reset HEAD <文件>..." 以取消暫存)
- 然後,再修改
readme.txt
並提交:
$ git commit -m "git tracks changes"
[master 376d9c0] git tracks changes
1 file changed, 1 insertion(+)
- 提交後,再看看狀態:
$ git status
位於分支 master
尚未暫存以備提交的變更:
(使用 "git add <文件>..." 更新要提交的內容)
(使用 "git checkout -- <文件>..." 丟棄工作區的改動)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 我們發現,第二次的修改沒有被提交。回顧一下操作過程:
第一次修改->git add
->第二次修改->git commit
- 前面講到,git管理的是修改,當使用
git add
命令後,在工作區的第一次修改被放入暫存區準備提交。但是,在工作區的第二次修改並沒有放入暫存區,所以,git commit
只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次修改不會被提交。 - 提交後,用
git diff HEAD -- readme.txt
命令可以查看工作區和版本庫裏面最新版本的區別:
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
- 可見,第二次修改確實沒有被提交。
- 那怎麼才能提交第二次修改呢?可以繼續
git add
再git commit
,也可以不着急提交第一次修改,先git add
第二次修改,再git commit
,相當於是把兩次修改合併後一起提交了。
撤銷修改情況一
- 如果在
readme.txt
文件中多添加了一行,提交後,用git status
查看,Git會提示使用git checkout -- <file>...
可以丟棄工作區的修改。
$ git checkout -- readme.txt
- 命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作區的修改全部撤銷,這裏有兩種情況:- 一種是
readme.txt
自修改後還沒有放到暫存區,現在,舍小修改就回到和版本庫一模一樣的狀態; - 一種是
readme.txt
已經添加到暫存區後,又做了修改,現在,撤銷修改就回到添加到暫存區後的狀態。
- 一種是
- 總之,就是讓這個文件回到最近一次
git commit
或git add
時的狀態。 - 撤銷後,我們再看看
readme.txt
文件內容:
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
- 文件內容復原了
- 注意:
git checkout -- file
命令中的--
很重要,沒有--
,就變成了切換到另一個分支的命令,我們在後面的分支管理中會再次遇到git checkout
命令。
撤銷修改情況二
- 如果要被撤銷的內容不但被寫入了文件,還被
git add
添加到暫存區了,在commit
前發現了這個問題,用git status
查看,修改只是添加到了暫存區,還沒有被提交:
$ git status
位於分支 master
要提交的變更:
(使用 "git reset HEAD <文件>..." 以取消暫存)
修改: readme.txt
- Git同樣告訴我們,用命令
git reset HEAD <file>
可以把暫存區的修改撤銷掉(unstage),重新放回工作區。
$ git reset HEAD readme.txt
重置後取消暫存的變更:
M readme.txt
- 再用
git status
查看一下,確保暫存區是乾淨的,工作區有修改
$ git status
位於分支 master
尚未暫存以備提交的變更:
(使用 "git add <文件>..." 更新要提交的內容)
(使用 "git checkout -- <文件>..." 丟棄工作區的改動)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 這樣我們可以再使用
checkout
來丟棄工作區的修改。
撤銷修改情況三
- 如果把要被修改的文件提交到了版本庫,我們就要使用前面學過的版本回退 。不過這是有條件的,即在推送到遠程版本庫之前進行版本回退。
刪除文件
- 在Git中,刪除文件也是一種修改操作,我們先添加一個
test.txt
文件到Git中並提交:
$ git add text.txt
$ git commit -m "add text.txt"
[master 89274d2] add text.txt
1 file changed, 2 insertions(+)
create mode 100644 text.txt
- 然後如果我們想刪除那些沒用的文件,就可以直接在文件管理器中刪除、或者使用
rm
命令刪除:
$ rm text.txt
- 這個時候,Git知道你刪除了文件,因此,工作區和版本庫就不一致了,
git status
命令會立刻告訴你哪些文件被刪除了:
$ git status
位於分支 master
尚未暫存以備提交的變更:
(使用 "git add/rm <文件>..." 更新要提交的內容)
(使用 "git checkout -- <文件>..." 丟棄工作區的改動)
刪除: text.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 現在有兩種選擇,一是確實從版本庫中刪除文件,就用命令
git rm
刪掉,並且git commit
:
$ git rm text.txt
rm 'text.txt'
$ git commit -m "delete text.txt"
[master acc1af6] delete text.txt
1 file changed, 2 deletions(-)
delete mode 100644 text.txt
- 這樣就把文件從版本庫中刪除了。
先手動刪除文件,再使用
git rm <file>
和git add <file>
效果是一樣的。
- 另一種情況是刪錯了,因爲版本庫裏還有呢,所以可以很輕鬆地把誤刪的文件恢復到最新版本:
$ git checkout -- test.txt
git checkout
其實是用版本庫裏的版本替換工作區的版本,所以無論工作區是修改還是刪除,都可以“一鍵還原”。
注意:從來沒有被添加到版本庫就被刪除的文件,是無法恢復的。