[原]git的使用(一)---建立本地倉庫、add和commit、status和git diff、版本回退使用git reset


在window下已經安裝了git的環境

1.建立本地倉庫

 mkdir   test     #建立test目錄

  cd   test        #進入目錄

 git  init           #創建好了本地git倉庫,會發現在test目錄中多了一個.git目錄,並且這個目錄是隱藏的

示例:

$ git init
Initialized empty Git repository in F:/git-repo/test/.git/

init前

init后

2.提交文件到中轉站和倉庫(add和commit)

使用Notepad++創建一個文本文件readme.txt

(記得把Notepad++的默認編碼設置為UTF-8 without BOM)不能使用記事本等其他工具創建

readme.txt文件位於test目錄中

readme.txt文件內容為:

Git is a version control system.
Git is free software.
[提交到中轉站]在路徑為test目錄中執行命令           
$ git add readme.txt                #告訴git 將readme.txt文件添加到倉庫等等提交(也可以認為添加到了倉庫中轉站)沒有任何輸出表示正確添加到中轉站
[提交到倉庫]在路徑為test目錄中執行命令
$ git commit -m "wrote a readme file"                #告訴git 將剛才放置在中轉站的提交到倉庫 並給這個提交動作附上一個標簽
[master (root-commit) 51af5b3] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

注意:注意:注意:

為什么提交要用add和commit   因為可以add多個文件到中轉站,一次commit就可以將中轉站中的文件提交到倉庫。

比如:

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

 ------------------------------------------------------add時遇到的warning-----------------------------------------

$ git add file1.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory.

------------------------------------------------------需要了解的概念-----------------------------------------

LF是linux下的換行符,而CRLF是enter + 換行

當創建文檔的時候使用的環境是windows,而git運行環境在linux環境

-------------------------------------------------------解決這個warning--------------------------------------

git config --global core.autocrlf false


----------------------------------------------------------end--------------------------------------------------

3.git status和git diff
一般步驟為,檢查init的git倉庫的文件是否有修改 git status
如果有修改就查看修改的地方是不是正確的 git diff
如果修改正確的就提交的中轉站 git add <file>
不清楚是否正確提交到中轉站 git status
如果正確就再提交到倉庫確保代碼正常 git commit <file> -m "string"
$ git status                                #查看init倉庫所有文件的狀態,即查看當前文件test目錄中的所有文件的狀態(未修改/修改/更新)包括中轉站中的文件狀態
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 diff readme.txt                       #查看被修改的文件,修改了哪些東西
diff --git a/readme.txt b/readme.txt        #比較修改前和修改后的文件
index d8036c1..53d4271 100644
--- a/readme.txt                            
+++ b/readme.txt                             #在readme.txt中做了增加操作
@@ -1,2 +1,2 @@
-Git is a version control system.
-Git is free software.
\ No newline at end of file
+Git is a distributed  version control system.
+Git is free software.
$ git add readme.txt                       #檢查修改無誤后提交到中轉站
$ git status                               #確認各個文件的狀態和中轉站里的文件
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt
$ git commit readme.txt -m "add distributed "      #將中轉站里的文件提交到.git倉庫
[master 9682929] add distributed
 1 file changed, 2 insertions(+), 2 deletions(-)

 最后,相當於所有的修改都已經提交到了git倉庫里面

$ git status                           #查看整個Test目錄的結果
On branch master
nothing to commit, working directory clean     #已經clean了

 

4.git的快照commit

從之前的改動到現在已經提交了三個版本的readme.txt到.git倉庫

版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

版本3:append GPL

Git is a distributed version control system.
Git is free software distributed under the GPL.

查看git的快照commit,需要使用git log:

類似每次快照都要產生log文件,需要用git log來查看快照,git log是按照最新到最舊來顯示。

如下:

################################
  【需要了解的概念】:Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),
  上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
################################


$ git log commit f78cd0925b2bc2883d7ed4de49b1a851367ae56d #這一串數字代表快照的id號,由SHA1產生 Author: userlhb
<lhb@lhb.com>                 Date: Sat Mar 26 20:23:52 2016 +0800 #最新的commit快照 也叫做HEAD快照 append GPL commit 96829291d720b3b84d0ab2a5aad89b0af97a1394 Author: userlhb <lhb@lhb.com> Date: Sat Mar 26 16:20:13 2016 +0800 add distributed #這是HEAD快照的前一個快照 用HEAD^表示 commit 51af5b36b85c52e86b6140d3a73b5e22cd3f78da Author: userlhb <lhb@lhb.com> Date: Sat Mar 26 15:36:57 2016 +0800 #最舊的commit快照 wrote a readme file #這是HEAD快照的前前一個快照 用HEAD^^表示,問題來了?如果前前一百個,怎么表示? HEAD~100

或者顯示為一行,添加--pretty=oneline

$ git log --pretty=oneline
f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

 

5.git中實現版本回退使用git reset

   先看下面兩幅圖兩分鍾:

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

    

圖一                                       表示當前在append GPL這個版本上

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

圖二 表示當前在wrote a readme file這個版本上。

  [看圖說明]

  git reset 可以控制指針 HEAD 在不同的快照直接切換,如果需要切換到上一個快照用git reset --hard HEAD^

  git reset 和 git commit <file> -m "string" 的動作會被記錄到git reflog中,使用git reflog可以查看記錄

  git log 查看所有提交到版本庫中的快照(版本)

 

  

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

[實踐出真知]

看圖一,理解回退。
回退到中間那個版本add disributed
$ git log --pretty=oneline                                         #列出.git倉庫中的所有版本號
f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file


$ git reset --hard HEAD^                                                  #回退到前一個版本add distributed
Unstaged changes after reset:
M       readme.txt


$ git log --pretty=oneline                                         #查看是否回退到add distributed,不能查看之前的版本。
96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

有沒有發現什么?對,回退到add distributed后,不能查看之前的版本。要是又要回退到最開始那個版本怎么辦呢?

看圖二,理解回退到倉庫中最新的那個版本:因為 git reflog 能記錄 git reset和git commit <file> -m "string"的動作,所以可以

使用git reflog來查看每個動作的id號,然后通過id號回退到最新的那個版本append GPL

[實踐出真知]

$ git reflog                                         #羅列出所有的HEAD動作
9682929 HEAD@{0}: reset: moving to HEAD^
f78cd09 HEAD@{1}: commit: append GPL                 #append GPL 的id是 f78cd09
9682929 HEAD@{2}: commit: add distributed
51af5b3 HEAD@{3}: commit (initial): wrote a readme file


$ git reset --hard f78cd09 #移動HEAD指針到 f78cd09 append GPL $ git log --pretty=oneline #查看是否切換到append GPL 這個版本 f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file

 接下一篇:git的使用(二)

 

參考git教程:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

 

 





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM