git 學習筆記1

學習參考:https://www.liaoxuefeng.com/wiki/896043488029600/896827951938304

1 、簡介

2 、安裝git

3 、創建版本庫

  什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

3.1 創建一個目錄

$ mkdir learngit
$ cd learngit
$ pwd
/e/learngit

pwd命令用於顯示當前目錄

3.2 、git init 把目錄變成倉庫

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

  瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),可以發現當前目錄下多了一個.git的目錄。
  如果你沒有看到.git目錄,那是因爲這個目錄默認是隱藏的,用ls -ah命令就可以看見。
  也不一定必須在空目錄下創建Git倉庫,選擇一個已經有東西的目錄也是可以的。

3.3、把文件添加到倉庫

  建立一個新文件readme.txt,一定要放在learngit目錄下(子目錄也行)。不能用記事本編輯,因爲記事本會自動在文件開頭添加了0xefbbbf(十六進制)的字符。
在文件中寫入以下內容,NO1表示版本1

git is a version control system.
NO1.

執行執行2步,把文件添加到倉庫
1、$ git add readme.txt    把文件添加到倉庫
2、$ git commit -m “wrote a readme file”  把文件提交到倉庫

  簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容。
  git commit命令執行成功後會告訴你,1 file changed:1個文件被改動(我們新添加的readme.txt文件),2 insertions:插入了兩行內容(readme.txt文件我們寫了兩行內容)

$ git commit -m "the first time commit"
[master (root-commit) 3ee6593] the first time commit
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

爲什麼Git添加文件需要add,commit一共兩步呢?因爲commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

使用通配符,一次add 所有文件

git add .   一次提交所有文件
git add *.h  只交.h的文件
git add *.c

git commit

4 、時光機穿梭

  我們已經成功地添加並提交了一個readme.txt文件,現在,是時候繼續工作了,於是,我們繼續修改readme.txt文件,改成如下內容

git is a version control system.
NO2.

  運行git status命令看看結果:
在這裏插入圖片描述
  git status命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令輸出告訴我們,readme.txt被修改過了,但還沒有準備提交的修改。
  雖然Git告訴我們readme.txt被修改了,但如果能看看具體修改了什麼內容,自然是很好的。比如你休假兩週從國外回來,第一天上班時,已經記不清上次怎麼修改的readme.txt,所以,

需要用git diff這個命令看看差異:
在這裏插入圖片描述
  提交修改和提交新文件是一樣的兩步,第一步是git add 和 git commit
在這裏插入圖片描述
  git status告訴我們,將要被提交的修改包括readme.txt,下一步,就可以放心地提交了
在這裏插入圖片描述

4.1、版本回退

再次修改爲

git is a version control system.
NO3.

  然後提交,像這樣,你不斷對文件進行修改,然後不斷提交修改到版本庫裏。

  我們回顧一下readme.txt文件一共有3個版本了,NO1,NO2,NO3
  當然了,在實際工作中,我們腦子裏怎麼可能記得一個幾千行的文件每次都改了什麼內容,不然要版本控制系統幹什麼。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看:
在這裏插入圖片描述
  git log命令顯示從最近到最遠的提交日誌,我們可以看到3次提交

  如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上–pretty=oneline參數:
在這裏插入圖片描述
友情提示的是,你看到的一大串類似c4cde2654…的是commit id(版本號)
  好了,現在準備把readme.txt回退到上一個版本,也就是NO2的那個版本,怎麼做呢?
———————————————————————————————————————————————————
  首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交c4cde2654…上一個版本就是HEAD^,上上一個版本就是HEAD^^, 當然往上100個版本寫100個 ^ 比較容易數不過來,所以寫成HEAD~100。

  現在,我們要把當前版本NO3回退到上一個版本NO2,就可以使用git reset命令:

退回上一版本:
在這裏插入圖片描述
- -hard參數有啥意義?

  如果沒有–hard,則默認是–mixed參數,只是重置了暫存區,即把commit提交的內容放回暫存區,而工作區沒有變。如果再要把暫存區的內容放回到工作區,需要再使用git checkout -- filename
  加–hard參數,則是同時重置 暫存區 和工作區,commit的內容會回到暫存區和工作區,最新做的修改會丟失
  加–soft參數,只是移動了版本庫HEAD的指針,工作區和暫存區的內容都沒變。

