git學習筆記——管理、撤銷修改

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 addgit 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 commitgit 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其實是用版本庫裏的版本替換工作區的版本,所以無論工作區是修改還是刪除,都可以“一鍵還原”。

注意:從來沒有被添加到版本庫就被刪除的文件,是無法恢復的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章