做研發(fā)的朋友不可能不知道Git,Git在研發(fā)界里可謂是婦孺皆知。平時(shí)看到大佬都在流暢的敲命令行而你還在默默地使用可視化工具,是不是瞬間感覺自己弱爆了。今天來列出一些使用頻率較高的Git命令,掌握它其實(shí)你也可以擁有敲命令行的快感......
init &?clone
1、git?init?project_name
#初始化本地git倉庫,會在project_name下生成.git文件夾
2、git?clone?url(ssh/https)?project_name
#從遠(yuǎn)程克隆已有的項(xiàng)目到本地project_name目錄
3、git?add?.
#將當(dāng)前目錄下的所有新增加的和修改的文件,不包括已刪除的文件添加到暫存區(qū)
4、git?add?file_name
#將文件file_name添加至?xí)捍鎱^(qū),?文件名以空格分開可添加多個(gè)文件
5、git?add?-A
#添加所有新增加的和修改的和已刪除的文件至?xí)捍鎱^(qū)
5、git?add?--all
#添加所有新增加的和修改的和已刪除的文件至?xí)捍鎱^(qū)
6、git?add?-p?fileName(選擇E,打開編輯器去掉不需要的部分)
#只提交一個(gè)文件的一部分內(nèi)容
mv & rm
1、git mv?fileName?newFileName
#文件重命名
2、git?rm?fileName
#刪除暫存區(qū)和工作區(qū)里的文件
3、git?rm --cached?||?rm?.git/index
#只刪除暫存區(qū)里的文件
reset?&?checkout
1、git?reset?--hard?HEAD?|| commitId
#此撤銷不會在歷史記錄中找到,就好像沒有提交一樣(git reflog才可查看記錄)
--mixed: (默認(rèn)值)?暫存區(qū)的內(nèi)容會被撤銷的版本內(nèi)容覆蓋,工作區(qū)不會被覆蓋
--soft:?暫存區(qū)和工作區(qū)的內(nèi)容不會被撤銷的版本所覆蓋,內(nèi)容保持原樣
--hard:?暫存區(qū)和工作區(qū)的的內(nèi)容都會被撤銷的版本所覆蓋
#只跟蹤被修改的文件
git push?-f?origin?master
#如果撤銷的版本已經(jīng)同步到遠(yuǎn)程分支,那么撤銷后再次同步到遠(yuǎn)程分支會提示當(dāng)前提交晚于遠(yuǎn)程的版本,提交不成功,需要強(qiáng)制推送到遠(yuǎn)程版本,(此操作很危險(xiǎn),如果遠(yuǎn)程版本已經(jīng)被別人同步過,強(qiáng)制推送會出現(xiàn)數(shù)據(jù)丟失的情況)
2、git checkout?HEAD?fileName?(commit => index => workplace)
#暫存區(qū)和工作區(qū)均被覆蓋
3、git?revert -n?commitId?
#此撤銷會生成新的提交,撤銷版本后面的版本依然保留
4、git?checkout?--?fileName?
#從暫存區(qū)中撤銷覆蓋工作區(qū)的內(nèi)容
5、git chekout?-b dev origin/dev?
(git checkout -t origin/dev)
(git checkout --track origin/dev)
#拉取遠(yuǎn)程dev分支到本地
diff
1、git diff?commitId?fileName
#對比工作區(qū)和提交差異
2、git diff?fileName
#對比工作區(qū)和暫存區(qū)的差異
3、git diff --cached fileName
#對比暫存區(qū)和版本庫的差異
4、git diff?head?fileName?
#對比工作區(qū)和版本庫的差異
5、git?diff?--stat
#統(tǒng)計(jì)新增和刪除了多少行
6、git diff?--numstat
#統(tǒng)計(jì)具體新增和刪除了哪一行
clean
1、git?clean?-f?
#清除工作區(qū)的文件
2、git clean?-d
#清除工作區(qū)的目錄
blame
1、git blame fileName
#查看一個(gè)文件里誰修改了什么東西
commit
1、git?commit -am?"強(qiáng)制提交,跳過暫存區(qū)"
#強(qiáng)制提交,跳過?add不包含新增的文件,提交后暫存區(qū)里有記錄
2、git commit --amend -m "編輯上一次提交"
#編輯上一次提交,會生成新的提交記錄
3、git commit?-m "暫存區(qū)提交到本地倉庫"
#將暫存區(qū)里的內(nèi)容提交至本地倉庫,(只提交暫存區(qū)里的內(nèi)容)
4、git commit?--allow-empty -m "允許空提交"
#允許空內(nèi)容提交,會有新的提交記錄
branch
1、git?branch?-f?newBr
#強(qiáng)制新建分支覆蓋原有分支
2、git checkout?-B?newBr
#強(qiáng)制新建并切換到新分支
3、git branch --remote
#查看遠(yuǎn)程分支
4、git branch -m?oldBr?newBr
#分支重命名
5、git?checkout?-b?newBr?commitId
#基于某次提交創(chuàng)建新分支
6、git stash?branch?newBr
#基于存儲建立新分支
7、git reflog?show --date=iso master
#查看分支創(chuàng)建時(shí)間
8、git?branch?-d?branch1?branch2
#同時(shí)刪除多個(gè)分支
9、git branch -D?branch
#強(qiáng)制刪除分支
10、git branch(cat .git/HEAD)
#查看當(dāng)前分支
11、git fetch?-p
#移除遠(yuǎn)程倉庫上不存在的分支
12、 git merge?newBr
#將newBr分支合并到當(dāng)前分支
快進(jìn)(fast-forward):當(dāng)你試圖合并兩個(gè)分支時(shí), 如果順著一個(gè)分支走下去能夠到達(dá)另一個(gè)分支,那么 Git 在合并兩者的時(shí)候, 只會簡單的將指針向前推進(jìn)(指針右移),因?yàn)檫@種情況下的合并操作沒有需要解決的分歧
合并提交:當(dāng)兩個(gè)分支相對于共同的祖先有了多次的提交,合并時(shí)會生成新的提交,它的有兩個(gè)父節(jié)點(diǎn)
合并沖突:當(dāng)兩個(gè)分支對同一文件同一地方做了不同的修改,合并時(shí)就會產(chǎn)生沖突,此時(shí)兩個(gè)分支合并了,但是沒有合并提交,需要手動去解決沖突再手動提交(此時(shí)會出現(xiàn)未合并狀態(tài)的文件,解決完沖突后使用git add 沖突的文件名 來標(biāo)記已解決的沖突)
13、git branch?-v
#查看每個(gè)分支的最后提交
--merged?與?--no-merged?這兩個(gè)有用的選項(xiàng)可以過濾這個(gè)列表中已經(jīng)合并或尚未合并到當(dāng)前分支的分支
14、git fetch?
#從遠(yuǎn)程拉取本地沒有的數(shù)據(jù),它不會影響工作區(qū)的內(nèi)容,會讓你自己合并
15、git pull(git fetch + git merge)
#從遠(yuǎn)程拉取本地沒有的數(shù)據(jù),同步工作區(qū)暫存區(qū)的內(nèi)容
16、git?push origin?--delete?dev
#刪除遠(yuǎn)程分支
17、git rebase master?
(git rebase master(目標(biāo)分支) experiment(主題分支))
git checkout master
git merge experiment
#變基,將當(dāng)前experiment分支并到master分支上,然后切換到master分支上,進(jìn)行合并
merge是通過三方合并(c2\c3\c4),最終生成新的提交:
merge和rebase合并的結(jié)果沒有什么區(qū)別,但是rebase使得整個(gè)過程更加整潔,沒有看到歷史分叉
變基的風(fēng)險(xiǎn):
變基操作的實(shí)質(zhì)是丟棄一些現(xiàn)有的提交,然后相應(yīng)地新建一些內(nèi)容一樣但實(shí)際上不同的提交。如果你已經(jīng)將提交推送至某個(gè)倉庫,而其他人也已經(jīng)從該倉庫拉取提交并進(jìn)行了后續(xù)工作,此時(shí),如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此將不得不再次將他們手頭的工作與你的提交進(jìn)行整合,如果接下來你還要拉取并整合他們修改過的提交,事情就會變得一團(tuán)糟
log
1、git log
#不帶參數(shù)默認(rèn)會按先后順序列出所有提交
2、git log -p?(git log --patch)
#列出每次提交引入的差異,按補(bǔ)丁的格式展示
3、git?log?-n
#按條數(shù)輸出提交記錄
4、git log?--stat
#列出每次提交的粗略統(tǒng)計(jì)信息
5、git?log --pretty=子選項(xiàng)
--oneline:提交按一行顯示
--format:自定義格式化輸出,其格式化參數(shù)如下:
6、git log --graph
#選項(xiàng)添加了一些 ASCII 字符串來形象地展示你的分支、合并歷史
stash
1、git stash save "儲藏編輯過的文件"
#修改當(dāng)前分支到一半的時(shí)候,突然想還原,就可以將它儲藏起來,只對修改的文件生效
2、git?stash list
#查看儲藏列表
3、git stash?apply
#應(yīng)用最新的儲藏內(nèi)容,使用后仍然存在于歷史記錄中
4、git stash?pop
#應(yīng)用最新的存儲藏內(nèi)容,使用后并在歷史記錄中刪除掉
5、git stash?drop?
#刪除最新的儲藏
cat-file
1、git cat-file?-t commitId?
#查看此次提交的具體git對象
2、git cat-file -p?commitId
#查看git對象具體信息
3、wc?-l?fileName
#查看文件行數(shù)
grep
1、git??grep -n www
#檢索哪一行有www
2、git grep?--name-only www
#檢索文件名是否有www
3、git grep?-c?www
#統(tǒng)計(jì)文件中有幾行出現(xiàn)www
其他
git?log -p?
#查看歷史具體信息
git?reflog
#獲取所有操作歷史,包括撤銷的提交
git show -s
#查看提交信息
git ls-files --stage
#查看暫存區(qū)的內(nèi)容
rm -fr .git
#清空版本庫
git hash-object fileName
#查看文件對應(yīng)的hash值
git?cherry-pick?commitId
#兩個(gè)分支做相同的提交
想看更多內(nèi)容,請關(guān)注我的公眾號: