為什么需要用到git娜扇?
情景1: 緊急修復(fù)線上BUG(分支的新建與合并)
現(xiàn)在讓我們來(lái)看一個(gè)簡(jiǎn)單的分支與合并的例子越妈,實(shí)際工作中大體也會(huì)用到這樣的工作流程:
- 開(kāi)發(fā)某個(gè)網(wǎng)站季俩。
- 為實(shí)現(xiàn)某個(gè)新的需求,創(chuàng)建一個(gè)分支梅掠。
- 在這個(gè)分支上開(kāi)展工作酌住。
假設(shè)此時(shí),你突然接到一個(gè)電話說(shuō)有個(gè)很?chē)?yán)重的問(wèn)題需要緊急修補(bǔ)阎抒,那么可以按照下面的方式處理:
- 返回到原先已經(jīng)發(fā)布到生產(chǎn)服務(wù)器上的分支酪我。
- 為這次緊急修補(bǔ)建立一個(gè)新分支,并在其中修復(fù)問(wèn)題且叁。
- 通過(guò)測(cè)試后都哭,回到生產(chǎn)服務(wù)器所在的分支,將修補(bǔ)分支合并進(jìn)來(lái)逞带,然后再推送到生產(chǎn)服務(wù)器上欺矫。
- 切換到之前實(shí)現(xiàn)新需求的分支,繼續(xù)工作展氓。
具體操作方式 鏈接
五種狀態(tài)間的順序操作
四個(gè)區(qū)
- 工作區(qū)(Working Area)
- 暫存區(qū)(Stage)
- 本地倉(cāng)庫(kù)(Local Repository)
- 遠(yuǎn)程倉(cāng)庫(kù)(Remote Repository)
五種狀態(tài)
- 未修改(Origin)
- 已修改(Modified)&未追蹤(Untracked)
- 已暫存(Staged)
- 已提交(Committed)
- 已推送(Pushed)
順序操作
- 第零步:工作區(qū)與倉(cāng)庫(kù)保持一致
- 第一步:文件增刪改穆趴,變?yōu)橐研薷臓顟B(tài)
- 第二步:git add ,變?yōu)橐褧捍鏍顟B(tài)
$ git add --all # 當(dāng)前項(xiàng)目下的所有更改
$ git add . # 當(dāng)前目錄下的所有更改
$ git add xx/xx.py xx/xx2.py # 添加某幾個(gè)文件
- 第三步:git commit遇汞,變?yōu)橐烟峤粻顟B(tài)
$ git commit -m"<這里寫(xiě)commit的描述>"
- 第四步:git push未妹,變?yōu)橐淹扑蜖顟B(tài)
$ git push -u origin master # 第一次需要關(guān)聯(lián)上
$ git push # 之后再推送就不用指明應(yīng)該推送的遠(yuǎn)程分支了
$ git branch # 可以查看本地倉(cāng)庫(kù)的分支
$ git branch -a # 可以查看本地倉(cāng)庫(kù)和本地遠(yuǎn)程倉(cāng)庫(kù)(遠(yuǎn)程倉(cāng)庫(kù)的本地鏡像)的所有分支
git
五種狀態(tài)間的撤銷(xiāo)操作
已修改,但未暫存
$ git diff # 列出所有的修改
$ git diff xx/xx.py xx/xx2.py # 列出某(幾)個(gè)文件的修改
$ git checkout # 撤銷(xiāo)項(xiàng)目下所有的修改
$ git checkout . # 撤銷(xiāo)當(dāng)前文件夾下所有的修改
$ git checkout xx/xx.py xx/xx2.py # 撤銷(xiāo)某幾個(gè)文件的修改
$ git clean -f # untracked狀態(tài)勺疼,撤銷(xiāo)新增的文件
$ git clean -df # untracked狀態(tài)教寂,撤銷(xiāo)新增的文件和文件夾
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# xxx.py
已暫存,未提交
這個(gè)時(shí)候已經(jīng)執(zhí)行過(guò)git add执庐,但未執(zhí)行g(shù)it commit酪耕,但是用git diff已經(jīng)看不到任何修改。
因?yàn)間it diff檢查的是工作區(qū)與暫存區(qū)之間的差異轨淌。
$ git diff --cached # 這個(gè)命令顯示暫存區(qū)和本地倉(cāng)庫(kù)的差異
$ git reset # 暫存區(qū)的修改恢復(fù)到工作區(qū)
$ git reset --soft # 與git reset等價(jià)迂烁,回到已修改狀態(tài),修改的內(nèi)容仍然在工作區(qū)中
$ git reset --hard # 回到未修改狀態(tài)递鹉,清空暫存區(qū)和工作區(qū)
git reset --hard 操作等價(jià)于 git reset 和 git checkout 2步操作
已提交盟步,未推送
執(zhí)行完commit之后,會(huì)在倉(cāng)庫(kù)中生成一個(gè)版本號(hào)(hash值)躏结,標(biāo)志這次提交却盘。之后任何時(shí)候,都可以借助這個(gè)hash值回退到這次提交。
$ git diff <branch-name1> <branch-name2> # 比較2個(gè)分支之間的差異
$ git diff master origin/master # 查看本地倉(cāng)庫(kù)與本地遠(yuǎn)程倉(cāng)庫(kù)的差異
$ git reset --hard origin/master # 回退與本地遠(yuǎn)程倉(cāng)庫(kù)一致
$ git reset --hard HEAD^ # 回退到本地倉(cāng)庫(kù)上一個(gè)版本
$ git reset --hard <hash code> # 回退到任意版本
$ git reset --soft/git reset # 回退且回到已修改狀態(tài)黄橘,修改仍保留在工作區(qū)中兆览。
已推送到遠(yuǎn)程
$ git push -f orgin master # 強(qiáng)制覆蓋遠(yuǎn)程分支
$ git push -f # 如果之前已經(jīng)用 -u 關(guān)聯(lián)過(guò),則可省略分支名
慎用塞关,一般情況下抬探,本地分支比遠(yuǎn)程要新,所以可以直接推送到遠(yuǎn)程帆赢,但有時(shí)推送到遠(yuǎn)程后發(fā)現(xiàn)有問(wèn)題小压,進(jìn)行了版本回退,舊版本或者分叉版本推送到遠(yuǎn)程椰于,需要添加 -f參數(shù)怠益,表示強(qiáng)制覆蓋。
總結(jié)
- 首先瘾婿,先用git status查看下當(dāng)前狀態(tài)溉痢。
- git reset可以作用于本地倉(cāng)庫(kù),用于回退/前進(jìn)到任意版本憋他,也可以作用于暫存區(qū)孩饼,用于撤銷(xiāo)暫存區(qū)修改。有hard和soft2個(gè)參數(shù)竹挡。soft參數(shù)可以省略镀娶,soft參數(shù)表示撤銷(xiāo)的修改仍放在工作區(qū)中。
- git checkout用于撤銷(xiāo)刪除和修改揪罕,git clean -df用于撤銷(xiāo)新增梯码。
- git diff可以查看工作區(qū)、暫存區(qū)好啰、倉(cāng)庫(kù)之間的修改和差異轩娶,參數(shù)不同。