干貨:關(guān)于Git的超贊講解

注:看到掘金上有一篇關(guān)于Git的寫(xiě)的很好的文章,轉(zhuǎn)載一下,希望能幫助到大家。
若有任何問(wèn)題,可與本人聯(lián)系,如侵必刪,謝謝。
文章出處:一篇文章,教你學(xué)會(huì)Git
作者:Ruheng

一篇文章,教你學(xué)會(huì)Git

在日常工作中,經(jīng)常會(huì)用到Git操作。但是對(duì)于新人來(lái)講,剛上來(lái)對(duì)Git很陌生,操作起來(lái)也很懵逼。本篇文章主要針對(duì)剛開(kāi)始接觸Git的新人,理解Git的基本原理,掌握常用的一些命令。

一、Git工作流程

image.png

以上包括一些簡(jiǎn)單而常用的命令,但是先不關(guān)心這些,先來(lái)了解下面這4個(gè)專(zhuān)有名詞。

  • Workspace:工作區(qū)
  • Index / Stage:暫存區(qū)
  • Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))
  • Remote:遠(yuǎn)程倉(cāng)庫(kù)

工作區(qū)

程序員進(jìn)行開(kāi)發(fā)改動(dòng)的地方,是你當(dāng)前看到的,也是最新的。

平常我們開(kāi)發(fā)就是拷貝遠(yuǎn)程倉(cāng)庫(kù)中的一個(gè)分支,基于該分支進(jìn)行開(kāi)發(fā)。在開(kāi)發(fā)過(guò)程中就是對(duì)工作區(qū)的操作。

暫存區(qū)

.git目錄下的index文件, 暫存區(qū)會(huì)記錄git add添加文件的相關(guān)信息(文件名、大小、timestamp...),不保存文件實(shí)體, 通過(guò)id指向每個(gè)文件實(shí)體。可以使用git status查看暫存區(qū)的狀態(tài)。暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中,哪些內(nèi)容是被git管理的。

當(dāng)你完成某個(gè)需求或功能后需要提交到遠(yuǎn)程倉(cāng)庫(kù),那么第一步就是通過(guò)git add先提交到暫存區(qū),被git管理。

本地倉(cāng)庫(kù)

保存了對(duì)象被提交 過(guò)的各個(gè)版本,比起工作區(qū)和暫存區(qū)的內(nèi)容,它要更舊一些。

git commit后同步index的目錄樹(shù)到本地倉(cāng)庫(kù),方便從下一步通過(guò)git push同步本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)的同步。

遠(yuǎn)程倉(cāng)庫(kù)

遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容可能被分布在多個(gè)地點(diǎn)的處于協(xié)作關(guān)系的本地倉(cāng)庫(kù)修改,因此它可能與本地倉(cāng)庫(kù)同步,也可能不同步,但是它的內(nèi)容是最舊的。

小結(jié)

  1. 任何對(duì)象都是在工作區(qū)中誕生和被修改;
  2. 任何修改都是從進(jìn)入index區(qū)才開(kāi)始被版本控制;
  3. 只有把修改提交到本地倉(cāng)庫(kù),該修改才能在倉(cāng)庫(kù)中留下痕跡;
  4. 與協(xié)作者分享本地的修改,可以把它們push到遠(yuǎn)程倉(cāng)庫(kù)來(lái)共享。

下面這幅圖更加直接闡述了四個(gè)區(qū)域之間的關(guān)系,可能有些命令不太清楚,沒(méi)關(guān)系,下部分會(huì)詳細(xì)介紹。


image.png

二、常用Git命令

image.png

網(wǎng)上找了個(gè)圖,別人整理的一張圖,很全很好,借來(lái)用下。下面詳細(xì)解釋一些常用命令。

HEAD

image.png

在掌握具體命令前,先理解下HEAD。

HEAD,它始終指向當(dāng)前所處分支的最新的提交點(diǎn)。你所處的分支變化了,或者產(chǎn)生了新的提交點(diǎn),HEAD就會(huì)跟著改變。

add

image.png

