Git 入門指南-基礎
本章要點
-[ ] Git中關於文件的幾個相關概念
-
[ ] 文件的四種狀態
- [ ] 已提交
- [ ] 已修改
- [ ] 已暫存
- [ ] 未跟蹤
-
[ ] 文件的三個區域
- [ ] 工作目錄
- [ ] 暫存區
- [ ] 本地倉庫
- [ ] 安裝Git
- [ ] 配置Git
- [ ] 使用Git
- [ ] Git使用的幾個基礎場景
- [ ] Git的協作分支實踐
文件相關概念
文件的四種狀態
對於任何一個文件,在 Git 內都只有三種狀態:已提交(committed),已修改(modified)和已暫存(staged)。還有一種不在Git中的狀態,未跟蹤(untracked)。
- 已修改
已修改表示修改了某個文件,但還沒有提交保存;
- 已暫存
已暫存表示把已修改的文件放在下次提交時要保存的清單中
- 已提交
已提交表示該文件已經被安全地保存在本地數據庫中了
- 未跟蹤
文件在Git工作區中,但是未被添加到Git版本中。
文件流轉的三個工作區域
工作目錄
git版本控制的項目中除了本地倉庫目錄以外的,你能操作的其他目錄。
暫存區域
暫存區是Git倉庫中的一個概念位置
本地倉庫
每個項目都有一個 Git 目錄;如果 git clone
出來的話,就是其中 .git
的目錄;如果 git clone --bare
的話,新建的目錄本身就是 Git 目錄。
遠程倉庫
一個遠程倉庫通常只是一個裸倉庫(bare repository)— 即一個沒有當前工作目錄的倉庫。 因爲該倉庫僅僅作爲合作媒介,不需要從磁碟檢查快照;存放的只有 Git 的資料。 簡單的說,裸倉庫就是你工程目錄內的 .git
子目錄內容,不包含其他資料,遠程倉庫是一個獨立的倉庫。
一個本地git項目中的三個區域關係可用下圖來表示。
安裝
https://git-scm.com/downloads)
配置GIT
GIT的配置信息存放於三個位置
-
`/etc/gitconfig
文件:系統中對所有用戶都普遍適用的配置。若使用git config
時用--system
選項,讀寫的就是這個文件。 -
~/.gitconfig
文件:用戶目錄下的配置文件只適用於該用戶。若使用git config
時用--global
選項,讀寫的就是這個文件。 - 當前項目的 Git 目錄中的配置文件(也就是工作目錄中的
.git/config
文件):這裏的配置僅僅針對當前項目有效。每一個級別的配置都會覆蓋上層的相同配置,所以.git/config
裏的配置會覆蓋/etc/gitconfig
中的同名變量。
在 Windows 系統上,Git 會找尋用戶主目錄下的 .gitconfig
文件。主目錄即 $HOME
變量指定的目錄,一般都是 C:\Documents and Settings\$USER
。此外,Git 還會嘗試找尋 /etc/gitconfig
文件,只不過看當初 Git 裝在什麼目錄,就以此作爲根目錄來定位。
git config
使用git config命令來配置或查看一些配置,包括全局配置和項目配置。
常用命令
全局配置用戶信息
git congit --global user.name “username”
git config --global user.email “[email protected]”
git help
顯示git的幫助信息;學會使用這個命令,基本上git就會了一半,全掌握的話還需要理解git的所有術語概念。
git命令都可以使用git help [COMMAND]的方式顯示對應 COMMAND的用法信息
常用命令
git help help
顯示git幫助信息主頁
git help branch
顯示init命令的幫助信息
使用GIT
以下通過常用的git命令來簡單的說明下這些命令。
【添加用的】
git init
git init
創建新的版本庫或者重新初始化倉庫
運行過上述命令後share目錄中的.git已經不再是一個目錄而是下面這樣一個文件了
git add
git add 添加內容到暫存區
常用命令
git add [<pathspec>]
git add -n [<pathspec>]
查看add的內容,不會將文件添加進暫存區
擴展閱讀
一些簡單的匹配
Glob | 含義 |
---|---|
. |
當前目錄 |
./src/*.js |
當前目錄中的src子目錄下的js擴展名文件 |
./src/**/*.js |
當前目錄中的src子目錄下的,以及嵌套目錄中的js擴展名文件 |
!src |
不匹配src文件也不匹配src目錄 |
<pathspec> 支持Glob匹配。
匹配模式有下面幾種:
Glob(匹配模式)) 、正則表達式、Wildcard character(通配符)
通用的三個匹配符, *、?、[...]
通配符 | 描述 | 模式舉例 | 匹配項 | 不匹配項 |
---|---|---|---|---|
* |
匹配任意數量的字符 | Law* |
Law , Laws or Lawyer
|
GrokLaw , La or aw
|
*Law* |
Law , GrokLaw or Lawyer . |
La or aw
|
||
? |
匹配任意單個字符 | ?at |
Cat , cat , Bat or bat
|
at |
[abc] |
匹配集合中的一個字符 | [CB]at |
Cat or Bat
|
cat or bat
|
[a-z] |
匹配區間內的一個字符 | a[0-9] |
a0 , a1 ... a9
|
ab , a or a10
|
git commit
給倉庫中寫入改變,或者說進行一次提交,給倉庫中寫入一條歷史記錄(歷史中記錄了改變的內容)。
常用命令
git commit -m “message”
注意:commit命令默認需要添加提交日誌,如果沒有該命令使用-m
參數, 會進入我們通過core.editor指定的編輯器中, 默認vim編輯器,這個編輯器可能大家不太熟悉,所以進入這個界面可能會有點不知所措,請參考下面文檔,想使用Git?你不得不瞭解的vim編輯器
git clone
克隆一個版本庫到一個新的目錄。
常用命令
git clone <repository> [path-to-dir]
克隆倉庫到指定位置
git clone -b <branchname> <repository>
克隆倉庫指定分支
git clone --recurse <repository>
克隆倉庫及關聯子項
注意: 這個倉庫可以是本地的一個項目
擴展閱讀
<repository> 支持[GIT URLS](),有以下幾種格式
遠程
- ssh://[user@]host.xz[:port]/path/to/repo.git/
- git://host.xz[:port]/path/to/repo.git/
- http[s]://host.xz[:port]/path/to/repo.git/
- ftp[s]://host.xz[:port]/path/to/repo.git/
本地
- /path/to/repo.git/
- file:///path/to/repo.git/
【反悔用的】
git reset
重置當前HEAD到指定狀態
常用命令
git reset --hard HEAD
重置當前工作目錄中未提交已暫存和已修改文件的內容
注意上述命令不會處理 untracked
狀態的文件
擴展閱讀
HEAD
- HEAD 指向一個提交歷史, 指向離當前index最近的一次提交,通過很多命令可以改變HEAD的指向。
比如:
git checkout exist-branch-name
切換分支,HEAD就會指向切換後分支的最後一次提交
git reset --hard <commit-hash>
重置當前工作目錄到commit-hash的狀態,HEAD就會指向該提交
git rm
刪除存在於倉庫中的文件或者刪除存在於暫存區和工作目錄中的文件
要刪除僅僅在工作目錄中的文件需要使用 rm
命令
常用命令
git rm file
刪除已經暫存的工作目錄和暫存區中的文件
git rm --cached file
刪除暫存區文件
git mv
移動或重命名一個文件,一個目錄,或一個符號鏈接。
【查閱用的】
git status
git status 查看版本庫狀態
常用命令
git status
查看當前狀態
git status -s -b
簡短輸出日誌信息
image-20181010161819094.png
git diff
顯示提交和提交之間的改動,提交和工作目錄的改動等
常用命令
比較工作區與暫存區
git diff
不加參數即默認比較工作區與暫存區
比較暫存區與最新本地版本庫(本地庫中最近一次commit的內容
git diff --cached [<path>...]
比較工作區與最新本地版本庫
git diff HEAD [<path>...]
如果HEAD指向的是master分支,那麼HEAD還可以換成master
比較工作區與指定commit-id的差異
git diff commit-id [<path>...]
比較暫存區與指定commit-id的差異
git diff --cached [<commit-id>][...]
比較兩個commit-id之間的差異
git diff [<commit-id>][<commit-id>]
使用git diff打補丁
git diff > patch
注意:patch的命名是隨意的,不加其他參數時作用是當我們希望將我們本倉庫工作區的修改輸出到patch文件中,適合修改的文件比較多,我們可以在一個單獨的文件中查看修改的內容
git log
顯示提交的日誌
擴展閱讀
git config --global alias.lg "log --graph --all --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(white)- %an, %ar%Creset'"
git lg
美化版輸出
git branch
列出,創建和刪除分支
常用命令
git branch <branchname>
創建一個新的分支
git branch --list
git branch
列出本地分支
git branch -a
列出全部分支包括遠程分支
git branch -d <branchname>
刪除分支
git checkout
切換分支或者恢復工作目錄文件
操作文件常用命令
git checkout filename
放棄單個文件的修改
git checkout .
放棄當前目錄下的修改
操作分支常用命令
git checkout master
將分支切換到master
git checkout -b master
如果分支存在則只切換分支,若不存在則創建並切換到master分支
git merge
合併一個或者多個分支到你已經檢出的分支中。 然後它將當前分支指針移動到合併結果上.
git merge <not-current-branch>
將非當前分支獨有的內容合併到當前分支並生成一個新的合併提交,並HEAD指向當前分支的這個合併提交位置。
git push
將本地分支的更新,推送到遠程主機
git push origin dev
將dev分支推送到origin主機的dev分支
git push -u origin dev
同上,附加主機分支跟蹤功能,下次推送,可以使用git push
命令默認會推送到origin主機的dev分支
git push origin :dev
git push origin --delete dev 刪除遠程dev分支
git pull
從另一倉庫拉去代碼併合併到本地分支中
常用命令
git pull <遠程主機名> <遠程分支名>:<本地分支名>
從遠程主機的遠程分支拉去代碼併合併到本地分支中
如果之前設置過跟蹤分支,可以直接使用 git pull
Git 使用的幾個場景
場景需要代碼演練,請參考
-
[ ] 添加提交
- [ ] 獲取一個倉庫
- [ ] 新建一個文件或者修改倉庫的內容
- [ ] 添加文件進index
- [ ] commit文件到倉庫
-
[ ] 撤銷
- [ ] 從暫存區撤銷
- [ ] 從版本庫回退
-
[ ] 代碼合併,
- [ ] 合併不同分支代碼
- [ ] 同分支本地提交和遠程代碼合併
- [ ] 解決衝突
Git協作分支實踐
在實際開發中,我們應該按照幾個基本原則進行分支管理:
-
master
穩定性應該最高,用來發布新版,不在master分支開發; -
dev
穩定次於master
,用來合併功能,也不建議在該分支開發; -
個人分支
協作者自己個人分支,所有自己寫的功能都在這個分支,經常需要和dev分支同步代碼。
所以,團隊合作的分支看起來應該就像下圖這樣: