天天看點

Git 學習筆記<本地版本庫的管理> (二)

今天來記錄一下關于版本庫的建立與管理的筆記。

版本庫是什麼?

版本庫可以了解為一個倉庫(一個可以被git管理的目錄),裡面檔案的修改删除都可以被追蹤,并且每個版本都會儲存以便還原(僅僅儲存修改或删除的檔案),于是可以認為儲存了各種不同的版本,是以叫版本庫。

如何管理?

Git給你提供各種不同的指令來管理版本庫。

1.建立:

選擇一個地方建立一個新檔案夾,然後進入這個檔案夾(windows中不要出現中文路徑)

$mkdir LEARNER   //目前目錄下建立檔案夾

$cd LEARNER //進入此檔案夾

如果你不知道目前目錄在哪 可以輸入 $pwd 便會顯示完整路徑

接下來 $git init 這時這個檔案夾就可以被git管理了,當然設定一個已有檔案的目錄也是可以的.

2.添加檔案到版本庫:

如第一章所說,本地端存在工作區,版本庫.

你手動在檔案夾建立的所有檔案其實是存在于工作區,你還必須上傳到版本庫的暫存區,然後在送出給正式的版本庫.暫存區的存在便于你一次送出多個檔案,這樣版本庫的代碼保持完整性随時可以運作.

還有一個問題就是, git隻能追蹤諸如TXT檔案、網頁、代碼的變動(包括第幾行的變化),圖檔、視訊等雖然可以管理但不知道哪裡變化。而且,word文檔也是無法追蹤變化的。

建議使用UTF-8編碼來儲存檔案。此時不要用windows的記事本來編輯文本,因為記事本儲存UTF-8時會在開頭加一個 0xefbbbf(十六進制)的字元。可能會有一些意想不到的錯誤。應該下載下傳别的文本編輯器,比如 PSPad 。

接下來來添加檔案。

建立一個hello.txt檔案

/*Hello, I'm Hanson Green.*/
/*Wish You Can Learn Something From Here.*/      

儲存于git管理的目錄下(子目錄也可以)。

① 在Git Bash 中輸入$git add hello.txt (沒有顯示即成功),此時檔案存于暫存區。

② 繼續輸入$git commit -m "add hello.txt"  這時檔案便送出給倉庫。 後面的 -m "content" 是用來儲存本次送出有關備注的。一定要填,這對工作是必要的。 

1 file changed, 2 insertions(+) 告訴你 改變了一個檔案,增加了兩行。

這樣便送出了檔案。你可以一次add多個檔案一次性送出。

3.檢視工作區的狀态:

接下來對hello.txt進行更改

/*Hello, I'm Hanson Chan.*/
/*Wish You Can Learn Something From Here.*/      

然後再輸入  $git status (檢視狀态)

顯示如下:

?

$ 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:   hello.txt

no changes added to commit (use

"git add"

and/or

"git commit -a"

)

它告訴你 有改變沒有被送出。有提示兩種解決辦法:使用 git add <file> 來添加将被送出的檔案;使用 git checkout --<file> 來丢棄改變(此方法下面提到)。

然後提示被修改的檔案是 hello.txt。 是不是很人性化?那接下來想檢視修改的地方怎麼辦呢。

輸入 $git diff

$ git diff
diff --git a/hello.txt b/hello.txt
index faa367f..761d254 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,2 @@ -/*Hello, I'm Hanson Green.*/ +/*Hello, I'm Hanson Chan.*/ /*Wish You Can Learn Something From Here.*/ \ No newline at end of file      

便可以檢視到更改的地方。

輸入 $git add hello.txt

然後再檢視狀态 $git status

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   hello.txt      

On branch master 是在分支master,之後會說到。

然後 $git commit -m "change my name"   成功送出

之後輸入$git status 就會提示工作區是幹淨的 沒有需要送出的東西。

4.版本回退與管理:

首先我們再在檔案中添加一行 

然後進行add 和 commit -m "some change" (一定要輸入備注)

我們如何知道前幾次送出的記錄呢?當然是有辦法的。

