git常用操作命令總結(jié)(思維導圖)

git工作流現(xiàn)在已經(jīng)成了大大小小科技型公司的標配举反,程序員日常擼代碼必備工具攒暇。不同的公司根據(jù)業(yè)務的展開及開發(fā)的進度都會制定最合適的git流程。上家公司開發(fā)人員少灌灾,流程基本就是develop->release->master雕旨,有線上bug修復扮匠,就基于masterhotfix分支,測完之后通過gitlab合并回masterdevelop分支凡涩,基本上屬于單線操作棒搜,簡單清晰。到新公司后活箕,開發(fā)需求數(shù)倍增加力麸,開發(fā)人員也比較多,各種流程繁雜育韩,需要合并分支克蚂,處理沖突,多線開發(fā)的情況也越來越多筋讨。以往學習的那點git知識已經(jīng)不能滿足現(xiàn)在的開發(fā)了(其實就是git學的不精)埃叭,最近又重新把git流程過了一遍,今天來總結(jié)一下悉罕。

幾個基礎概念

工作區(qū)及文件狀態(tài)

git分為三個工作區(qū)域:工作區(qū) Working Directory赤屋、暫存區(qū) Staging Area立镶、GIT倉庫 repository,git倉庫又有本地和遠程的概念类早,一般來講媚媒,本地倉庫會領先于遠程倉庫,不過也有例外情況涩僻,下面再具體講缭召。

git的文件狀態(tài)。git倉庫中的文件逆日,不外乎這幾種狀態(tài):

  • Untracked 未追蹤嵌巷,即新建一個a.js文件,還沒有被git追蹤屏富,不會到版本庫內(nèi)晴竞。
  • Unmodified 未修改蛙卤,該文件在git版本庫內(nèi)狠半,但是還沒有被修改。
  • modified 已修改颤难,該文件在git版本庫神年,已經(jīng)修改,但還沒有暫存行嗤。
  • Staged 已暫存已日,有修改的文件已經(jīng)通過git add <file>添加到暫存區(qū)

倉庫內(nèi)文件的狀態(tài)可以通過git status查看栅屏。

gitblog01.png

a.js是新增的文件飘千,還沒有被追蹤,c.js修改了栈雳,但是還沒有添加到暫存區(qū)护奈,b.js修改后已經(jīng)添加到暫存區(qū),此時commit將只會提交b.js哥纫。

快照流

每次提交保存時霉旗,git主要對當時的全部文件制作一個快照并保存這個快照的索引。 為了高效蛀骇,如果文件沒有修改厌秒,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件擅憔。

各種撤消

針對不同情況的撤消操作命令鸵闪,在git status中都能看到,這里來總結(jié)一下:

  • git rm <file> :將某個已被追蹤的文件刪除暑诸,提交之后該文件不會再被追蹤岛马,同時本地也會刪除該文件棉姐。
  • git rm --cached <file> : 同上,不再追蹤某個文件啦逆,但是本地磁盤內(nèi)不會刪除該文件伞矩,回到Untracked狀態(tài)。
  • git checkout -- <file> : 將整個文件的修改恢復夏志,慎用乃坤,modified -> unmodified,一般使用IDE工具修改最好沟蔑。
  • git reset HEAD <file> : 將暫存區(qū)的文件回退至已修改狀態(tài)湿诊,staged -> modified,文件add之后回退可用瘦材。
  • git reset --hard HEAD^ : 回退到上個版本厅须,commit之后算一個版本。
  • git reset --hard commit_id : 移動HEAD指針食棕,會退到指定commit_id的版本朗和。
  • git commit --amend : 覆蓋之前的提交信息,運行此命令會將暫存區(qū)文件提交簿晓,同時啟動vim編輯器眶拉,可以編輯上一次的提交信息,最終提交記錄里只會有這一次修改后的信息憔儿。

打標簽

Git 可以給歷史中的某一個提交打上標簽忆植,以示重要。 比較有代表性的是人們會使用這個功能來標記發(fā)布結(jié)點(v1.0 等等)谒臼。工作中可以給某次提交打上標簽朝刊,運維發(fā)布線上代碼時會以此為準。

  • git tag :列出所有標簽蜈缤。
  • git tag -l release :列出所有包含release字段的tag拾氓。
  • git tag -a v1.0 -m 'my v1.0 version' : 創(chuàng)建附注標簽,使用git show v1.0查看詳細信息劫樟。
  • git tag v1.0 :創(chuàng)建輕量標簽痪枫。
  • git tag v1.0 commit_id : 給某個歷史提交commit_id打標簽,可以使用git log --pretty=online查看歷史請求叠艳。
  • git push origin [tagname] : 推送單個標簽到遠端
  • git push origin --tags : 推送所有本地標簽到遠端
  • git checkout -b [branchname] [tagname] : 在特定的標簽上創(chuàng)建一個新分支

