一、Git原理
1. Git采用的是全量存儲方案
所謂全量方案,就是每個版本都保存所有的數據(多是代碼,文件占據空間較小)。優點:快速;缺點:浪費空間。
與此相對的是增量方案:保存的是上一個版本 + 補丁。優點:節省空間;缺點:要進行運算,費時。
2. 文件變動信息的存儲
git把每次文件的改動都存在項目根目錄下的.git文件夾中。
3. .git文件夾中的文件
-
利用哈希算法SHA-1計算得到文件的哈希值,依據此哈希值來判斷文件內容是否有改變。
注:由於哈希值是唯一的(幾乎不會重復),所以可以保證同一個文件只存儲一份。
-
使用
tree
結構來存儲文件是葉節點,文件夾是非葉節點
4. 暫存區(index文件)
5. 快照鏈表
HEAD
指針指向最新的快照。
想恢復某個版本,就把指針指向那個版本,然后使用 checkout
命令;或者直接 checkout
那個版本的哈希值。
6. 協同和分支
項目需要多人分別開發時(假設兩人開發),可以在 master
主分支進行 checkout
操作,分出兩個分支,每個人在自己的分支進行開發工作,開發完成后進行合並操作。有兩種合並方式:
-
merge
:合並時,兩個分支和這兩個分支的公共祖先進行三方合並。 -
rebase
:將A分支保存到一個臨時目錄下,然后撤銷此分支上所有commit,再將B分支的commit接到這條分支上(此時兩個分支基本一致),最后再將臨時目錄下保存的內容接到這條分支后。若此時刪掉B分支,則此時就只有一條包含所有功能的分支注:rebase會修改提交記錄
二、Git命令
1. 本地庫初始化
在項目的根目錄進行操作
git init
# 注意:生成的 .git 目錄中存放的是本地庫相關文件,不要刪除
2. 設置簽名
簽名的作用是區分不同操者身份。用戶信息在每一個版本提交中能夠看到,以此確認本次提交是誰做的。
-
項目(倉庫)級別
僅在當前本地庫有效
git config user.name tom # 設置用戶名tom git config user.email du@qq.com # 設置用戶郵箱
-
系統用戶級別
僅在當前登錄的操作系統用戶有效
git config --global user.name tom git config --global user.email du@qq.com
僅僅加了一個
--global
優先級別:
項目級別
>系統級別
信息保存位置:
~/.gitconfig 文件
,即C盤下的用戶目錄
3. 添加文件(到暫存區)
git add fileName # 指定文件
git add . # 所有
# 將工作區的文件添加到暫存區
4. 查看狀態
git status
# 查看工作區、暫存區狀態
5. 提交(到本地庫)
git commit -m 'commit message'
# 將暫存區內容提交到本地庫
6. 創建分支
git branch dev_dxx
# 創建名稱為dev_dxx的分支
7. 切換分支
git checkout dev_dxx
# 切換到dev_dxx分支
8. 查看分支
git branch -v
9. 合並分支
git branch dev_aaa
git checkout dev_aaa # 新建一個分支並切換過來
# ... 對文件進行更改
# 合並分支的時候要明確誰誰合並
git checkout master # 回到master分支進行merge
git merge dev_dxx # 先合並dev_dxx,不會有沖突,因為此分支相當於是對master進行后續操作
git merge dev_aaa # 再合並dev_aaa,若修改過同一個文件,則此時會有沖突conflict
10. 解決merge沖突
-
放棄合並
git merge --abort
-
手動合並沖突
-
打開有沖突的文件,文件內有沖突的部分會以下述形式分隔開來
<<<<<<<<<<<<<< 當前分支的代碼 ============== 合並過來的代碼 >>>>>>>>>>>>>>
-
重新添加並提交
git add fileName git commit -m 'merged'
-
11. 查看日志
git log # 查看所有的版本記錄
git reflog # 可以查看所有分支的所有操作記錄(包括已經被刪除的 commit 記錄和 reset 的操作)
三、Git結合Github
1. 創建遠程倉庫
在 Github 上新建遠程倉庫
2. 添加遠程版本庫
git remote add 別名 遠程地址
# 例子:git remote add origin https://github.com/Du-xx/gitTest.git
3. 查看遠程地址別名
git remote -v
4. 推送 push
git push 別名 分支名
git push -u 別名 分支名 # -u指定默認主機
# 例子:git push origin master
5. 克隆 clone
將遠程倉庫的項目克隆到本地,clone進行一次從無到有的過程,更新用 pull
git clone 遠程地址
# 例子:git clone https://github.com/Du-xx/gitTest.git
6. 拉取 pull
本地已經存在 clone 下來的文件,用 pull 進行更新
# pull = fetch + merge
git fetch 別名 分支名
git merge 別名 分支名
# 等價於
git pull 別名 分支名
# 例子:git pull origin master
7. 刪除git與github的聯系
git remote remove origin # origin是本倉庫在github上的別名
8. fork
用於團隊外協作,其他人員使用 fork 將代碼拉到自己的遠程倉庫中,可以直接進行更改,也可以 pull 到本地更改后 push 到遠程倉庫,之后進行 pull request,等待原有團隊審核后 merge 即可