看看readme.txt的內容是不是已經變成NO2
果然被還原了
  還可以繼續回退到上一個版本NO1,不過且慢,然我們用git log再看看現在版本庫的狀態:
在這裏插入圖片描述
  最新的那個版本NO3已經看不到了!好比你從21世紀坐時光穿梭機來到了19世紀,想再回去已經回不去了,腫麼辦?
  辦法其實還是有的,只要上面的命令行窗口還沒有被關掉,你就可以順着往上找啊找啊,找到那個NO3的commit id是c4cde2654…,於是就可以指定回到未來的某個版本:

(退回指定版本,注意需要–hard)
在這裏插入圖片描述
  版本號沒必要寫全,前幾位就可以了,Git會自動去找。當然也不能只寫前一兩位,因爲Git可能會找到多個版本號,就無法確定是哪一個了。
可以看到文件又回到NO3了

Git的版本回退速度非常快,因爲Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向NO3
在這裏插入圖片描述
  然後順便把工作區的文件更新了。所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪。

現在,你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?
  在Git中,總是有後悔藥可以吃的。當你用$ git reset --hard HEAD^回退到NO2版本時,再想恢復到NO3,就必須找到NO3的commit id。

Git提供了一個命令git reflog用來記錄你的每一次操作:
在這裏插入圖片描述
終於舒了口氣,從輸出可知,NO3的commit id是c4cde…,現在,你又可以乘坐時光機回到未來了.

4.2、工作區和暫存區

工作區(Working Directory):

就是你在電腦裏能看到的目錄,比如我的learngit文件夾就是一個工作區:

版本庫(Repository)

  工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

  Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
在這裏插入圖片描述
  前面講了我們把文件往Git版本庫裏添加的時候,是分兩步執行的:

第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;

第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

  因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

  你可以簡單理解爲,需要提交的文件修改 通通放到暫存區,然後,一次性提交暫存區的所有修改。

實踐出真知。現在,我們再練習一遍:

A、先對readme.txt做個修改,比如加上一行內容:
B、在工作區新增一個LICENSE文本文件(內容隨便寫)
先用git status查看一下狀態:
在這裏插入圖片描述
  Git非常清楚地告訴我們,readme.txt被修改了,而LICENSE還從來沒有被添加過,所以它的狀態是Untracked。

  現在,使用兩次命令git add,把readme.txt和LICENSE都添加後,用git status再查看一下:
在這裏插入圖片描述
現在,暫存區的狀態就變成這樣了:
在這裏插入圖片描述
  所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改提交到分支。
在這裏插入圖片描述
  一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是“乾淨”的:
在這裏插入圖片描述

4.3、管理修改

  爲什麼Git比其他版本控制系統設計得優秀,因爲Git跟蹤並管理的是修改,而非文件。
  爲什麼說Git管理的是修改,而不是文件呢?我們還是做實驗。

對readme.txt做一個修改,比如加一行內容 ------->然後 git add readme.txt ------->然後再修改readme.txt ------->然後 git commit readme.txt 後查看狀態:

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

no changes added to commit (use "git add" and/or "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,就相當於把兩次修改合併後一塊提交了:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

  好,現在,把第二次修改提交了,然後開始小結。

小結:

  現在,你又理解了Git是如何跟蹤修改的,每次修改,如果不用git add到暫存區,那就不會加入到commit中。

4.4、撤銷修改

如果只是修改了工作區還沒有git add:

$ git checkout -- readme.txt

  把工作區的修改丟棄,把暫存區的內容搬加工作區
(如果暫時區與庫一樣,則這時工作區、暫存區,版本庫 三者的內容都一樣)

命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令

如果已經git add 到暫時區了:

$ git reset HEAD readme.txt

把暫存區內容丟棄,用版本庫的內容替換。這時工作區是最新的修改,暫存區與版本庫一樣
用上面的git checkout -- readme.txt可以把工作區丟棄。
也可以直接用以下命令,直接把工作區、暫存區都丟棄,用版本庫代替。

$ git reset --hard HEAD readme.txt

4.5、刪除文件

  我們在文件夾裏直接把一個文件 test.txt 刪除了,因此工作區與版本庫就不一樣了,git status會告訴你有文件被刪除。
1、你確實在刪除文件,可以用git rm test.txt 把文件刪掉

2、如果是誤刪了,可以用 git checkout – test.txt 從暫存區恢復。

注意,沒有git commit 過的文件是無法恢復的。

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