add相關(guān)命令很簡(jiǎn)單,主要實(shí)現(xiàn)將工作區(qū)修改的內(nèi)容提交到暫存區(qū),交由git管理。

git add . 添加當(dāng)前目錄的所有文件到暫存區(qū)
git add [dir] 添加指定目錄到暫存區(qū),包括子目錄
git add [file1] 添加指定文件到暫存區(qū)

commit

image.png

commit相關(guān)命令也很簡(jiǎn)單,主要實(shí)現(xiàn)將暫存區(qū)的內(nèi)容提交到本地倉(cāng)庫(kù),并使得當(dāng)前分支的HEAD向后移動(dòng)一個(gè)提交點(diǎn)。

git commit -m [message] 提交暫存區(qū)到本地倉(cāng)庫(kù),message代表說(shuō)明信息
git commit [file1] -m [message] 提交暫存區(qū)的指定文件到本地倉(cāng)庫(kù)
git commit --amend -m [message] 使用一次新的commit,替代上一次提交

branch

image.png

涉及到協(xié)作,自然會(huì)涉及到分支,關(guān)于分支,大概有展示分支,切換分支,創(chuàng)建分支,刪除分支這四種操作。

git branch 列出所有本地分支
git branch -r 列出所有遠(yuǎn)程分支
git branch -a 列出所有本地分支和遠(yuǎn)程分支
git branch [branch-name] 新建一個(gè)分支,但依然停留在當(dāng)前分支
git checkout -b [branch-name] 新建一個(gè)分支,并切換到該分支
git branch --track [branch][remote-branch] 新建一個(gè)分支,與指定的遠(yuǎn)程分支建立追蹤關(guān)系
git checkout [branch-name] 切換到指定分支,并更新工作區(qū)
git branch -d [branch-name] 刪除分支
git push origin --delete [branch-name] 刪除遠(yuǎn)程分支

關(guān)于分支的操作雖然比較多,但都比較簡(jiǎn)單好記。

merge

image.png

merge命令把不同的分支合并起來(lái)。如上圖,在實(shí)際開(kāi)放中,我們可能從master分支中切出一個(gè)分支,然后進(jìn)行開(kāi)發(fā)完成需求,中間經(jīng)過(guò)R3,R4,R5的commit記錄,最后開(kāi)發(fā)完成需要合入master中,這便用到了merge。

git fetch [remote] merge之前先拉一下遠(yuǎn)程倉(cāng)庫(kù)最新代碼
git merge [branch] 合并指定分支到當(dāng)前分支

一般在merge之后,會(huì)出現(xiàn)conflict,需要針對(duì)沖突情況,手動(dòng)解除沖突。主要是因?yàn)閮蓚€(gè)用戶(hù)修改了同一文件的同一塊區(qū)域。如下圖所示,需要手動(dòng)解除。

image.png

rebase

image.png

rebase又稱(chēng)為衍合,是合并的另外一種選擇。

在開(kāi)始階段,我們處于new分支上,執(zhí)行git rebase dev,那么new分支上新的commit都在master分支上重演一遍,最后checkout切換回到new分支。這一點(diǎn)與merge是一樣的,合并前后所處的分支并沒(méi)有改變。git rebase dev,通俗的解釋就是new分支想站在dev的肩膀上繼續(xù)下去。rebase也需要手動(dòng)解決沖突。

rebase與merge的區(qū)別

現(xiàn)在我們有這樣的兩個(gè)分支,test和master,提交如下:

      D---E test
     /
A---B---C---F master復(fù)制代碼

在master執(zhí)行git merge test,然后會(huì)得到如下結(jié)果:

      D--------E
     /          \
A---B---C---F----G   test, master復(fù)制代碼

在master執(zhí)行git rebase test,然后得到如下結(jié)果:

A---B---D---E---C'---F'   test, master復(fù)制代碼

可以看到,merge操作會(huì)生成一個(gè)新的節(jié)點(diǎn),之前的提交分開(kāi)顯示。而rebase操作不會(huì)生成新的節(jié)點(diǎn),是將兩個(gè)分支融合成一個(gè)線(xiàn)性的提交。

