Git使用

git是一種版本控制系統(tǒng)跟继。跟svn、cvs是同級的概念蛙婴。

github是一個網(wǎng)站粗井,給用戶提供git服務。這樣你就不用自己部署git系統(tǒng),直接用注冊個賬號浇衬,用他們提供的git服務就可以懒构。

在日常工作中,經(jīng)常會用到Git操作耘擂。但是對于新人來講胆剧,剛上來對Git很陌生,操作起來也很懵逼醉冤。本篇文章主要針對剛開始接觸Git的新人秩霍,理解Git的基本原理,掌握常用的一些命令蚁阳。

一铃绒、Git工作流程

以上包括一些簡單而常用的命令,但是先不關(guān)心這些韵吨,先來了解下面這4個專有名詞匿垄。

Workspace:工作區(qū)

Index / Stage:暫存區(qū)

Repository:倉庫區(qū)(或本地倉庫)

Remote:遠程倉庫

工作區(qū)

程序員進行開發(fā)改動的地方,是你當前看到的归粉,也是最新的椿疗。

平常我們開發(fā)就是拷貝遠程倉庫中的一個分支,基于該分支進行開發(fā)糠悼。在開發(fā)過程中就是對工作區(qū)的操作届榄。

暫存區(qū)

.git目錄下的index文件, 暫存區(qū)會記錄git add添加文件的相關(guān)信息(文件名、大小倔喂、timestamp...)铝条,不保存文件實體, 通過id指向每個文件實體∠可以使用git status查看暫存區(qū)的狀態(tài)班缰。暫存區(qū)標記了你當前工作區(qū)中,哪些內(nèi)容是被git管理的悼枢。

當你完成某個需求或功能后需要提交到遠程倉庫埠忘,那么第一步就是通過git add先提交到暫存區(qū),被git管理馒索。

本地倉庫

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

git commit后同步index的目錄樹到本地倉庫旨怠,方便從下一步通過git push同步本地倉庫與遠程倉庫的同步。

遠程倉庫

遠程倉庫的內(nèi)容可能被分布在多個地點的處于協(xié)作關(guān)系的本地倉庫修改蜈块,因此它可能與本地倉庫同步鉴腻,也可能不同步迷扇,但是它的內(nèi)容是最舊的。

小結(jié)

任何對象都是在工作區(qū)中誕生和被修改拘哨;

任何修改都是從進入index區(qū)才開始被版本控制谋梭;

只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕跡倦青;

與協(xié)作者分享本地的修改,可以把它們push到遠程倉庫來共享盹舞。

下面這幅圖更加直接闡述了四個區(qū)域之間的關(guān)系产镐,可能有些命令不太清楚,沒關(guān)系踢步,下部分會詳細介紹癣亚。

二、常用Git命令

網(wǎng)上找了個圖获印,別人整理的一張圖述雾,很全很好,借來用下兼丰。下面詳細解釋一些常用命令玻孟。

HEAD

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

HEAD黍翎,它始終指向當前所處分支的最新的提交點。你所處的分支變化了艳丛,或者產(chǎn)生了新的提交點匣掸,HEAD就會跟著改變。

add

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

git add .添加當前目錄的所有文件到暫存區(qū)

git add <dir>添加指定目錄到暫存區(qū)戴差,包括子目錄

git add <file1>添加指定文件到暫存區(qū)

commit

commit相關(guān)命令也很簡單送爸,主要實現(xiàn)將暫存區(qū)的內(nèi)容提交到本地倉庫,并使得當前分支的HEAD向后移動一個提交點造挽。

git commit -m <message>提交暫存區(qū)到本地倉庫,message代表說明信息

git commit <file1> -m <message>提交暫存區(qū)的指定文件到本地倉庫

git commit --amend -m <message>使用一次新的commit碱璃,替代上一次提交

branch