分支操作

分支操作比較常用奶陈,總結(jié)一下命令行:

  • git branch develop : 新建develop分支,但是不切換附较。
  • git checkout master : 切換至master分支吃粒。
  • git checkout -b develop :基于當前分支新建develop分支,并切換至develop分支拒课。
  • git branch -d dev :刪除dev分支徐勃。
  • git branch -r :查看遠程分支列表
  • git checkout -b iss53 origin/iss53 : 拉取遠端分支iss53并在本地新建該分支事示。
  • git checkout --track origin/iss53 : 同上,簡化版本僻肖。
  • git push -u origin iss54 : 推送本地分支iss54至遠程倉庫origin/iss54肖爵,同時建立追蹤關系。
  • git push origin --delete iss54 : 刪除遠程分支iss54

合并及處理沖突

合并

先來張合并圖:

gitblog02.png

上圖展示了將iss53分支合并至master分支的過程臀脏。首先切換到master分支劝堪,保證master分支最新,然后git merge iss53揉稚,此時Git 會使用兩個分支的末端所指的快照(commit6commit4-hotfix)以及這兩個分支的工作祖先(commit3)秒啦,做一個簡單的三方合并。

注意觀察指針的位置搀玖,此時master分支指向了commit7余境,iss53仍然指向commit6的位置,這就是平時開發(fā)最常見的情況灌诅,保留自己的開發(fā)分支進度芳来,同時將自己的代碼合并回提測/上線分支。問題來了延塑,如果我反向合并呢绣张?即在iss53分支上運行git merge master呢答渔?

考慮一下這種場景:你的同事開發(fā)了一個需求A关带,并且已經(jīng)通過上面的方式將他的代碼合入了master分支;你負責的需求B此時開發(fā)了一半沼撕,突然發(fā)現(xiàn)有一個地方需要基于需求A的代碼才能繼續(xù)進行宋雏。這時候就可以將master上的代碼合入你自己的分支iss53,此時你的代碼已經(jīng)包含了master中commit的代碼务豺,流程圖如下:

gitblog03.png

如果之后master分支再沒有任何代碼合入磨总,你的需求開發(fā)完之后,合入master分支時將會是一次fast-forward合并笼沥,master的指針會直接快進指向iss53所在的位置蚪燕。

另一個需要注意的是:代碼合并時合并的只是你之前commit提交的代碼修改,只對比這些文件奔浅。

解決沖突

代碼為什么沖突馆纳,用上圖舉例來說,自commit3之后汹桦,master分支和iss53分支分別有commit4-hotfixcommit5/6提交鲁驶,如果這兩個分支提交中修改了同一個文件的相同位置,則會報文件有沖突舞骆,需要解決沖突才能繼續(xù)合并钥弯。解決流程就是:先手動解決文件a的沖突径荔,然后git add a.js,接著git commit -m 'fix conflict'即可脆霎,此時可以推送到遠端倉庫总处。可以通過git status查看未解決沖突的文件睛蛛。

gitblog04.png

這個過程中可以通過git merge --abort來終止合并辨泳。

解決沖突最重要的是要細心,要仔細查看git status未解決沖突的文件玖院,一一去解決菠红。如果不加思索的直接git add .,則會將未解決沖突的文件移動到暫存區(qū)难菌,然后提交上去试溯。如果又推送到了遠程倉庫,處理起來會比較麻煩郊酒。如果遇到這種情況遇绞,可以用以下方法解決:

  1. 在本地master分支上git reset --hard HEAD^,回退這次提交燎窘。
  2. git push -f摹闽,強制推送本地分支到遠端。因為這個時候你的本地分支已經(jīng)落后于遠端分支褐健,如果正常流程git pull付鹿,你的代碼會回到?jīng)_突后的提交狀態(tài),相當于白白reset了代碼蚜迅。如果直接使用git push舵匾,git會提示你本地分支落后于遠端,必須git pull才能推送谁不。使用git push -f坐梯,強制將遠程倉庫的代碼替換為你當前本地分支的代碼,相當于遠端代碼reset回退刹帕。
  3. 再次git merge iss53吵血,將代碼合并回master,解決沖突偷溺,add -> commit -> push蹋辅。

