Git 是一種分佈式的版本控制系統。
Note
- 版本控制,顧名思義可以記錄歷史,並在需要時回退。
- 分佈式的概念是多了一個本地倉庫,每一個本地倉庫都存在所有的版本,過程中無需聯網提交(但是到最後還是要把代碼提交到中央倉庫)。
add#
add 的作用是把工作區
改變的代碼提交到暫存區
,以監聽文件內部的改變
git add <文件>
文件狀態由 “未跟踪
” 變成 “已暫存
”
Warning
add 添加的為文件改變而非文件本身!
快速 add#
暫存所有文件
git add .
commit#
commit 的作用是將暫存區
的代碼提交到本地倉庫
。
git commit
快速 commit#
git commit -m <提交信息>
push#
將本地提交到遠程倉庫,本質其實是將當前的分支連同它路徑上的commit
一併提交到遠程倉庫
git push <主機名> <分支名>
快速 push#
提交本地所有分支。
git push
log#
commit 完成之後你你就成功完成了一次提交,現在查看一下剛剛提交的 commit ,這裡記錄了 commit 的 SHA-1,提交的作者,提交時間
git log
查看內容變動的 log#
顯示詳細的文件內容變動。
git log -p
查看簡單的 log#
只顯示文件變化統計。
git log --stat
show#
只查看當前 commit 信息#
git show
查看某一條 commit 信息#
git show SHA-1
查看某一條 commit 信息中的文件#
git show SHA-1 <文件>
pull#
git pull
其實是 git fetch
和 git merge
的集合,
拉取目標 branch 的所有 commit 和當前的 commit 合併生成一個新的 commit。
git pull <主機名> <分支名>
pull 操作在一定程度上會幫你自動合併:
- 如果一個分支改了 A 文件,另一個分支改了 B 文件,合併之後兩個文件都會改。
- 如果一個分支改了 A 文件第一行,另一個分支改了 A 文件第二行,合併之後 A 文件第一行和第二行也都改了。
- 是如果一個分支改了 A 文件第一行,另一個分支也改了 A 文件第一行,這就出問題了,需要手動解決一下衝突。
衝突解決完畢之後需要重新 add、commit,這個時候發現 git 會自動幫我們填好了 log 信息,提交就可以。
branch#
git 和其他版本控制系統的主要區別就是 git 有branch
的概念,意思翻譯為分支,實質為 commits 的引用。
引用
相當於 commit 的快捷方式,我們看到每一個commit
都有一個 SHA-1 的加密值,這個值重複率極低,低到我們可以用前幾個值來代替,比如我們可以用7800ba
來代表上一次的 commit,後面的HEAD -> master
、github/master
也是指向這個 commit 的引用。
HEAD:當前分支的引用#
當前分支的引用指的是當前工作目錄
對應的commit
,當你有提交的時候,HEAD 也會自動指向當前的commit
。總之,當前commit
在哪裡,HEAD
就在哪裡,你永遠可以用HEAD
來操作當前commit
branch:分支#
HEAD
除了可以引用commit
,也可以引用一個branch
,在指向branch
的時候,間接的指向了對應的commit
,當前分支被提交的時候,HEAD
拉著對應的branch
一起移動。
main:默認 branch#
main 分支是項目在被 clone 下來的時候默認創建的。
Note
所有的 branch 都是平等的。
branch 的操作#
創建 branch#
git branch <分支名>
切換 branch#
git checkout <分支名>
這樣是不是有點麻煩,我們可以把兩步合在一起:
創建一個分支並立即切換過去。
git checkout -b <分支名>
刪除 branch#
git branch -d <分支名>
Note
- 刪除時要切換到其他 branch 進行刪除
- 刪除 branch 只是刪除對 commit 的引用,所在 branch 的提交並沒有刪除
- 沒有合併過 master 的分支刪除失敗(出於安全考慮),換成大寫-D
就可以了
工作流 Branching#
市面上最流行的工作流
- 假如有一個項目需要你開發功能,於是你在項目上新建了一個分支
git checkout -b zhang
- 開發完畢之後你可以推送到遠程分支上去:
git add .
git commit -m "開發完成"
git push origin zhang
- 然後你告訴同事說可以 review 一下你的代碼,同事說可以,所以你同事就:
git pull
git checkout zhang
- 同事說看了沒問題,可以合併到 master。 於是你就把 zhang 合併到 master 上去。 如果同事說有問題,你可以修改代碼重複流程
2
。
git checkout master
git pull
git merge zhang
最後推送到遠程倉庫並刪除本地 / 遠程分支:
git push
git branch -d zhang
git push origin -d zhang