git這只貓你擼的還順手嗎
前言
如大家所知,Git是一個免費(fèi)且開源的分布式版本控制系統(tǒng),它能自動記錄每次文件的改動,還可以讓開發(fā)者協(xié)作編輯。如果想查看某次改動,只需要在軟件里瞄一眼就可以?,F(xiàn)在大部分公司都是使用git作為版本控制工具,這也是我們每天都要打交道的工具。那么,你能擼順git這只貓嗎?
git基本命令
git init
//表示初始化,把這個文件變成Git可以管理的倉庫。初始化后打開隱藏的文件可以看到有一個.git文件
git init
復(fù)制代碼git add
作用就是將需要提交的代碼從工作區(qū)添加到暫存區(qū),就是告訴git系統(tǒng),要提交哪些文件,之后就可以使用git commit命令進(jìn)行提交了。
//不加參數(shù)默認(rèn)為將修改操作的文件和未跟蹤新添加的文件添加到git系統(tǒng)的暫存區(qū),即添加當(dāng)前倉庫所有改動,注意不包括刪除
git add .
//-u 表示將已跟蹤文件中的修改和刪除的文件添加到暫存區(qū),不包括新增加的文件,注意這些被刪除的文件被加入到暫存區(qū)再被提交并推送到服務(wù)器的版本庫之后這個文件就會從git系統(tǒng)中消失了。
git add -u .
//-A 表示將所有的已跟蹤的文件的修改與刪除和新增的未跟蹤的文件都添加到暫存區(qū)。
git add -A .
復(fù)制代碼Git commit
主要是將暫存區(qū)里的改動給提交到本地的版本庫。每次使用git commit命令我們都會在本地版本庫生成一個40位的哈希值,這個哈希值也叫commit-id
//把暫存區(qū)的全部文件提交到本地倉庫。-m后接說明
git commit -m ‘message’
//-a參數(shù)可以將所有已跟蹤文件中的執(zhí)行修改或刪除操作的文件都提交到本地倉庫,即使它們沒有經(jīng)過git add添加到暫存區(qū),但是新加的文件(即沒有被git系統(tǒng)管理的文件)是不能被提交到本地倉庫的。
git commit -am ‘message’ -am等同于-a -m
復(fù)制代碼Git push
在使用git commit命令將修改從暫存區(qū)提交到本地版本庫后,只剩下最后一步將本地版本庫的分支推送到遠(yuǎn)程服務(wù)器上對應(yīng)的分支了。git push的一般形式為 git push <遠(yuǎn)程主機(jī)名> <本地分支名> <遠(yuǎn)程分支名> ,例如 git push origin master:refs/for/master ,即是將本地的master分支推送到遠(yuǎn)程主機(jī)origin上的對應(yīng)master分支, origin 是遠(yuǎn)程主機(jī)名。第一個master是本地分支名,第二個master是遠(yuǎn)程分支名。
//如果遠(yuǎn)程分支被省略,如上則表示將本地分支推送到與之存在追蹤關(guān)系的遠(yuǎn)程分支(通常兩者同名),如果該遠(yuǎn)程分支不存在,則會被新建
git push origin master
//如果省略本地分支名,則表示刪除指定的遠(yuǎn)程分支,因?yàn)檫@等同于推送一個空的本地分支到遠(yuǎn)程分支,等同于 git
git push origin :refs/for/master
//如果當(dāng)前分支與遠(yuǎn)程分支存在追蹤關(guān)系,則本地分支和遠(yuǎn)程分支都可以省略,將當(dāng)前分支推送到origin主機(jī)的對應(yīng)分支
push origin –delete master
git push origin
//如果當(dāng)前分支只有一個遠(yuǎn)程分支,那么主機(jī)名都可以省略,形如git push,可以使用git branch -r,查看遠(yuǎn)程的分支名
git push
復(fù)制代碼git pull
//從遠(yuǎn)程倉庫拉取代碼并合并到本地,可簡寫為 git pull 等同于 git fetch && git merge
git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
//使用rebase的模式進(jìn)行合并
git pull --rebase <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
復(fù)制代碼git fetch
//這個命令將某個遠(yuǎn)程主機(jī)的更新全部取回本地
git fetch <遠(yuǎn)程主機(jī)名>
//如果只想取回特定分支的更新,可以指定分支名
git fetch <遠(yuǎn)程主機(jī)名> <分支名> //注意之間有空格
//最常見的命令如取回origin 主機(jī)的master 分支
git fetch origin master
//取回更新后,會返回一個FETCH_HEAD ,指的是某個branch在服務(wù)器上的最新狀態(tài),可以在本地通過它查看剛?cè)』氐母滦畔ⅲ?br>git log -p FETCH_HEAD
復(fù)制代碼git branch
創(chuàng)建分支
//基于當(dāng)前commit創(chuàng)建test分支。.git/HEAD 文件中記錄了當(dāng)前分支名字。
git branch test:
復(fù)制代碼刪除分支
//刪除本地test分支
git branch -d test
//test分支還沒有合入當(dāng)前分支,所以要用-D參數(shù)才能刪掉。
git branch -D test
復(fù)制代碼查看分支
//列出當(dāng)前分支清單
git branch
//查看遠(yuǎn)程分支和本地分支
git branch -a
//查看各個分支最后一個提交信息
git branch -v
//查看哪些分支已經(jīng)合并入當(dāng)前分支
git branch --merged
復(fù)制代碼git提交規(guī)范
commit message應(yīng)該清晰明了,說明本次提交的目的,以AngularJS的提交規(guī)范為例講一下git提交規(guī)范。每次提交Commit message都包括三個部分:header,body 和 footer。
():
其中header是必需的,body和footer可以省略。建議任何一行都不要超過72個字符(或100個字符),避免自動換行影響美觀。
Header
Header部分只有一行,包括三個字段:type(必需)、scope(可選)和subject(必需)。
type
用于說明commit的類別,只允許使用下面7個標(biāo)識。
feat:新功能(feature)
fix:修補(bǔ)bug
docs:文檔(documentation)
style:格式(不影響代碼運(yùn)行的變動)
refactor:重構(gòu)(即不是新增功能,也不是修改bug的代碼變動)
test:增加測試
chore:構(gòu)建過程或輔助工具的變動
scope
scope用于說明commit影響的范圍,比如數(shù)據(jù)層、控制層、視圖層等等,或者寫明影響的功能模塊,以便快速定位。如果你的修改影響了不止一個scope,你可以使用*代替。
subject
subject是本次提交的簡短描述,應(yīng)該像一個文章標(biāo)題一樣,不要過長。
Body
Body部分是對本次commit的詳細(xì)描述,羅列代碼功能,可以分成多行。body是可選的,subject描述的足夠清楚的話body可以不用寫。
footer
描述與本次提交相關(guān)聯(lián)的break change或issue。適用于以下情況:
1.不兼容變動:如果當(dāng)前代碼與上一個版本不兼容,則Footer部分以BREAKING CHANGE開頭,后面是對變動的描述、以及變動理由和遷移方法。
2.關(guān)閉 Issue:如果當(dāng)前commit針對某個issue,那么可以在Footer部分關(guān)閉這個issue 。
常見問題
修改提交git賬號
首次用git提交某次修改時會讓你輸入對應(yīng)的name和email,這會作為當(dāng)前節(jié)點(diǎn)的的全局配置,在后續(xù)的提交都是用的這個賬號。若是需要修改賬號可用以下操作:
通過命令git config --list查看當(dāng)前的git相關(guān)配置,找到user.name 和user.email,修改即可。
修改全局(修改全局默認(rèn)值)name和email,通過以下命令:
git config --global user.name yourName;
git config --global user.email yourEmail;
復(fù)制代碼只修改當(dāng)前project的name和email,在當(dāng)前project目錄下通過命令:
git config user.name yourName;
git config user.email yourEmail;
復(fù)制代碼撤消本地提交
git reset HEAD~2 # undo last two commits, keep changes
git reset --hard HEAD~2 # undo last two commits, discard changes
復(fù)制代碼hard選項(xiàng)會重置working tree以及索引,造成所有的修改全部丟失。
改錯代碼分支
日常開發(fā)中可能會出現(xiàn)當(dāng)開發(fā)了完功能準(zhǔn)備提交代碼時發(fā)現(xiàn)修改在了錯誤的分支上面,那么怎么處理呢?
還未commit的情況:
git add --all #把所有改動暫存
git stash #把暫存的文件提交到git的暫存棧
git checkout #切換到正確的分支
git stash pop #將暫存棧中的代碼放出來
復(fù)制代碼已經(jīng)commit的情況:
先切換到改錯了的分支
git reset HEAD~1 #把最近一次提交放回暫存區(qū), 并取消此次提交
git stash #把暫存的文件提交到git的暫存棧
git checkout #切換到正確的分支
git stash pop #將暫存棧中的代碼放出來
git push origin 錯誤的分支 -f #把遠(yuǎn)程里面不該提交的移除
復(fù)制代碼git處理沖突
當(dāng)拉取下來的文件與本地修改的文件有沖突,先提交你的改變,或者先將你的改變暫時存儲起來
git stash #將本地修改存儲起來
git pull #pull內(nèi)容
git stash pop stash@{0} #還原暫存的內(nèi)容
git stash pop #簡寫
復(fù)制代碼找到合并后破壞了某些內(nèi)容的提交
跟蹤在大型合并之后引入了bug的提交非常耗時。git有個二進(jìn)制搜索工具git-bisect。首先執(zhí)行初始設(shè)置:
git bisect start # starts the bisecting session
git bisect bad # marks the current revision as bad
git bisect good revision # marks the last known good revision
復(fù)制代碼再次運(yùn)行spec文件并提交相應(yīng)的“good”或“bad”標(biāo)記。
git bisect good # or git bisec bad
復(fù)制代碼總結(jié)
本文總結(jié)了工作中使用較為高頻的Git命令的用法,以及git的提交規(guī)范,常見問題的處理。在我們的日常開發(fā)中少不了對Git的使用,我們要像擼貓一樣,擼的順手,漂亮!
作者:西vvi
鏈接:https://juejin.cn/post/7025786618632437797
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

