git總結(jié)篇.md

寫(xiě)這個(gè)東西一為了總結(jié)思路,二為了在公司內(nèi)部的講演嘶窄。

耳熟能詳

概念

操作

  • git init
  • git clone
  • git pull
  • git fetch
  • git merge
  • git branch
  • git reset
  • git revert
  • git reflog
  • git log
  • git config

初次見(jiàn)面

設(shè)置賬戶

git config
git config --global user.name "Manjack" user.email "manjack@aobi.com"
就算不加上--global參數(shù)哭廉,也會(huì)設(shè)置到全局變量里脊僚,沒(méi)辦法對(duì)某個(gè)repo設(shè)置name和email。

config文件有三個(gè)層次:

  1. repo層面的遵绰,保存在每個(gè)repo的.git文件夾里
[remote "origin"]
    url = https://github.com/wangshub/wechat_jump_game.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
  1. 用戶層面的辽幌,保存在C:/user/<user-name>/.gitconfig
[user]
    email = exkulo@qq.com
    name = ManjackGo
  1. 系統(tǒng)層面,做一些全局設(shè)定街立,比如<別名><默認(rèn)行為(比如fetch使用merge還是rebase)>C:/ProgramData/git/config

生成sshkey

和服務(wù)器采用非對(duì)稱加密進(jìn)行校驗(yàn)舶衬,需要把公鑰上傳至服務(wù)器自己的賬號(hào)里埠通。使用代碼:

ssh-keygen -t rsa -C "manjack@aobi.com"

三次回車使用默認(rèn)值赎离。公鑰會(huì)保存在:

  • windows C:\Users\<user-name>\.ssh/id_rsa.pub
  • UNIX/MAC ~ /.gitconfig

把文件里的內(nèi)容全選(必須包括最后一行的空行)粘貼到自己gitlab賬戶的ssh密鑰里面,完成配置端辱。

建立一個(gè)repository

一梁剔、自己建立一個(gè)空repo

隨便在某個(gè)文件夾使用git init虽画。可以看到生成了一個(gè).git文件夾荣病。git自動(dòng)幫我們建立了一條叫做master的分支码撰。

二、從網(wǎng)上clone一個(gè)repo

  1. 從網(wǎng)上的repo拿到一個(gè)遠(yuǎn)端網(wǎng)址
  2. 執(zhí)行git clone <url> 可以得到一個(gè)新的repo个盆,并幫我們把url設(shè)置為一個(gè)名字為remote的遠(yuǎn)端脖岛。
    相當(dāng)于執(zhí)行了以下操作:
git remote add remote <url>
git pull

.git文件夾

hooks # 鉤子函數(shù)存放點(diǎn),可使用自己喜歡的腳本寫(xiě)
    |
    pre-commit
    pre-push
info
    |
    exclude # 一個(gè)本地版本的.ignore
objectsm #存放著歷史文件颊亮,包括版本本身柴梆,以及版本對(duì)應(yīng)的文件
    |
    21
    c4
    b5
    ...
refs
    |
    heads
        |
        master
        nb
    remotes
        |
        remote
    tags
        |
        release1.0.0
config
description
HEAD #代表當(dāng)前的版本指向

版本的實(shí)質(zhì)

當(dāng)我們完成一次commit操作,實(shí)質(zhì)上發(fā)生了:

  1. 把當(dāng)前版本變動(dòng)的文件壓縮终惑,產(chǎn)生hash作為名稱
  2. 把這些文件的hash集合起來(lái)绍在,hash一次
  3. 把當(dāng)前狀態(tài)的head進(jìn)行一次哈希,作為本次提交的tree
  4. 給當(dāng)前的提交一個(gè)hash值雹有,作為log的版本號(hào)

以上所有的文件均儲(chǔ)存在object文件里偿渡,文件夾的兩個(gè)字母作為一串hash碼的頭兩個(gè)字母,文件夾里的文件名是hash另外一部分的字符串霸奕。

可以使用git cat-file -p <file-name>來(lái)解壓查看文件溜宽。

(演示ING...)

提交代碼

working, stage, head

解釋...

add

  • git add . 把當(dāng)前目錄的變動(dòng)提交到stage區(qū)
  • git add <file-name>

commit

  • git commit

vim基礎(chǔ)操作
安裝的時(shí)候默認(rèn)使用vim作為編輯器,在這里基本只要知道以下幾個(gè)點(diǎn)就可以用了:

  • i進(jìn)入編輯模式
  • esc退出編輯模式
  • wq保存并退出
  • git commit -m "<message>"
  • git commit --amend <message> 添加本次提交到上一次的提交质帅,并修改上一次提交的log(若沒(méi)有得提交則只改log)

所謂版本坑质,tag,branch

