Git權(quán)威指南-第2篇-1

標簽: git


[TOC]


1.Git結(jié)構(gòu)

  • 工作區(qū)/工作樹/工作目錄:當(dāng)前Git正在管理的這個文件夾
  • 暫存區(qū)/索引區(qū)/緩存區(qū):stage/index/cache,即工作區(qū)根目錄下的'.git/index'文件
  • 版本庫/本地倉庫/文檔庫:Repository,即工作區(qū)根目錄下的'.git'目錄
  • 遠程倉庫
Git結(jié)構(gòu)圖

2.工作區(qū)目錄追蹤

當(dāng)處于工作區(qū)目錄或子目錄下時养匈,可用下面命令查詢各目錄:

  • 顯示版本庫(.git)位置
$ git rev-parse --git-dir
  • 顯示工作區(qū)根目錄
$ git rev-parse --show-toplevel
  • 顯示當(dāng)前位置相對于工作區(qū)根目錄的相對目錄
$ git rev-parse --show-prefix
  • 顯示從當(dāng)前目錄(cd)后退(up)到工作區(qū)的根的深度
$ git rev-parse --show-cdup
  • 瀏覽暫存區(qū)目錄樹
$ git ls-files
  • 瀏覽HEAD目錄樹
$ git ls-tree HEAD

3.Git配置

Git的配置文件 "INI"格式的枢步。

(1)配置文件及其優(yōu)先級

Git共有3個配置文件债蓝,優(yōu)先級高的配置會覆蓋優(yōu)先級低的配置祝峻。在git config命令中加上配置文件的位置命令標識枯夜,可以配置指定級別的配置文件挺智。默認不加則為 “--global”祷愉。

名稱 優(yōu)先級 命令標識 配置文件位置 別稱
倉庫級 最高 --local 工作區(qū)的".git/config"文件 本地配置文件
全局級 中等 --global 用戶主目錄下的".gitconfig"文件 全局配置文件
系統(tǒng)級 最低 --system "/etc/gitconfig"文件 系統(tǒng)配置文件

(2)常用配置命令

Git的 "config" 命令可根據(jù)指定的配置文件位置標識來配置特定的文件,不指定則默認全局配置赦颇。

$ git config [--local|--global|--system] action

其中"action"可有以下取值(其中的鍵值格式為 "<section>.<key> [value]" ):

  • --get : 獲取鍵的值
  • --add : 添加鍵值
  • --unset : 刪除鍵的值
  • --list, -l : 查看已配置的選項
  • --edit, -e : 直接編輯配置文件

另外二鳄,也可用下面的命令獲取和設(shè)置鍵值(命令中省略了文件位置標識):

  • 獲取鍵值
$ git config <section>.<key>
  • 設(shè)置舊鍵的新值或添加新鍵值
$ git config <section>.<key> value

(3)配置用戶名和密碼

Git中必須配置用戶名和密碼,它們的鍵分別為 "user.name""user.email" 媒怯。

(3)使用"git config"命令操作其他INI文件

  • 設(shè)置鍵值
$ GIT_CONFIG=INI文件名.ini git config <section>.<key> value
  • 讀取鍵值
$ GIT_CONFIG=INI文件名.ini git config <section>.<key>

4.狀態(tài)查看

使用下列命令可以查看文件狀態(tài):

$ git status

加上"-s"選項表示使用精簡模式:

$ git status -s

精簡模式下顯示的文件狀態(tài)中订讼,格式如下:

狀態(tài)標識1狀態(tài)標識2 文件名

其中狀態(tài)標識1和狀態(tài)標識2分別位于第1列和第2列,其含義為:

  • 第一列:"暫存區(qū)"相對于"版本庫"中的文件有改動扇苞,藍色標記
  • 第二列:"工作區(qū)"相對于"暫存區(qū)"中的文件有改動欺殿,紅色標記

每列的標識可取以下值:

  • A: 新增了文件
  • C: 文件的一個新拷貝
  • D: 刪除了文件
  • M: 文件的內(nèi)容或者mode被修改了
  • R: 文件名被修改了
  • T: 文件的類型被修改了
  • U: 文件沒有被合并(你需要完成合并才能進行提交)
  • X: 未知狀態(tài)(很可能是遇到Git的bug了,你可以向git提交bug report)

5.Git工作區(qū)鳖敷、版本庫脖苏、暫存區(qū)原理圖

Git工作區(qū)、版本庫定踱、暫存區(qū)原理圖.png