涉及到協(xié)作,自然會涉及到分支饭入,關(guān)于分支嵌器,大概有展示分支,切換分支谐丢,創(chuàng)建分支爽航,刪除分支這四種操作蚓让。

git branch列出所有本地分支

git branch -r列出所有遠程分支

git branch -a列出所有本地分支和遠程分支

git branch <branch-name>新建一個分支,但依然停留在當前分支

git checkout -b <branch-name>新建一個分支讥珍,并切換到該分支

git branch --track <branch><remote-branch>新建一個分支历极,與指定的遠程分支建立追蹤關(guān)系

git checkout <branch-name>切換到指定分支,并更新工作區(qū)

git branch -d <branch-name>刪除分支

git push origin --delete <branch-name>刪除遠程分支

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

merge

merge命令把不同的分支合并起來。如上圖氏义,在實際開放中锄列,我們可能從master分支中切出一個分支,然后進行開發(fā)完成需求惯悠,中間經(jīng)過R3,R4,R5的commit記錄邻邮,最后開發(fā)完成需要合入master中,這便用到了merge克婶。

git fetch <remote>merge之前先拉一下遠程倉庫最新代碼

git merge <branch>合并指定分支到當前分支

一般在merge之后筒严,會出現(xiàn)conflict,需要針對沖突情況情萤,手動解除沖突鸭蛙。主要是因為兩個用戶修改了同一文件的同一塊區(qū)域。如下圖所示紫岩,需要手動解除规惰。

rebase

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

在開始階段歇万,我們處于new分支上,執(zhí)行g(shù)it rebase dev勋陪,那么new分支上新的commit都在master分支上重演一遍贪磺,最后checkout切換回到new分支。這一點與merge是一樣的诅愚,合并前后所處的分支并沒有改變寒锚。git rebase dev,通俗的解釋就是new分支想站在dev的肩膀上繼續(xù)下去违孝。rebase也需要手動解決沖突刹前。

rebase與merge的區(qū)別

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

D---Etest/A---B---C---Fmaster

在master執(zhí)行g(shù)it merge test,然后會得到如下結(jié)果:

D--------E/\A---B---C---F----Gtest,master

在master執(zhí)行g(shù)it rebase test雌桑,然后得到如下結(jié)果:

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

可以看到喇喉,merge操作會生成一個新的節(jié)點,之前的提交分開顯示校坑。而rebase操作不會生成新的節(jié)點拣技,是將兩個分支融合成一個線性的提交千诬。

如果你想要一個干凈的,沒有merge commit的線性歷史樹膏斤,那么你應該選擇git rebase

如果你想保留完整的歷史記錄徐绑,并且想要避免重寫commit history的風險,你應該選擇使用git merge

reset

reset命令把當前分支指向另一個位置莫辨,并且相應的變動工作區(qū)和暫存區(qū)傲茄。

git reset —soft <commit>只改變提交點,暫存區(qū)和工作目錄的內(nèi)容都不改變

git reset —mixed <commit>改變提交點沮榜,同時改變暫存區(qū)的內(nèi)容

git reset —hard <commit>暫存區(qū)烫幕、工作區(qū)的內(nèi)容都會被修改到與提交點完全一致的狀態(tài)

git reset --hard HEAD讓工作區(qū)回到上次提交時的狀態(tài)

revert

git revert用一個新提交來消除一個歷史提交所做的任何修改。

revert與reset的區(qū)別

git revert是用一次新的commit來回滾之前的commit敞映,git reset是直接刪除指定的commit。

在回滾這一操作上看磷斧,效果差不多振愿。但是在日后繼續(xù)merge以前的老版本時有區(qū)別。因為git revert是用一次逆向的commit“中和”之前的提交弛饭,因此日后合并老的branch時冕末,導致這部分改變不會再次出現(xiàn),減少沖突侣颂。但是git reset是之間把某些commit在某個branch上刪除档桃,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入憔晒,產(chǎn)生很多沖突藻肄。關(guān)于這一點,不太理解的可以看這篇文章拒担。