只是一個(gè)代表著某個(gè)版本的字符串临梗。保存在refs里面涡扼,打開(kāi)可以看到所對(duì)應(yīng)的字符串。所謂的撤回操作盟庞,就是返回到某個(gè)版本吃沪。而HEAD代表著當(dāng)前工作目錄所對(duì)應(yīng)的分支或者版本。
(展示HEAD什猖,展示refs)

撤回操作

svn中的revert

  • 對(duì)工作區(qū)
    也就把工作區(qū)的變動(dòng)回復(fù)到head的狀態(tài)票彪,采用以下代碼:
    git reset --hard HEAD~0
    (解釋--hard --soft的區(qū)別),把目標(biāo)目錄變成某個(gè)版本的樣子不狮, ~0表示版本
  • 對(duì)某個(gè)文件
    git reset --hard HEAD

git reset
把當(dāng)前head以及HEAD指向某個(gè)版本降铸,把后面的版本摒棄。(摒棄不意味著消失摇零,git的一切提交都不會(huì)消失推掸,只是變成了難以再獲取到的孤魂野鬼)。HEAD~1代表上一個(gè)版本。
注意:
當(dāng)HEAD是合并而來(lái)的版本的時(shí)候谅畅,HEAD~1代表當(dāng)前分支的父節(jié)點(diǎn)登渣,HEAD^1代表另一分支的父節(jié)點(diǎn)

黃金法則 GOLDEN RULE
不要在公共的分支上(已經(jīng)在服務(wù)器上存在的分支)進(jìn)行reset操作。

svn中的update to revision

svn中我們使用這種方法來(lái)檢出過(guò)去的代碼毡泻,在git中使用:
git checkout <commit>就可以把工作區(qū)checkout到這個(gè)狀態(tài)胜茧。
注意:此時(shí)處于一個(gè)dettached head狀態(tài)。
非大陸版本翻譯為“斷頭狀態(tài)”仇味。HEAD一般是指向refs/heads中的某個(gè)文件(這些文件又會(huì)指向某個(gè)版本)呻顽,成為attched head狀態(tài),而當(dāng)checkout為某個(gè)版本的時(shí)候丹墨,HEAD會(huì)顯示為某個(gè)版本號(hào)芬位。成為斷頭。

當(dāng)你需要在checkout出來(lái)的版本工作
斷頭狀態(tài)下所有的提交均不屬于任何分支带到,屬于無(wú)效提交昧碉。當(dāng)需要在這個(gè)狀態(tài)下工作時(shí),最好建立一個(gè)新的分支來(lái)工作揽惹,最后再合并到目標(biāo)分支被饿。

git revert

同樣用于撤銷操作,需要和svn中作出區(qū)分搪搏。這是一個(gè)安全的操作狭握,可以用于已經(jīng)共享的分支。具體操作相當(dāng)于找到某個(gè)版本的changeset疯溺,逆之论颅,然后作為一次新的commit提交。相當(dāng)于幫我們手工做了一次改錯(cuò)囱嫩。
使用方法git revert <commit>恃疯。

必學(xué)時(shí)光回溯大法

任何想好好實(shí)用git的人都必須學(xué)會(huì)這一節(jié)。
當(dāng)我們執(zhí)行reset之后墨闲,hard模式下三個(gè)tree都會(huì)退回到你的目標(biāo)版本今妄,此時(shí)執(zhí)行git log,是看不到被reset掉后面的版本的鸳碧,就好像什么都沒(méi)發(fā)生過(guò)一樣盾鳞。這樣子當(dāng)自己手賤不小心reset掉自己需要的代碼了,豈不是要捶胸頓足瞻离?
不用怕腾仅,之前就講過(guò),git是一個(gè)永遠(yuǎn)都不會(huì)丟失提交的vcs套利,只要是提交過(guò)的推励,都能找回鹤耍。這個(gè)時(shí)候需要一個(gè)神器了,那就是reflog吹艇。讓我們輸入reflog,可以看到如下的東西:

$git reflog
c75dc97 (HEAD -> nb) HEAD@{0}: reset: moving to HEAD~1
c1998f3 (master) HEAD@{1}: checkout: moving from master to nb
c1998f3 (master) HEAD@{2}: commit: add the first line
c75dc97 (HEAD -> nb) HEAD@{3}: commit (initial): commit first

可以看到最上面reset了一個(gè)版本“悍鳎現(xiàn)在我們突然想要前面的某個(gè)版本了受神,直接執(zhí)行
git checkout HEAD@{n}就可回到任意版本,復(fù)制出你要的文件然后回到最新版本復(fù)制回去格侯,或者新開(kāi)分支工作都可以, whatever you like鼻听。

令人激動(dòng)的分支操作

基于版本的分支。

查看

