Git 超簡講解,極速入門
Git
作爲版本控制的神器,協同開發的利器,是很多大廠和程序員的選擇。命令行下的Git
指令總給人一種抽象的感覺,本文從原理、操作等方面,儘量用通俗的方式形象化Git
,教你看透每一條指令背後的貓膩。
Git 與其他版本控制器
Git 與其他版本控制器的主要差別:其他版本控制器採取基於差異 (delta-based) 的版本控制,存儲的是一組基本文件和每個文件逐步迭代的差異。而Git
則在你提交更新或保存項目狀態時,會對當時的全部文件創建一個快照並保存此快照的索引,更像是一個小型文件系統。
Git 區域與狀態
下圖爲Git
四個區域及各自狀態:
git_state_and_flow
-
workspace
:即 git 倉庫所在本地工作目錄,此目錄中的文件可分爲untracked
(未被 git 跟蹤) 和tracked
(被 git 跟蹤) 兩種狀態,tracked
又可分爲:unmodified
(無修改),modified
(有修改) 兩種狀態 -
staging area
:即緩存區,此區域文件狀態爲staged
,通過git add file
將modified
文件提交至緩衝區,對應下一次git commit
的內容 (snapshot
) -
local repo
:即本地倉庫 / 數據庫,通過git commit file
將文件提交至本地倉庫,對應下一次git push
的內容 -
remote repo
:即遠端倉庫 / 數據庫,本地git
倉庫所對應的遠端服務器,通過git push file
將文件提交至遠端倉庫
Git
將一個版本的數據對應一個snapshot
,每次提交或者保存project
狀態時,Git
會根據你當前所有文件生成一個對應的snapshot
,並用一個索引指向該snapshot
.
Git
並非通過文件名將其存儲到數據庫,而是通過文件內容的hash
值(SHA-1
)進行存儲,如下爲一個 hash 值:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 初始化
獲取一個 Git 倉庫(Getting a Git Repository)
有以下兩種獲取倉庫的方式
-
通過
git init
自行創建,會在目錄下生成一個.git
目錄,這是Git
倉庫的骨骼 -
通過
git clone
拉取遠端倉庫
設置身份
$ git config --global user.name "kangzhongrun"
$ git config --global user.email kangzhongrun@qq.com
設置 IDE
設置你的默認 IDE,比如 commit 沒有加-m
註釋的話,就會使用 IDE 顯示相關信息
$ git config --global core.editor vim
設置顏色
git config --global color.ui true/false
查看設置
$ git config --list --show-origin
# 比如查看用戶名稱
$ git config user.name
Git 基本操作
以下爲git
相關操作的流程圖
git_operation
commit
注意,如果git commit
,但是還沒有git push
,則可以通過git reset
來撤回commit
,如果git reset --soft
,則只撤銷commit
(即,不會修改緩存區和工作樹),如果是git reset --hard
則將commit
的內容全部刪除 (會修改索引區和工作樹)。
# 正常提交更新
git commit
# 跳過緩存區,直接提交
git commit -a
# 修改最後一次提交msg
git commit --amend
diff
# 查看指定文件修改的diff
git diff file
# 比較工作目錄和緩衝區之間的diff
git diff
# 比較緩衝區和HEAD之間的差異
git diff --cached
# 比較工作目錄和branch之間的差異
git diff branch
# 比較兩個branch之間的差異
git diff branch1 branch2
# 比較兩次提交之間的差異
git diff commit1 commit2
log
# 查看最近提交記錄
git log
# 顯示最近num條log 並顯示每次提交所引入的差異
git log -p -num
# 顯示最近兩週的提交
git log --since=2.weeks
# 每次提交的簡略信息
git log --stat
# 單行顯示
git log --pretty=oneline
# 圖形化顯示
git log --graph
# 查看某個文件的版本歷史
git log --follow file
# 查看各個分支當前指向的對象
$ git log --oneline --decorate
stash
# 將工作目錄(tracked文件)的修改存儲起來,後續可修復繼續工作
git stash
# 查看保存的工作目錄
git stash list
# 恢復工作現場
git stash apply
# 刪除stash內容
git stash drop
# 恢復同時直接刪除stash內存
git stash pop
blame
# 顯示帶有作者姓名的文件的更改歷史記錄
git blame 'filename'
# 顯示帶有作者姓名和commit ID的文件的更改歷史記錄
git blame 'filename' -l
revert
# 撤銷前一次操作
git revert HEAD
# 撤銷前前次操作
git revert HEAD~
# 撤銷指定commit
git revert commit
文件恢復
# 從staged中恢復文件file到工作目錄
git checkout -- file
# 從local repo中恢復文件到staged
git reset -- file
# 從repo中恢復file到staged和工作目錄
git checkout -- HEAD file
git reset --hard --- file
Git 分支
Git
的分支功能是一個很強大很實用的功能,尤其在團隊合作開發中,當你要做一個新的系統時,可能沒法段時間內完成,就可以另開一個單獨的分支,然後在這個分支上進行開發,不會影響到主線開發,和其他人的工作。
Git
中分支非常輕量,即一個記錄了分支所指commit id
的文件。下圖中有兩個分支:master
和test
,HEAD
爲一個特殊指針,永遠指向你當前所在分支,如下當前所在分支爲test
。
git_branch_1
分支相關指令
主要是branch
, checkout
和switch
三個指令
branch
# 查看當前所有分支
git branch
# 查看哪些分支已經合併到當前分支(查看沒有合併用--unmerged)
git branch --merged
# 新建分支test
git branch test
# 刪除分支test
git branch -d test
checkout
checkout
會用倉庫中的文件,覆蓋索引區staged
和工作目錄。
# 切換至分支test
git checkout test
# 創建分支test,然後切換至該分支
git checkout -b test
# 切換至某一個commit
git checkout commitId
switch
git 2.23
版本新增,以下只列出兩個用法。
# 切換分支
git switch test
# 創建新分支,並切換至該分支
git switch -c test
分支合併
Git
提供了三種分支合併的方式:merge
,rebase
,cherry-pick
merge
待合併分支在當前分支下游,沒有分叉,會快速合併,如下:
git_branch_2
合併方式爲,先切換至master
分支,在使用merge
即可
git checkout master
git merge test
rebase
rebase
採取的策略是將合入分支上超前的節點在待合入分支上重新提交一遍,採用這樣方式,就不會出現分叉了,整體呈線性,較爲直觀。如下:
git_branch_3
rebase
之後再回到master
分支上進行一次快進合併
git checkout master
git merge test
cherry-pick
你可以選擇某些節點進行合併,其合入的不是分支而是提交節點。靈活性非常大。
Git 實用工具
由於在命令行下進行操作,各種GUI
工具就不做介紹,這裏主要介紹一下tig
,讓git
命令行更加便捷和人性化。
具體使用參考文末 tig 教程。
總結
本文主要介紹了git
的區域和狀態,git
初始化,git
基本操作,git
分支,最後介紹了一個git
實用工具tig
。一個簡單的入門教程,介紹了一些常見的指令。其他低頻指令就不做介紹,在使用過程中去摸索吧!
參考
git book
https://git-scm.com/book/en/v2
tig 教程
https://www.jianshu.com/p/d9f60c0abbf7
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/IWpn-gnBxxK4ebtQb-nofg