Git是前端常用工具,但對于還在自學(xué)中的前端,用的真是不多,導(dǎo)致用的時候忘記命令然后重學(xué)一遍。鑒于git原理與入門遍地都是,這里我總結(jié)一下常用命令和遇到過的問題,做個備忘參考。
此文章極其適合學(xué)過git但是經(jīng)常忘記的小伙伴們作為備忘和復(fù)習(xí)!
用到新的命令或者遇到新的問題時我會更新。若有疏漏,敬請指正。
Part.A 常用命令
一、 基礎(chǔ)命令

# 初始化
git init
# 克隆倉庫(當(dāng)然第一次克隆要先生成添加ssh key),只獲取master分支
git clone git@github.com:username/repo.git <文件夾名(可省略)>
# 克隆倉庫并重命名為myrepo
git clone git@github.com:username/repo.git myrepo
# 查看狀態(tài)
git status
# 簡短查看狀態(tài),-s 指簡潔查看,-b 顯示branch
git status -sb
# 添加到暫存區(qū)(stage和index都是指暫存區(qū))
git add .
# 添加到commited,-m 指message
git commit -m "內(nèi)容"
# 查看commit歷史,每次commit會產(chǎn)生一個commit id
git log
# 推送當(dāng)前改動到遠程庫(origin)的master分支
git push origin master
二、進階命令
地址標(biāo)簽命令
# 查看本地庫里記錄的遠程庫地址
git remote -v
# 這里把遠程庫的地址加個標(biāo)簽,叫origin
# origin其實就是這個遠程庫的標(biāo)簽(別名)
# 常用于github新建空白倉庫后,把本地倉庫傳上去
git remote add origin git@github.com:username/repo.git
# 再添加一個叫 gitlab 的遠程庫
git remote add gitlab git@gitlab.com:username/repo.git
# 推送到 gitlab 標(biāo)簽的地址上
git push gitlab master
# 刪除 gitlab 標(biāo)簽
git remote remove gitlab
# 修改 origin 標(biāo)簽對應(yīng)的地址
git remote set-url origin git@github.com:username/repo2.git
# 把 gitlab 標(biāo)簽改名為coding
git remote rename gitlab coding
分支命令
# 創(chuàng)建本地庫hotfix分支
git branch hotfix
# 切換到hotfix分支,進行修改
git checkout hotfix
# 切換到master分支,繼續(xù)master分支的開發(fā)
git checkout master
# 推送到origin地址的hotfix分支上
git push origin hotfix
# 把hotfix分支的內(nèi)容合并到當(dāng)前分支(master)
git merge hotfix
# 刪除分支 -d 刪除分支,-D 強制刪除
git branch -d <branch>

上圖中從左往右開發(fā),HEAD指的是當(dāng)前分支。圖中在master分支的第三次提交(f30ab)上創(chuàng)建了一個hotfix分支,進行了修改。而master繼續(xù)開發(fā)。之后將hotfix分支merge到master,產(chǎn)生了fe532。
三、常用的其他命令和衍生用法(待補充)
# 相當(dāng)于 git add -u 加上 git commit -m "內(nèi)容"
# 有些文章寫的 "相當(dāng)于git add . 加上 git commit -m" 是錯的?。?!
# 只能更新和刪除,不能添加新文件??!
git commit -am "內(nèi)容"
# 基本等同于 git fetch 加上 git merge,獲取后合并到指定的本地分支
# 與git fetch 的區(qū)別詳見Q&A
git pull <remote> <遠程branch>:<本地branch>
# 一般遠程分支和本地分支同名,后面不用寫
git pull <remote> <遠程branch>
# 如果只有一個<remote>只有一個<branch>,后面不寫也行
git pull
# 相當(dāng)于git branch xxx 加上 git checkout xxx
git checkout -b xxx
# 只克隆最近一次提交,也可以指定次數(shù)
git clone git@github.com:username/repo.git --depth=1
Part.B Q&A
Q1. git add -A 、 git add . 、 git add -u 區(qū)別
網(wǎng)上有些文章還是git老版本,和新版本有區(qū)別。
Git Version 1.x

Git Version 2.x

