1. 程式人生 > >git入門學習(二)版本控制

git入門學習(二)版本控制

git 學習第2課

說明

只是單純的記錄學習過程
之前我們學習瞭如果初始化一個版本庫,和如何提交
今天學習目:
1版本回退
2工作區和暫存區
3管理修改
4撤銷修改
5刪除檔案

版本回退

我們練習一次修改檔案.並進行提交這樣我們就一共修改了三次
廖雪峰老師說的超級容易懂:
像這樣,你不斷對檔案進行修改,然後不斷提交修改到版本庫裡,就好比玩RPG遊戲時,每通過一關就會自動把遊戲狀態存檔,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打Boss之前,你會手動存檔,以便萬一打Boss失敗了,可以從最近的地方重新開始。Git也是一樣,每當你覺得檔案修改到一定程度的時候,就可以“儲存一個快照”,這個快照在Git中被稱為commit。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失
現在我們回顧一下 hello.txt檔案已經有三個版本提交到Git倉庫裡了
當然如果記不住,也沒關係.我們可以通過

$ git log

Alt
可以看到 我有三個版本,並且會顯示我們的使用者名稱,聯絡方式,時間,和之前commit時的備註資訊
當然如果你覺得輸出的東西太多可以試試加上–pretty=oneline引數:

$ git log --pretty=oneline
61ba434205352423102f242d58caadf18b177545 (HEAD -> master) change 3 hello.txt
2dd708896a1e09542831fa7a85b4b7093415016f change hello.txt
00c9f68503242971872269fb77ed6a7895ecc46a add hello.
txt

簡潔了不少對吧
好了我們要開始做時光穿梭機啦
有沒有發現我們每條記錄前面都有一個很大的值,而這個值就是版本號(SHA1計算出來的非常大的數字,用十六進位制表示,你看到的和我的一定會不一樣以你自己的為準)
當然我們必須要知道當前是哪個版本,在Git中用HEAD表示當前版本,上一個版本就是HEAD^上上一個版本就是HEAD ^^以此類推
現在我們要把當前版本回退到上一個版本,就可以使用git reset命令

$ git reset --hard HEAD^
HEAD is now at 2dd7088 change hello.txt

如果這樣就是成功了,可以檢視一下檔案,果然回覆到上一次提交的時候了.
此時我們在通過 git log 看一下會發現最新的那個版本已經看不到了,但我們穿梭時空到了唐朝就不能回來了???放心辦法還是有的,當然這個介面還沒有關對吧,快點往上翻看一下之前最新的版本號,
在通過命令

$ git reset --hard 61ba43
HEAD is now at 61ba434 change 3 hello.txt

版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了。
在通過git log 檢視一下 哈哈 又回來啦
但是我們要是隻能通過往上翻的這種辦法也太沒有逼格了
在Git中我們可以無所欲為 哈哈哈
我們可以通過git reflog 檢視我們每次提交的版本號 並且會加上備註資訊所以 我們備註資訊一定要見名知意,最起碼我們要自己看得懂.

$ git reflog
2dd7088 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
61ba434 HEAD@{1}: reset: moving to 61ba43
2dd7088 (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
61ba434 HEAD@{3}: commit: change 3 hello.txt
2dd7088 (HEAD -> master) HEAD@{4}: commit: change hello.txt
00c9f68 HEAD@{5}: commit (initial): add hello.txt

工作區和暫存區

工作區:就是我們電腦中能看到的目錄,我們的專案目錄工作區中我們班有一個.git目錄這是Git的版本庫在版本庫裡存著很多東西最重要的就是我們的暫存區(stage),還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD
git add 命令實際就是要把我們所有修改的內容提交到了暫存區,然後執行 git commit 就可以把暫存區的所有修改提交到分支

撤銷修改

在我們修改完之後,突然發現莫名出問題了.想要恢復到修改之前的樣子:
此時我們分為兩張情況,該專案還在工作區(也就是說我們還沒有 git add )

//檢視一下git狀態
 git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   test.txt
no changes added to commit (use "git add" and/or "git commit -a")

git checkout – 可以看到Git已經告訴我們如何做了
輸入以下命令:
git checkout --檔名
再次檢視該檔案你應該會發現已經恢復到修改之前了

第二種情況,該專案已經被你add到暫存區了,但很幸運在你commit之前你及時的發現了自己愚蠢的行為

//檢視一下git狀態
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        modified:   test.txt

(use “git reset HEAD …” to unstage)Git告訴我們通過這個辦法可以吧暫存區的修改撤銷掉,重新放回工作區
之後在重複一種情況的方法就解決啦

還有一種情況就是你已經提交到了版本庫,我們可以通過版本回退回退到上一個版本不過室友前提的.就是還沒有把自己的本地版本庫推送的遠端,後面咱們應該會學到遠端版本庫,一旦提交到遠端版本庫,那就真的完蛋啦~~~~~~~~~~~~~~~~~~~~

刪除

當我們失誤把工作區的檔案刪了之後,可以通過
git check – 檔名 回覆
如果真的要在版本庫中刪除
git rm 檔名就刪除了

結束

$ git log --pretty=oneline 檢視所有版本日誌
$ git reset --hard HEAD^ 退回到上一個版本
$ git reset --hard 版本號 返回到指定版本
$git diff HEAD – 檔名 可以檢視工作區和版本庫最新版本的區別
$git checkout – 檔名 在暫存區返回修改之前的版本
$git reset HEAD 檔名 可以吧暫存區的修改撤銷掉
git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。