每個(gè)程序員都該學(xué)會(huì)的Git知識(shí)

逅弈 轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處跪削,謝謝!

每個(gè)程序員都該學(xué)會(huì)的Git知識(shí)

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

一、Git工作流程

git-image1.png

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

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

工作區(qū)

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

平常我們開發(fā)就是拷貝遠(yuǎn)程倉(cāng)庫(kù)中的一個(gè)分支,基于該分支進(jìn)行開發(fā)装获。在開發(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的目錄樹到本地倉(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ū)才開始被版本控制;
  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ì)介紹臊泰。

git-image2.png

二蚜枢、常用Git命令

git-image3.png

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

HEAD

git-image4.png

在掌握具體命令前嵌施,先理解下HEAD饲化。

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

add

git-image5.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

git-image6.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

git-image7.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

git-image8.png

merge命令把不同的分支合并起來(lái)。如上圖修陡,在實(shí)際開放中,我們可能從master分支中切出一個(gè)分支宴杀,然后進(jìn)行開發(fā)完成需求旺罢,中間經(jīng)過(guò)R3,R4,R5的commit記錄扁达,最后開發(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è)用戶修改了同一文件的同一塊區(qū)域昌执。如下圖所示,需要手動(dòng)解除煤禽。

git-image9.png

rebase

git-image10.png

rebase又稱為衍合,是合并的另外一種選擇。

在開始階段杭抠,我們處于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

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

      D--------E
     /          \
A---B---C---F----G   test, master

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

A---B---D---E---C'---F'   test, master

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

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

reset

git-image11.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

git-image12.png

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

revert與reset的區(qū)別

git-image13.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í)。

原文出處:一篇文章窖式,教你學(xué)會(huì)Git

作者:Ruheng

更多原創(chuàng)好文萝喘,請(qǐng)關(guān)注「逅弈逐碼」

Sentinel 系列教程蜒灰,現(xiàn)已上傳到 github 和 gitee 中:

sentinel-tutorial.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末强窖,一起剝皮案震驚了整個(gè)濱河市翅溺,隨后出現(xiàn)的幾起案子咙崎,更是在濱河造成了極大的恐慌,老刑警劉巖网杆,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碳却,死亡現(xiàn)場(chǎng)離奇詭異昼浦,居然都是意外死亡筒主,警方通過(guò)查閱死者的電腦和手機(jī)乌妙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門藤韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事悉盆』烂耍” “怎么了宏粤?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵来农,是天一觀的道長(zhǎng)崇堰。 經(jīng)常有香客問(wèn)我涩咖,道長(zhǎng)檩互,這世上最難降的妖魔是什么闸昨? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮村刨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘打洼。我一直安慰自己募疮,他們只是感情好僻弹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布芭毙。 她就那樣靜靜地躺著,像睡著了一般退敦。 火紅的嫁衣襯著肌膚如雪侈百。 梳的紋絲不亂的頭發(fā)上翰铡,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天例证,我揣著相機(jī)與錄音迷捧,去河邊找鬼拣宰。 笑死巡社,一個(gè)胖子當(dāng)著我的面吹牛晌该,可吹牛的內(nèi)容都是我干的朝群。 我是一名探鬼主播姜胖,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼右莱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼慢蜓!你這毒婦竟也來(lái)了晨抡?” 一聲冷哼從身側(cè)響起耘柱,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帆谍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后烈涮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坚洽,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡讶舰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肋乍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敷存。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡觅闽,死狀恐怖蛉拙,靈堂內(nèi)的尸體忽然破棺而出彻亲,到底是詐尸還是另有隱情睹栖,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站豁辉,受9級(jí)特大地震影響徽级,放射性物質(zhì)發(fā)生泄漏聊浅。R本人自食惡果不足惜餐抢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望低匙。 院中可真熱鬧旷痕,春花似錦、人聲如沸顽冶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强重。三九已至绞呈,卻和暖如春贸人,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佃声。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工召嘶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埠胖。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓谋竖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子些侍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Git是目前最流行的版本管理系統(tǒng)颂龙,也是最先進(jìn)的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,705評(píng)論 1 17
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,478評(píng)論 1 26
  • 明·陶宗儀《輟耕錄》让蕾。 傳說(shuō)從前在五臺(tái)山有一種奇特的小鳥,名叫寒號(hào)鳥顿颅。寒號(hào)鳥有四只腳斩跌,兩只肉翅,不會(huì)飛行萝快。夏天,它...
    Uncle_Ma閱讀 652評(píng)論 0 0
  • 資料來(lái)源:https://github.com/BrambleXu/pydata-notebook NumPy(N...
    漁家傲_俞閱讀 239評(píng)論 0 1
  • 春光遲到的原因昂勒,是它采擷了半幅畫,半幅裾,半副錦緞脏里,繡成這方素白錦衣酝碳。我為它守了一整個(gè)春天的桃花樹,等了半世花開,...
    ssjbysjpau閱讀 243評(píng)論 0 0