簡要說明:

  • 圖中左側(cè)為工作區(qū)棍潘,右側(cè)為版本庫。在版本庫中標記為index的區(qū)域是暫存區(qū)崖媚,標記為master的是master分支所代表的的目錄樹亦歉。
  • 圖中的HEAD實際上是指向master分支的一個"游標",所以圖示的命令中出現(xiàn)HEAD的地方可以用master替換至扰。
  • 圖中的objects標識的區(qū)域為Git的對象庫鳍徽,實際位于".git/objects"目錄下。
  • 對工作區(qū)修改或新增的文件執(zhí)行git add命令時敢课,暫存區(qū)的目錄樹將被更新阶祭,同時工作區(qū)修改或新增的文件內(nèi)容會被寫入到對象庫中的一個新的對象中绷杜,而該對象的ID被記錄在暫存區(qū)的文件索引中。
  • 當(dāng)執(zhí)行提交操作(git commit)時濒募,暫存區(qū)的目錄樹會寫到版本庫(對象庫)中鞭盟,master分支會做相應(yīng)的更新,即master最新指向的目錄樹就是提交時原暫存區(qū)的目錄樹瑰剃。
  • 當(dāng)執(zhí)行"git reset HEAD"命令時齿诉,暫存區(qū)的目錄樹會被重寫,會被master分支指向的目錄樹所替換晌姚,但是工作區(qū)不收影響粤剧。
  • 當(dāng)執(zhí)行"git rm --cached <file>"命令時,會直接從暫存區(qū)刪除文件挥唠,工作區(qū)則不會做出改變抵恋。
  • 當(dāng)執(zhí)行"git checkout .""git checkout -- <file>"命令時,會用暫存區(qū)全部的文件或指定的文件替換工作區(qū)的文件宝磨。這個命令會清除工作區(qū)中未添加到暫存區(qū)的改動弧关。
  • 當(dāng)執(zhí)行"git checkout HEAD .""git checkout HEAD <file>"命令時,會用HEAD指向的master分支中的全部或部分文件替換暫存和工作區(qū)中的文件唤锉。這個命令不但會清除工作區(qū)中未提交的改動世囊,也會清除暫存區(qū)中未提交的改動。

6.工作區(qū)窿祥、暫存區(qū)和版本庫之間的差異比較

Git-git diff命令與版本庫關(guān)系圖.png

(1)工作區(qū)與暫存區(qū)比較

$ git diff

(2)工作區(qū)與HEAD比較

$ git diff HEAD

(3)暫存區(qū)與HEAD比較

$ git diff --cached|--staged

7.HEAD與master

  • master:在版本庫的引用目錄(.git/refs)中體現(xiàn)為一個引用文件".git/refs/head/master"株憾,其內(nèi)容就是分支中最新提交的提交ID
  • HEAD:位于版本庫的".git/HEAD"文件,其內(nèi)容指向了"master"晒衩,因此和master是一樣的

8.分支與ID查看

  • 查看當(dāng)前分支
$ git branch
  • 根據(jù)對象SHA1 ID顯示對象信息
$ git cat-file -t|-p|-s "對象ID"
  • 顯示分支對應(yīng)的SHA1 ID
$ git rev-parse "分支名稱(HEAD/master)"

9.重置命令

(1)用法1

不會重置引用号胚,更不會改變工作區(qū),而是用指定提交狀態(tài)下的文件替換掉暫存區(qū)中的文件

$ git reset [-q] [<commit>] [--] <paths>...

<commit>為可選項浸遗,可以首映引用或提交ID猫胁;如果省略則相當(dāng)于使用了HEAD的指向作為提交ID。

(2)用法2

會重置引用跛锌,根據(jù)不同選項弃秆,可以對暫存區(qū)或工作區(qū)進行重置。

$ git reset [--soft|--mixed|--hard|--merge|--keep] [-q] [<commit>]
重置命令與版本庫的關(guān)系.png
  • --soft:執(zhí)行圖中的動作1髓帽,只更改引用的指向菠赚,不改變工作區(qū)和暫存區(qū)
  • --mixed:默認參數(shù),執(zhí)行圖中的動作1郑藏、2衡查。即更改引用的指向并重置暫存區(qū),但不改變工作區(qū)
  • --hard:會執(zhí)行上圖中的全部動作1必盖、2、3,即:
    a.替換引用的指向琉兜。引用指向新的提交ID
    b.替換暫存區(qū)。替換后拍埠,暫存區(qū)的內(nèi)容和引用指向的目錄樹一致
    c.替換工作區(qū)。替換后土居,工作區(qū)的內(nèi)容和暫存區(qū)一致枣购,當(dāng)然同時也和引用指向的目錄樹一致