如果你想要一個(gè)干凈的,沒(méi)有merge commit的線(xiàn)性歷史樹(shù),那么你應(yīng)該選擇git rebase
如果你想保留完整的歷史記錄,并且想要避免重寫(xiě)commit history的風(fēng)險(xiǎn),你應(yīng)該選擇使用git merge

reset

image.png

reset命令把當(dāng)前分支指向另一個(gè)位置,并且相應(yīng)的變動(dòng)工作區(qū)和暫存區(qū)。

git reset —soft [commit] 只改變提交點(diǎn),暫存區(qū)和工作目錄的內(nèi)容都不改變
git reset —mixed [commit] 改變提交點(diǎn),同時(shí)改變暫存區(qū)的內(nèi)容
git reset —hard [commit] 暫存區(qū)、工作區(qū)的內(nèi)容都會(huì)被修改到與提交點(diǎn)完全一致的狀態(tài)
git reset --hard HEAD 讓工作區(qū)回到上次提交時(shí)的狀態(tài)

revert

image.png

git revert用一個(gè)新提交來(lái)消除一個(gè)歷史提交所做的任何修改。

revert與reset的區(qū)別

image.png
  • git revert是用一次新的commit來(lái)回滾之前的commit,git reset是直接刪除指定的commit。
  • 在回滾這一操作上看,效果差不多。但是在日后繼續(xù)merge以前的老版本時(shí)有區(qū)別。因?yàn)間it revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch時(shí),導(dǎo)致這部分改變不會(huì)再次出現(xiàn),減少?zèng)_突。但是git reset是之間把某些commit在某個(gè)branch上刪除,因而和老的branch再次merge時(shí),這些被回滾的commit應(yīng)該還會(huì)被引入,產(chǎn)生很多沖突。關(guān)于這一點(diǎn),不太理解的可以看這篇文章。
  • git reset 是把HEAD向后移動(dòng)了一下,而git revert是HEAD繼續(xù)前進(jìn),只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反,能夠抵消要被revert的內(nèi)容。

push

上傳本地倉(cāng)庫(kù)分支到遠(yuǎn)程倉(cāng)庫(kù)分支,實(shí)現(xiàn)同步。

git push [remote][branch] 上傳本地指定分支到遠(yuǎn)程倉(cāng)庫(kù)
git push [remote] --force 強(qiáng)行推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù),即使有沖突
git push [remote] --all 推送所有分支到遠(yuǎn)程倉(cāng)庫(kù)

其他命令

git status 顯示有變更的文件
git log 顯示當(dāng)前分支的版本歷史
git diff 顯示暫存區(qū)和工作區(qū)的差異
git diff HEAD 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異
git cherry-pick [commit] 選擇一個(gè)commit,合并進(jìn)當(dāng)前分支

以上就是關(guān)于Git的一些常用命令及詳細(xì)闡述,相信能對(duì)Git有一個(gè)初步的認(rèn)識(shí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git是目前最流行的版本管理系統(tǒng),也是最先進(jìn)的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,950評(píng)論 1 17
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,853評(píng)論 1 26
  • 文/孤鳥(niǎo)差魚(yú) 黑色大公雞 碰見(jiàn)大紅色的毛毛蟲(chóng) 嚇到跑斷腿
    孤鳥(niǎo)差魚(yú)閱讀 980評(píng)論 0 3
  • 生老病死,在你的見(jiàn)識(shí)你看到的是什么?有人說(shuō)很可怕,有人說(shuō)不敢面對(duì),也有人說(shuō)是人生的蛻變。 對(duì)我而言,生老病...
    hwei_aaeb閱讀 357評(píng)論 0 0
  • 為迎接2017年鎮(zhèn)對(duì)村第四次農(nóng)村環(huán)境衛(wèi)生檢查,我村進(jìn)一步開(kāi)展環(huán)境衛(wèi)生整治工作,組織動(dòng)員巾幗力量清潔庭院內(nèi)外,促進(jìn)城...
    秦堰村_諸余沖閱讀 228評(píng)論 0 0

友情鏈接更多精彩內(nèi)容