輸入 $git log   (Git log後面可以加-3 , -3的意思是隻顯示兩個commit,如果想顯示5個,就-5。不指定的話,git log會從該commit一直往後顯示。)

  $ git log

  commit b160e923d62a6568233d4278551893bd00c3e1c0

  Author: 大大大大大沐魇 <[email protected]>

  Date: Wed Aug 6 11:37:08 2014 +0800

      some change

commit f5842ba282aec415f1cebe5899ec413ce74fc681
Author: 大大大大大沐魇 <[email protected]>
Date:   Wed Aug 6 11:11:47 2014 +0800 change my name commit cf6f342e99cbe0650c6f6272583497a60326e47a Author: 大大大大大沐魇 <[email protected]> Date: Wed Aug 6 10:53:18 2014 +0800 add hello.txt      

所有資訊都記錄在案。commit就是對應的版本号了。如果覺得太多,輸入 $ git log --pretty=oneline 就隻會顯示commit 和 備注了。

然後你發現這次更改有錯誤但已經送出到本地庫了,想回退到上一個版本怎麼辦?

方法①:

輸入 $git reset --hard HEAD^ 

HEAD即為目前分支(也可以直接寫分支名稱,

Git 學習筆記&lt;本地版本庫的管理&gt; (二)

比如現在的master。這個概念以後講。)

後面的 ^ 表示上一個版本 。^^表示上兩個,等同于 ~2  即  $git reset --hard HEAD~2

那--hard 參數又是什麼意思呢? 其實還有 --soft 和 --mixed 選項

       --mixed 這個是預設的選項。如git reset [--mixed] master^。它的作用僅是重置分支狀态到master^, 但是卻不改變任何工作檔案的内容。即,從master^到master的所有檔案變化都保留了,但是master^到master之間的所有commit日志都被清除了, 而且,發生變化的檔案内容也沒有通過git add辨別,如果您要重新commit,還需要對變化的檔案做一次git add。 這樣,commit後,就得到了一份非常幹淨的送出記錄。 (回退了暫存區和倉庫中的内容) 

       --soft相當于做了git reset –mixed,後,又對變化的檔案做了git add。如果用了該選項, 就可以直接commit了。(回退了倉庫中的内容) 

       --hard這個指令就會導緻所有資訊的回退, 包括檔案内容。 一般隻有在重置廢棄代碼時,才用它。 執行後,檔案内容也無法恢複回來了。(回退了工作目錄、暫存區和倉庫中的内容) 

 或者 知道了版本号的話 比如 change my name 那個commit_id 是 f5842ba282aec415f1cebe5899ec413ce74fc681

 執行 $git reset f5842ba2  可以直接回退到這個版本 , 不必輸入完全 可以通過前幾個字母找到這個commit即可。

另外 上述引用中說--hard 無法恢複回來也是有個例外的。也就是當你還沒有關閉指令行時,可以向上翻到那個版本号 執行 $git reset commit_id(你找到的版本号) 即可。

而且...使用$git reflog 可以查到你所有的操作記錄,也可以查到原來的commit _id

方法②:

輸入 $ git revert commit_id

這個也是可以回到原來的版本,但是這時候是形成一個新的記錄,而不是往回退。

-------------------------------

這兩個方法的差別就是:reset 是往回退,那個版本之後的記錄會從倉庫中消失(根據你選擇的模式是否存在于工作區或者暫存區)。而 revert 相當于是一個新版本,不過與你指定的版本号的檔案一樣。

 ------------------------------

5.撤銷你在工作區或者暫存區的修改:

還記得3中的工作區裡修改後檢視狀态嗎?

沒錯,就是使用 $git checkout -- file 即可 撤銷工作區的修改到最後一次 git add 或者commit的時候。(file是檔案名)

還記得add修改檔案之後檢視狀态嗎?

就是使用 $git reset HEAD file    然後暫存區的檔案就會回退到工作區。再執行丢棄工作區修改的代碼即可(就在上面兩行)。

6.删除檔案:

使用$rm file  可以删除工作區的檔案(如果你删錯了可以用$git checkout -- file ),然後再輸入 $git rm file 和$git commit -m "remove file" 就會從版本庫中删除了。

轉載于:https://www.cnblogs.com/ainubis/p/3990285.html

繼續閱讀