git reset 是把HEAD向后移動了一下嘹屯,而git revert是HEAD繼續(xù)前進,只是新的commit的內(nèi)容和要revert的內(nèi)容正好相反从撼,能夠抵消要被revert的內(nèi)容州弟。

push

上傳本地倉庫分支到遠程倉庫分支,實現(xiàn)同步低零。

git push <remote><branch>上傳本地指定分支到遠程倉庫

git push <remote> --force強行推送當前分支到遠程倉庫婆翔,即使有沖突

git push <remote> --all推送所有分支到遠程倉庫

其他命令

git status顯示有變更的文件

git log顯示當前分支的版本歷史

git diff顯示暫存區(qū)和工作區(qū)的差異

git diff HEAD顯示工作區(qū)與當前分支最新commit之間的差異

git cherry-pick <commit>選擇一個commit,合并進當前分支

以上就是關(guān)于Git的一些常用命令及詳細闡述掏婶,相信能對Git有一個初步的認識啃奴。

轉(zhuǎn)自ruheng

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市气堕,隨后出現(xiàn)的幾起案子纺腊,更是在濱河造成了極大的恐慌畔咧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揖膜,死亡現(xiàn)場離奇詭異誓沸,居然都是意外死亡,警方通過查閱死者的電腦和手機壹粟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門拜隧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趁仙,你說我怎么就攤上這事洪添。” “怎么了雀费?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵干奢,是天一觀的道長。 經(jīng)常有香客問我盏袄,道長忿峻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任辕羽,我火速辦了婚禮逛尚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刁愿。我一直安慰自己绰寞,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布铣口。 她就那樣靜靜地躺著滤钱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪枷踏。 梳的紋絲不亂的頭發(fā)上菩暗,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音旭蠕,去河邊找鬼停团。 笑死,一個胖子當著我的面吹牛掏熬,可吹牛的內(nèi)容都是我干的佑稠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼旗芬,長吁一口氣:“原來是場噩夢啊……” “哼舌胶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疮丛,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤幔嫂,失蹤者是張志新(化名)和其女友劉穎辆它,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體履恩,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锰茉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了切心。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飒筑。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡花盐,死狀恐怖贯底,靈堂內(nèi)的尸體忽然破棺而出惦界,到底是詐尸還是另有隱情戒幔,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布肘迎,位于F島的核電站耀盗,受9級特大地震影響调鬓,放射性物質(zhì)發(fā)生泄漏认然。R本人自食惡果不足惜材原,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望季眷。 院中可真熱鬧,春花似錦卷胯、人聲如沸子刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挺峡。三九已至,卻和暖如春担钮,著一層夾襖步出監(jiān)牢的瞬間橱赠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工箫津, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狭姨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓苏遥,卻偏偏與公主長得像饼拍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子田炭,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • git 使用筆記 git原理: 文件(blob)對象师抄,樹(tree)對象,提交(commit)對象 tree對象 ...
    神刀閱讀 3,757評論 0 10
  • 昨天在同事電腦上操作了一把cherry-pick代碼,發(fā)現(xiàn)很多功能不用,就慢慢忘記了,梳理了下流程圖: git c...
    gogoingmonkey閱讀 661評論 0 0
  • 本文通過以下四個部分講解git的使用 Git配置 Git使用場景 Git分支管理方法 常用git命令 在講解...
    z小牛閱讀 1,637評論 0 3
  • 前言 Git是什么 官方話:Git是一個免費的開源分布式版本控制系統(tǒng)教硫,旨在快速高效地處理從小型到大型項目的所有事務...
    梅先森森森森森森閱讀 2,011評論 1 3
  • 【寫作成長計劃】第十三天 想起香奈兒童年時期叨吮,母親就去世辆布,接著被父親遺棄。親人也都是假親人茶鉴。 在孤兒院長大锋玲,那里既...
    二公主和王子閱讀 222評論 0 0