以上方法建立在你的沖突代碼推送到遠端后,你的隊友沒有人再次合并代碼到master并且推送到遠端亡蓉。如果有這種情況晕翠,處理起來會更復雜,因為你的回退,然后強制推送淋肾,會將他們的代碼回退掉硫麻!這時候就需要每一個隊友的共同配合才能解決,異常復雜和麻煩樊卓。所以一定要細心細心再細心拿愧,盡量不要reset

儲藏與清理

有這樣一個場景碌尔,你在你的分支iss54上開發(fā)需求浇辜,改了好多文件代碼,這個時候老大來告訴你唾戚,develop分支上有個地方有問題柳洋,需要你去確認一下。一般這時候你切換分支是無法切換的叹坦,git會提示你先暫存才可以熊镣。但是你暫時又不想提交,因為提交過之后你的修改記錄就沒有了募书,下次再切換回來绪囱,哪些文件調(diào)整過,在IDE里就無法清晰的看到莹捡。這個時候你可以使用git stash相關命令:

  • git stash : 將當前分支的修改先儲存到棧內(nèi)(清理一下工作區(qū))鬼吵,方便切換分支。
  • git stash list : 查看棧內(nèi)儲存列表篮赢。
  • git stash apply : 應用最近的一次儲存齿椅,之前暫存過的文件會回到modified狀態(tài)。
  • git stash apply --index : 恢復到儲存時的狀態(tài)荷逞,包括已經(jīng)暫存的文件狀態(tài)媒咳。
  • git stash apply stash@{2} : 應用指定的儲存粹排。
  • git stash drop stash@{0} : 刪掉棧內(nèi)指定的儲存种远。

思維導圖總結(jié)

gitblog_xmind.png

以上的命令及處理方法基本上已經(jīng)可以滿足日常的開發(fā)了。之前命令行用的少顽耳,都是使用IDE內(nèi)自帶的可視化工具來操作坠敷,雖然比較簡單明了,但速度是無法跟命令行比的射富。不過使用IDE可以方便的切換分支膝迎,拉取遠端分支,提示未解決的沖突等胰耗,日常使用要方便的多限次。推薦兩者結(jié)合著使用,畢竟我們的目的是把工作做好,把任務完成卖漫,在git上不必過分糾結(jié)于過程费尽。

我的博客:leon
參考:git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市羊始,隨后出現(xiàn)的幾起案子旱幼,更是在濱河造成了極大的恐慌,老刑警劉巖突委,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柏卤,死亡現(xiàn)場離奇詭異,居然都是意外死亡匀油,警方通過查閱死者的電腦和手機缘缚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌蚜,“玉大人忙灼,你說我怎么就攤上這事《巯溃” “怎么了该园?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帅韧。 經(jīng)常有香客問我里初,道長,這世上最難降的妖魔是什么忽舟? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任双妨,我火速辦了婚禮,結(jié)果婚禮上叮阅,老公的妹妹穿的比我還像新娘刁品。我一直安慰自己,他們只是感情好浩姥,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布只估。 她就那樣靜靜地躺著,像睡著了一般撩幽。 火紅的嫁衣襯著肌膚如雪职抡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天眯分,我揣著相機與錄音拌汇,去河邊找鬼。 笑死弊决,一個胖子當著我的面吹牛噪舀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼与倡,長吁一口氣:“原來是場噩夢啊……” “哼先改!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒸走,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤仇奶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后比驻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體该溯,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年别惦,在試婚紗的時候發(fā)現(xiàn)自己被綠了狈茉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡掸掸,死狀恐怖氯庆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扰付,我是刑警寧澤堤撵,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站羽莺,受9級特大地震影響实昨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盐固,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一荒给、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刁卜,春花似錦志电、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夺脾,卻和暖如春之拨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咧叭。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烁竭,地道東北人菲茬。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親婉弹。 傳聞我的和親對象是個殘疾皇子睬魂,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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

  • Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來镀赌。這樣一來氯哮,任何一處協(xié)同...
    __silhouette閱讀 15,860評論 5 147
  • Git 命令行學習筆記 Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來...
    sunnyghx閱讀 3,908評論 0 11
  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,458評論 1 26
  • 1商佛,查看所有遠程分支:%git branch -r 2, 拉取遠程分支并創(chuàng)建本地分支git checkout -...
    will666閱讀 2,061評論 0 18
  • 在API21之前我們使用標題欄基本都是在ActionBarActivity的Activity中處理的喉钢,而API21...
    PapiAP閱讀 6,639評論 3 14