參考教程:https://download.csdn.net/download/essity/10359744
一 集中式vs分佈式
集中式:集中式版本控制系統,版本庫集中存放在中央服務器,工作時要先從中央服務器取得最新的版本,幹完活了,再把代碼推送給中央服務器。
分佈式:分佈式版本控制系統沒有“中央服務器”,每個⼈的電腦上都有⼀個完整的版本庫,⼯作時不需要重新獲取新版本。多⼈協作時只需把各⾃的修改推送給對⽅,就可以互相看到對⽅的修改了。
二 git全局配置
因爲 git 是分佈式版本控制系統,所以,每個機器都必須⾃報家⻔:你的 name 和 Email 地址。在命令⾏輸⼊:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
–global 表⽰這臺機器上所有的 git 倉庫都會使⽤這個配置;如果對某個倉庫指定不同的⽤ name 和 Email 地址,只需要去掉 --global 參數,對單個倉庫進行配置。
三 創建版本庫
版本庫⼜名倉庫,英⽂名 repository,可以簡單理解成⼀個目錄,這個目錄⾥⾯的所有⽂件都可以被 git 管理起來,每個⽂件的修改、刪除,git 都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
建好了⼀個空的倉庫(empty Git repository),可以發現當前目錄下多了⼀個 .git 的目錄,這個目錄是 git 來跟蹤管理版本庫的,⼿動修改目錄⾥⾯的⽂件容易把倉庫給破壞了。選擇⼀個已經有文件的目錄也是可以創建倉庫。不建議使⽤⾃⼰正在開發的公司項目來學習 git。
四 把文件添加到版本庫
版本控制系統只能跟蹤⽂本⽂件的改動。⼆進制⽂件雖然也能由版本控制系統管理,但沒法跟蹤⽂件的變化,Word格式是⼆進制格式。對於⽂本編碼,如果沒有歷史遺留問題,強烈建議使⽤標準的UTF-8編碼,所有語⾔使⽤同⼀種編碼,既沒有衝突,⼜被所有平臺所⽀持。
把⼀個⽂件放到Git倉庫只需要兩步。
第⼀步,⽤命令git add告訴Git,把⽂件添加到倉庫:
$ git add readme.txt
第二步,用命令git commit告訴Git,把文件提交到倉庫:
$ git commit -m "wrote a readme file"
[master (root-commit) cb926e7] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
簡單解釋⼀下git commit命令, -m後⾯輸⼊的是本次提交的說明,可以輸⼊任意內容,當然最好是有意義的,這樣你就能從歷史記錄⾥⽅便地找到改動記錄。
五 工作區、暫存區和版本庫
工作區(Working Directory):指的是在PC中能看得到的創建的一個管理倉庫的目錄,即當前項目目錄。
版本庫(Repository):工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
把文件往Git版本庫裏添加的時候,第一步是用git add
把文件添加進去,是把文件修改添加到暫存區;第二步是用git commit
提交更改,是把暫存區的所有內容提交到當前分支。因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。可以簡單理解爲,需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
origin:如果將代碼託管到遠程服務器上,例如 github,gitee 或者自己搭建的 gitlab,就會設計到這個概念,對於 origin 以及其他遠程概念,後續引出。
六 版本控制
一、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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以讓我們時刻掌握倉庫當前的狀態,上⾯的命令告訴我們,readme.txt被修改過了,但還沒有準備提交的修改。
二、git diff(內容比較)
雖然Git告訴我們readme.txt被修改了,但如果能看看具體修改了什麼內容,⾃然是很好的。所以,需要⽤git diff這個命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
知道了對readme.txt作了什麼修改後,再把它提交到倉庫就放⼼多了,提交修改和提交新⽂件是⼀樣的兩步,第⼀步是git add,第⼆步git commit。
三、git log(提交歷史)
當⽂件修改到⼀定程度時,就可以“保存⼀個快照”,這個快照在Git中被稱爲commit。⼀旦把⽂件改亂了,或者誤刪了⽂件,可以從最近的⼀個commit恢復,然後繼續⼯作。
git log命令顯⽰從最近到最遠的提交⽇志。
$ git log
commit 01b819281876753cd9f6a749f75f7d2463ba8750
Author: dlef
Date: Wed Sep 18 16:43:14 2019 +0800
main func
commit 3ac0aced08e366968098d16a77a3c57d9bf3a269
Author: dlef
Date: Wed Sep 18 16:21:01 2019 +0800
fff
commit 1546cafe2b07960c7962438f54b29cd4554347a7
Author: dlef
Date: Wed Sep 18 09:34:36 2019 +0800
Initial commit
⼀⼤串類似“ 3628164…882e1e0”的是commit id(版本號),和SVN不⼀樣,Git的commit id不是1,2,3……遞增的數字,⽽是⼀個SHA1計算出來的⼀個⾮常⼤的數字,⽤⼗六進製表⽰。
四、git reset(版本回退)
在Git中,⽤HEAD表⽰當前版本,也就是最新的提交,上⼀個版本就是HEAD^,上上⼀個版本就是HEAD^^,往上100 個可以寫成HEAD~100。把當前版本“append GPL”回退到上⼀個版本“add distributed”,就可以使⽤git reset命令:
$ git reset --hard HEAD^
HEAD is now at ea34578 add distributed
git log
的時候:
$ git log
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <[email protected]>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <[email protected]>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
如果工作區有修改了文件,但是還沒有提交,當回退之後,修改的文件不會保留。需要保留修改的情況下,可以使用:
git reset –-soft HEAD^
還可以使用git stash
保存,詳細使用後續說明。
如果要回去,可以:
$ git reset --hard 3628164
HEAD is now at 3628164 append GPL
版本號沒必要寫全。
五、git reflog(命令歷史)
如果找不到commit id時,git提供了⼀個命令git reflog⽤來記錄每⼀次命令:
$ git reflog
ea34578 HEAD@{0}: reset: moving to HEAD^
3628164 HEAD@{1}: commit: append GPL
ea34578 HEAD@{2}: commit: add distributed
cb926e7 HEAD@{3}: commit (initial): wrote a readme file
六、git diff HEAD
git diff
和git diff HEAD
的區別在於,前者比較暫存區和工作區的區別,後者比較工作區和版本庫的區別,git diff HEAD -- filename
主要是用於在多次提交到暫存區後比較工作區和版本庫的區別。此命令不常見。
git的版本控制,跟蹤並管理的是修改,而非文件。字符的刪除增加,就是修改!!!!!修改後,有兩種情況,提交到暫存區,提交到版本庫,如果提交到遠程庫,可以算三種。
七、刪除文件
文件的修改包括刪除整個文件,rm fileneam
命令從物理上刪除,然後git rm filename
從版本庫裏刪除,commit 後就是完成了刪除。當然,這個命令刪除的只是這個版本中的文件,並不會刪除以前的版本中的文件。
八、撤銷暫存區修改
在commit之前,想要撤銷某個文件的修改,⽤命令git reset HEAD file
可以把暫存區的修改撤銷掉(unstage),重新放回(不是扔掉)⼯作區。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
$ git reset HEAD . #撤銷全部
九、撤銷工作區修改
git checkout -- filename
可以撤銷工作區的全部修改,分兩種情況:
⼀是還沒有放到暫存區,撤銷修改就回到和版本庫⼀模⼀樣的狀態;
二是已經添加到暫存區後⼜作了修改,撤銷修改就是回到添加到暫存區後的狀態。
總之,就是讓這個⽂件回到最近⼀次git commit或git add時的狀態。
七 擴展命令
1 Git diff統計代碼更改數量
git diff HEAD~2
:獲取最近兩次提交的具體不同包括增刪的文件以及行數以及每行具體的改動;git diff --stat
:獲取文件更改的個數,增加行數,刪除行數;git diff commitID1 commitID2
:比較兩個版本的差異;git diff commit_ID1 commit_ID2 --stat
:獲取兩個版本之間修改了哪些文件;git diff commitID1 commitID2 filename
:比較兩個版本中某個文件的差異;git diff --numstat
:表格形式獲取增加行數和減少行數。
2 git add用法
git add .
會把本地所有untrack的文件都加入暫存區,並且會根據 .gitignore 做過濾,但是git add *
會忽略 .gitignore 把任何文件都加入。
3 git log參數
--pretty=oneline
參數可以減少冗餘信息。
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
-p
選項展開顯示每次提交的內容差異,用 -2
則僅顯示最近的兩次更新。
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
--stat
,僅顯示簡要的增改行數統計。
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <[email protected]>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
lib/simplegit.rb | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <[email protected]>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+), 0 deletions(-)
--abbrev-commit
僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符。
$ git log --abbrev-commit
commit 72aec5a (feat)
Author: blea
Date: Sat Sep 21 14:59:27 2019 +0800
jjjjll;