查看分支联四,帶星號(hào)的為當(dāng)前所處分支git branch
查看遠(yuǎn)端分支git branch -r

切換分支

git checkout <branch> 實(shí)質(zhì)上是改變了HEAD的指向撑碴。

新建分支

git branch <branch>
git checkout -r <branch> 新建分支并切換過(guò)去

刪除分支

git branch -d <branch> 安全刪除分支,必須在被合并之后才允許刪除
git branch -D <branch> 強(qiáng)行刪除分支

merge

把一堆操作集合起來(lái)作為一個(gè)merge commit朝墩,會(huì)自動(dòng)處理好歷史醉拓。
操作步驟:

  1. 切換到當(dāng)前分支git checkout <master-branch>
  2. 合并 git merge <feature-branch>

rebase

換基。同樣需要尊崇黃金法則收苏,不能更改公共分支亿卤。
直接把整條分支的起點(diǎn)挪到源分支的head處。在公共分支使用容易引起冗余changeset鹿霸。(選擇性講解排吴,看時(shí)間)

rebase和merge的區(qū)別

...

遠(yuǎn)端操作

存放在refs/remotes文件夾下

新建立遠(yuǎn)端

git remote add <remote-name> <remote-url>一般起名字為origin,跟著git的標(biāo)準(zhǔn)寫(xiě)懦鼠。

刪除遠(yuǎn)端

git remote remove <remote-name>

rename

就叫rename git remote rename <old> <new>

pull

相當(dāng)于fetch + merge/rebase
git pull <remote-name> 當(dāng)加上--rebase標(biāo)志時(shí)表示使用rebase钻哩,一般由于是公共分支,不要這么搞比較好肛冶。

push

把所有的commit提交到服務(wù)器
git push <remote-name> [--force]

別名

允許我們自定義別名街氢,比如使用decompress來(lái)代表解壓操作,那么
git config --global alias.decompress "cat-file -p" 既可睦袖。

hook

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阳仔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扣泊,更是在濱河造成了極大的恐慌近范,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件延蟹,死亡現(xiàn)場(chǎng)離奇詭異评矩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)阱飘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)斥杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)虱颗,“玉大人,你說(shuō)我怎么就攤上這事蔗喂⊥妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵缰儿,是天一觀的道長(zhǎng)畦粮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乖阵,這世上最難降的妖魔是什么宣赔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮瞪浸,結(jié)果婚禮上儒将,老公的妹妹穿的比我還像新娘。我一直安慰自己对蒲,他們只是感情好钩蚊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蹈矮,像睡著了一般两疚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上含滴,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天诱渤,我揣著相機(jī)與錄音,去河邊找鬼谈况。 笑死勺美,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碑韵。 我是一名探鬼主播赡茸,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祝闻!你這毒婦竟也來(lái)了占卧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤联喘,失蹤者是張志新(化名)和其女友劉穎华蜒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豁遭,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叭喜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓖谢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捂蕴。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡譬涡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啥辨,到底是詐尸還是另有隱情涡匀,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布溉知,位于F島的核電站陨瘩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏着倾。R本人自食惡果不足惜拾酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一燕少、第九天 我趴在偏房一處隱蔽的房頂上張望卡者。 院中可真熱鬧,春花似錦客们、人聲如沸崇决。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恒傻。三九已至,卻和暖如春建邓,著一層夾襖步出監(jiān)牢的瞬間盈厘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工官边, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沸手,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓注簿,卻偏偏與公主長(zhǎng)得像契吉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诡渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • git常用命令 GIT常用命令備忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章閱讀 8,456評(píng)論 1 26
  • 上個(gè)星期劉潤(rùn)在得到上做的直播捐晶,這幾天一直在劉潤(rùn)的微信公眾號(hào)上更新,今天剛好更新完妄辩,以下是這幾天更新整理后的文檔惑灵。...
    leank閱讀 165評(píng)論 0 0
  • 首先我們來(lái)解剖一下早讀這兩個(gè)字吧,早讀早讀直觀為早上讀書(shū)眼耀,但在我這里早讀這兩個(gè)字有著不一樣的涵義泣棋。那么下面就讓我...
    Yin印子閱讀 373評(píng)論 0 2
  • 一時(shí)間:三個(gè)月 20161210~20170309 二、目標(biāo): 1. 在紅塵中祈求三寶的好好修行畔塔,慈悲喜舍潭辈,隨時(shí)給...
    郁郁紅花閱讀 156評(píng)論 0 0
  • 感恩孩子們的認(rèn)真鸯屿,努力的寫(xiě)暑假作業(yè),中午還幫忙學(xué)做飯把敢,洗碗寄摆,擦桌子,孩子們長(zhǎng)大了修赞,懂事了婶恼。 感恩公公一...
    南飛雁_d159閱讀 279評(píng)論 0 0