git add -A 等同于 git add --all
git add -u 等同于 git add --update
git add -a是錯誤寫法,會報錯
Q2. git add * 與 git add .區(qū)別?
關(guān)于這個問題基本搜不到相關(guān)文章,后來在stackoverflow上找到了一些解答,試著總結(jié)一下。以下情況我在git 2.18.0.windows.1中測試確認(rèn)過。
-
*是shell提供的通配符,git add *.html會匹配所有html文件,這是當(dāng)通配符的用法 -
git add *一般不匹配以.開頭的文件(例如.gitignore),而git add .會匹配所有 - 當(dāng)文件夾中有且只有以
.開頭的文件時,git add *會匹配以.開頭這樣的文件 - .gitignore中有非
.開頭的文件時,用git add *會有提示"The following paths are ignored by one of your .gitignore files:",而git add .不會有這樣提示,但是兩者的效果是一樣的(除了git add *不會匹配.開頭的文件)
總之,知道前兩點就可以了。
Q3. warning: LF will be replaced by CRLF 問題?
關(guān)于git提示“warning: LF will be replaced by CRLF”終極解答
Dos和Windows平臺: 使用回車(CR)和換行(LF)兩個字符來結(jié)束一行,回車+換行(CR+LF),即“\r\n”;
Mac 和 Linux平臺:只使用換行(LF)一個字符來結(jié)束一行,即“\n”;
所以有個轉(zhuǎn)換的問題,git安裝的時候就有相關(guān)選項,安裝完也可以輸入命令設(shè)置。
知道有這個事兒就行了,出問題再說吧。
Q4. git fetch 和 git pull的區(qū)別和使用?
git fetch
# 這個命令將某個遠程主機的更新全部取回本地
# 如果沒寫<remote>則獲取所有<remote>的更新
git fetch <remote>
# 如果只想取回特定分支的更新,可以指定分支名
git fetch <remote> <branch>
# 查看FETCH_HEAD,里面有遠程倉庫的更改記錄
# 而git log中只有當(dāng)前本地的!
git log -p FETCH_HEAD
git fetch 獲取更新的方法:
# 在本地新建一個temp分支,并將遠程倉庫的代碼下載到temp分支中
git fetch origin master:temp
# 比較本地代碼與temp分支中代碼的區(qū)別
# 下列幾條命令都可以查看區(qū)別,但略有不同,按需使用
git diff temp
git diff master..temp
git diff master ^temp
git log -p master..temp
# 合并temp分支到當(dāng)前本地分支
git merge temp
# 刪除合并完沒用的temp分支
git branch -d temp
而git pull可以認(rèn)為是git fetch和git merge兩個步驟的結(jié)合。
如果本地沒有做過改動,則可以直接git pull更新到遠程倉庫的最新代碼,更方便!
如果本地有過改動,使用git pull命令后會有沖突,不過沒關(guān)系,根據(jù)bash的提示進行操作即可。
Q5. git reset(--soft --hard) 和 git revert 的區(qū)別?
首先要知道git有三個區(qū)工作區(qū)(working directroy)、暫存區(qū)(index)、版本庫(commit history),這屬于git基本原理,不作贅述。
git reset
等同于git reset --mixed, --mixed 是 reset 的默認(rèn)參數(shù)。
作用是重置暫存區(qū),即取消之前的add,工作區(qū)的修改仍然保留。
git reset --soft xxx
作用是回到某次commit,但是暫存區(qū)和工作區(qū)做過的修改仍然保留。
# 回到上次commit之前,HEAD~1 指的是HEAD指針往前一格
# 比如你commit注釋寫錯了或者commit錯了,回到上次就用這個
git reset --soft HEAD~1
# 根據(jù)commit id,回到某次commit之后
git reset --hard 03dd660
git reset --hard xxx
作用是回到某次commit,并且重置暫存區(qū)和工作區(qū)。
例如發(fā)現(xiàn)修改了不該改的分支,可以在老板發(fā)現(xiàn)前讀檔。做過的修改就當(dāng)做沒有發(fā)生,git log中也不會顯示,但是git reflog 命令還是能看到,并且還能再reset回去。
# 回到上上次commit之前,HEAD~1 指的是HEAD指針往前兩格
git reset --hard HEAD~2
# 根據(jù)commit id,回到某次commit之后
git reset --hard 03dd660
git revert
作用是復(fù)制以前的commit作為最新的commit,不會重置工作區(qū),暫存區(qū)有改動時無法revert
# 回到上次commit之前(即上上次之后),并作為新的內(nèi)容commit
git revert HEAD
# 回到上上次commit之前,注意這邊計數(shù)也和reset不同
git revert HEAD~1
區(qū)別在于,reset會把恢復(fù)點后面的commit刪掉,當(dāng)前分支上的commit減少;
而revert會復(fù)制指定的某次commit到當(dāng)前分支,分支上的commit數(shù)變多!
以上!