Git是前端常用工具,但對(duì)于還在自學(xué)中的前端击胜,用的真是不多,導(dǎo)致用的時(shí)候忘記命令然后重學(xué)一遍役纹。鑒于git原理與入門遍地都是偶摔,這里我總結(jié)一下常用命令和遇到過的問題,做個(gè)備忘參考促脉。
此文章極其適合學(xué)過git但是經(jīng)常忘記的小伙伴們作為備忘和復(fù)習(xí)辰斋!
用到新的命令或者遇到新的問題時(shí)我會(huì)更新。若有疏漏瘸味,敬請(qǐng)指正宫仗。
Part.A 常用命令
一、 基礎(chǔ)命令
# 初始化
git init
# 克隆倉(cāng)庫(kù)(當(dāng)然第一次克隆要先生成添加ssh key)硫戈,只獲取master分支
git clone git@github.com:username/repo.git <文件夾名(可省略)>
# 克隆倉(cāng)庫(kù)并重命名為myrepo
git clone git@github.com:username/repo.git myrepo
# 查看狀態(tài)
git status
# 簡(jiǎn)短查看狀態(tài)锰什,-s 指簡(jiǎn)潔查看,-b 顯示branch
git status -sb
# 添加到暫存區(qū)(stage和index都是指暫存區(qū))
git add .
# 添加到commited丁逝,-m 指message
git commit -m "內(nèi)容"
# 查看commit歷史,每次commit會(huì)產(chǎn)生一個(gè)commit id
git log
# 推送當(dāng)前改動(dòng)到遠(yuǎn)程庫(kù)(origin)的master分支
git push origin master
二梭姓、進(jìn)階命令
地址標(biāo)簽命令
# 查看本地庫(kù)里記錄的遠(yuǎn)程庫(kù)地址
git remote -v
# 這里把遠(yuǎn)程庫(kù)的地址加個(gè)標(biāo)簽霜幼,叫origin
# origin其實(shí)就是這個(gè)遠(yuǎn)程庫(kù)的標(biāo)簽(別名)
# 常用于github新建空白倉(cāng)庫(kù)后,把本地倉(cāng)庫(kù)傳上去
git remote add origin git@github.com:username/repo.git
# 再添加一個(gè)叫 gitlab 的遠(yuǎn)程庫(kù)
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)簽對(duì)應(yīng)的地址
git remote set-url origin git@github.com:username/repo2.git
# 把 gitlab 標(biāo)簽改名為coding
git remote rename gitlab coding
分支命令
# 創(chuàng)建本地庫(kù)hotfix分支
git branch hotfix
# 切換到hotfix分支誉尖,進(jìn)行修改
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 強(qiáng)制刪除
git branch -d <branch>
上圖中從左往右開發(fā)铡恕,HEAD指的是當(dāng)前分支琢感。圖中在master分支的第三次提交(f30ab)上創(chuàng)建了一個(gè)hotfix分支,進(jìn)行了修改探熔。而master繼續(xù)開發(fā)驹针。之后將hotfix分支merge到master,產(chǎn)生了fe532诀艰。
三柬甥、常用的其他命令和衍生用法(待補(bǔ)充)
# 相當(dāng)于 git add -u 加上 git commit -m "內(nèi)容"
# 有些文章寫的 "相當(dāng)于git add . 加上 git commit -m" 是錯(cuò)的!F渎ⅰ苛蒲!
# 只能更新和刪除,不能添加新文件B搪臂外!
git commit -am "內(nèi)容"
# 基本等同于 git fetch 加上 git merge,獲取后合并到指定的本地分支
# 與git fetch 的區(qū)別詳見Q&A
git pull <remote> <遠(yuǎn)程branch>:<本地branch>
# 一般遠(yuǎn)程分支和本地分支同名,后面不用寫
git pull <remote> <遠(yuǎn)程branch>
# 如果只有一個(gè)<remote>只有一個(gè)<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
是錯(cuò)誤寫法克懊,會(huì)報(bào)錯(cuò)
Q2. git add *
與 git add .
區(qū)別忱辅?
關(guān)于這個(gè)問題基本搜不到相關(guān)文章,后來在stackoverflow上找到了一些解答谭溉,試著總結(jié)一下墙懂。以下情況我在git 2.18.0.windows.1中測(cè)試確認(rèn)過。
-
*
是shell提供的通配符扮念,git add *.html
會(huì)匹配所有html文件损搬,這是當(dāng)通配符的用法 -
git add *
一般不匹配以.
開頭的文件(例如.gitignore),而git add .
會(huì)匹配所有 - 當(dāng)文件夾中有且只有以
.
開頭的文件時(shí)柜与,git add *
會(huì)匹配以.
開頭這樣的文件 - .gitignore中有非
.
開頭的文件時(shí)巧勤,用git add *
會(huì)有提示"The following paths are ignored by one of your .gitignore files:",而git add .
不會(huì)有這樣提示弄匕,但是兩者的效果是一樣的(除了git add *
不會(huì)匹配.
開頭的文件)
總之颅悉,知道前兩點(diǎn)就可以了。
Q3. warning: LF will be replaced by CRLF 問題迁匠?
關(guān)于git提示“warning: LF will be replaced by CRLF”終極解答
Dos和Windows平臺(tái): 使用回車(CR)和換行(LF)兩個(gè)字符來結(jié)束一行剩瓶,回車+換行(CR+LF),即“\r\n”城丧;
Mac 和 Linux平臺(tái):只使用換行(LF)一個(gè)字符來結(jié)束一行延曙,即“\n”;
所以有個(gè)轉(zhuǎn)換的問題亡哄,git安裝的時(shí)候就有相關(guān)選項(xiàng)枝缔,安裝完也可以輸入命令設(shè)置。
知道有這個(gè)事兒就行了磺平,出問題再說吧魂仍。
Q4. git fetch
和 git pull
的區(qū)別和使用?
git fetch
# 這個(gè)命令將某個(gè)遠(yuǎn)程主機(jī)的更新全部取回本地
# 如果沒寫<remote>則獲取所有<remote>的更新
git fetch <remote>
# 如果只想取回特定分支的更新拣挪,可以指定分支名
git fetch <remote> <branch>
# 查看FETCH_HEAD擦酌,里面有遠(yuǎn)程倉(cāng)庫(kù)的更改記錄
# 而git log中只有當(dāng)前本地的!
git log -p FETCH_HEAD
git fetch
獲取更新的方法:
# 在本地新建一個(gè)temp分支菠劝,并將遠(yuǎn)程倉(cāng)庫(kù)的代碼下載到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
兩個(gè)步驟的結(jié)合。
如果本地沒有做過改動(dòng)笼平,則可以直接git pull
更新到遠(yuǎn)程倉(cāng)庫(kù)的最新代碼园骆,更方便!
如果本地有過改動(dòng)寓调,使用git pull
命令后會(huì)有沖突锌唾,不過沒關(guān)系,根據(jù)bash的提示進(jìn)行操作即可夺英。
Q5. git reset(--soft --hard)
和 git revert
的區(qū)別?
首先要知道git有三個(gè)區(qū)工作區(qū)(working directroy)晌涕、暫存區(qū)(index)、版本庫(kù)(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注釋寫錯(cuò)了或者commit錯(cuò)了帘靡,回到上次就用這個(gè)
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
中也不會(huì)顯示筒扒,但是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,不會(huì)重置工作區(qū)冰蘑,暫存區(qū)有改動(dòng)時(shí)無法revert
# 回到上次commit之前(即上上次之后)和泌,并作為新的內(nèi)容commit
git revert HEAD
# 回到上上次commit之前,注意這邊計(jì)數(shù)也和reset不同
git revert HEAD~1
區(qū)別在于祠肥,reset會(huì)把恢復(fù)點(diǎn)后面的commit刪掉武氓,當(dāng)前分支上的commit減少;
而revert會(huì)復(fù)制指定的某次commit到當(dāng)前分支,分支上的commit數(shù)變多县恕!
以上东羹!