Git 超簡講解,極速入門

Git作爲版本控制的神器,協同開發的利器,是很多大廠和程序員的選擇。命令行下的Git指令總給人一種抽象的感覺,本文從原理、操作等方面,儘量用通俗的方式形象化Git,教你看透每一條指令背後的貓膩。

Git 與其他版本控制器

Git 與其他版本控制器的主要差別:其他版本控制器採取基於差異 (delta-based) 的版本控制,存儲的是一組基本文件和每個文件逐步迭代的差異。而Git則在你提交更新或保存項目狀態時,會對當時的全部文件創建一個快照並保存此快照的索引,更像是一個小型文件系統。

Git 區域與狀態

下圖爲Git四個區域及各自狀態:

git_state_and_flow

Git將一個版本的數據對應一個snapshot,每次提交或者保存project狀態時,Git會根據你當前所有文件生成一個對應的snapshot,並用一個索引指向該snapshot.

Git並非通過文件名將其存儲到數據庫,而是通過文件內容的hash值(SHA-1)進行存儲,如下爲一個 hash 值:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 初始化

獲取一個 Git 倉庫(Getting a Git Repository)

有以下兩種獲取倉庫的方式

  1. 通過git init自行創建,會在目錄下生成一個.git目錄,這是Git倉庫的骨骼

  2. 通過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的文件。下圖中有兩個分支:mastertestHEAD爲一個特殊指針,永遠指向你當前所在分支,如下當前所在分支爲test

git_branch_1

分支相關指令

主要是branchcheckoutswitch三個指令

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提供了三種分支合併的方式:mergerebasecherry-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