(3)例子

  • git resetgit reset HEAD:僅用HEAD指向的目錄樹重置暫存區(qū),工作區(qū)不會受到影響擦耀,相當(dāng)于將之前用"git add"命令跟新到暫存區(qū)的內(nèi)容撤出暫存區(qū)棉圈。引用也未改變,因為引用重置到HEAD相當(dāng)于沒有重置
  • git reset -- filenamegit reset HEAD filename:僅將文件filename的改動撤出暫存區(qū)眷蜓,暫存區(qū)中其他文件不改變迄损。相當(dāng)于對命令"git add filename"的反向操作
  • git reset --soft HEAD^:工作區(qū)和暫存區(qū)不改變,但是引用向前回退一次账磺。當(dāng)對最新提交的提交說明或提交的更改不滿意時,撤銷最新的提交以便重新提交
  • git reset --mixed HEAD^:工作區(qū)不改變痊远,但是暫存區(qū)會回退到上一次提交之前垮抗,引用也會回退一次
  • git reset --hard HEAD^:徹底撤銷最近的提交。引用回退到前一次碧聪,而且工作區(qū)和暫存區(qū)都會回退到上一次提交的狀態(tài)冒版。自上一次一來的提交全部丟失。

10.檢出命令

檢出命令會重寫工作區(qū)逞姿。

(1)用法1

$ git checkout [-q] [<commit>] [--] <paths>...

<commit>是可選項辞嗡,如果省略則相當(dāng)于從暫存區(qū)進行檢出。
此種用法不會改變HEAD頭指針滞造,主要用于用指定版本的文件覆蓋工作區(qū)中對應(yīng)的文件续室。如果省略<commit>,則會用暫存區(qū)的文件覆蓋工作區(qū)的文件谒养,否則用指定提交中的文件覆蓋暫存區(qū)和工作區(qū)中對應(yīng)的文件挺狰。
注意:此用法和重置命令大不相同,重置命令默認值是HEAD买窟,而檢出命令默認值是暫存區(qū)丰泊。因此重置一般用于重置暫存區(qū)(除非使用--hard參數(shù),否則不重置工作區(qū))始绍;檢出主要是覆蓋工作區(qū)(如果<commit>不省略瞳购,也會提換暫存區(qū)中相應(yīng)的文件)。

(2)用法2

$ git checkout [<branch>]

此種用法會改變HEAD頭指針亏推。主要是用來切換到分支学赛。如果省略了<branch>則相當(dāng)于對工作區(qū)進行狀態(tài)檢查年堆。

(3)用法3

$ git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]

此種用法主要是創(chuàng)建和切換到新的分支,新的分支從<start_point>指定的提交開始創(chuàng)建罢屈。

(4)例子

檢出命令與版本庫的關(guān)系.png
  • git checkout branch:檢出branch分支嘀韧。會執(zhí)行上圖中的1、2缠捌、3步驟锄贷,并更新HEAD以指向branch分支
  • git checkoutgit checkout HEAD:匯總顯示工作區(qū)、暫存區(qū)與HEAD的差異
  • git checkout -- filename:用暫存區(qū)中的filename文件來覆蓋工作區(qū)中的filename文件曼月。相當(dāng)于取消自上次執(zhí)行"git add filename"以來(如果執(zhí)行過)的本地修改
  • git checkout -- .git checkout .:會取消本地所有的相對于暫存區(qū)的更改谊却,相當(dāng)于用暫存區(qū)的所有文件直接覆蓋工作區(qū)文件。
  • git checkout branch -- filename:維持HEAD的指向不變哑芹。用branch所指向的提交中的filename替換暫存區(qū)和工作區(qū)中的filename文件炎辨。








最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市聪姿,隨后出現(xiàn)的幾起案子碴萧,更是在濱河造成了極大的恐慌,老刑警劉巖末购,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破喻,死亡現(xiàn)場離奇詭異,居然都是意外死亡盟榴,警方通過查閱死者的電腦和手機曹质,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擎场,“玉大人羽德,你說我怎么就攤上這事⊙赴欤” “怎么了宅静?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長站欺。 經(jīng)常有香客問我坏为,道長,這世上最難降的妖魔是什么镊绪? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任匀伏,我火速辦了婚禮,結(jié)果婚禮上蝴韭,老公的妹妹穿的比我還像新娘够颠。我一直安慰自己,他們只是感情好榄鉴,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布履磨。 她就那樣靜靜地躺著蛉抓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剃诅。 梳的紋絲不亂的頭發(fā)上巷送,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音矛辕,去河邊找鬼笑跛。 笑死,一個胖子當(dāng)著我的面吹牛聊品,可吹牛的內(nèi)容都是我干的飞蹂。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼翻屈,長吁一口氣:“原來是場噩夢啊……” “哼陈哑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伸眶,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤惊窖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厘贼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體界酒,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年涂臣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片售担。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡赁遗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出族铆,到底是詐尸還是另有隱情岩四,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布哥攘,位于F島的核電站剖煌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逝淹。R本人自食惡果不足惜耕姊,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望栅葡。 院中可真熱鬧茉兰,春花似錦、人聲如沸欣簇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莫鸭,卻和暖如春闹丐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背被因。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工卿拴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氏身。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓巍棱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛋欣。 傳聞我的和親對象是個殘疾皇子航徙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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