Git學習筆記

概述

Git是一個用來做代碼管理和版本控制的工具。

參考教程

《Git權威指南》,機械工業出版社,蔣鑫。

如有理解錯誤,歡迎指正。

總覽


版本控制工具的發展

1.diff和patch。

2.CVS。

3.SVN。

4.Git。

Git初始化

git配置文件位置。

? - 全局配置:/etc/gitconfig

? - 個人配置:~/.gitconfig

? - 具體Git庫配置:/path/to/repo/.git/config

使用git config配置用戶名和郵箱,--global表示當前用戶。

git config --global user.name "Ruochen Xu"

git config --global user.email "ruochen.xu@aorise.com"

使用git config配置操作別名,可以讓指令變短,--system表示所有用戶。

git config --system alias.st status

注意:git config后的配置項都以a.b的形式表示。使用--unset刪除配置。

使用git init創建空的本地git庫,創建完成后,在庫目錄下有一個.git文件夾,里面存儲了與本git庫相關的所有信息。

cd /path/to/my/workspace

git init demo

生成一個新文件,并使用git add加入暫存區,然后使用git commit作一次的提交。

提交可以看做是一個確認的代碼改動。

cd demo

echo "Hello." > readme.md

git add readme.md

git commit -m "Initialize.”

Git對象

Git中每個文件、每次提交、每個目錄樹等信息,都是以git對象的形式存儲在庫的.git/objects目錄下的。每個git對象都有一個40位的SHA1哈希值,存儲時前兩位作為目錄名,后38位作為文件名。

git cat-file -t <hash> # 查看git對象類型

git cat-file -p <hash> # 查看git對象內容

Git分支

Git進行第一次提交后,會自動生成第一個分支,也是默認分支,名稱為master

每次git commit提交都可以看做是一個點,相鄰的提交之間有邊相連,git每個提交都是增量的。每個提交都對應有一個文件目錄樹,代表的是從第一次提交開始到該提交結束,庫中的文件。

每個分支就是一個指向某個提交的指針,代表著從第一次提交開始到該提交結束所有的文件變化歷程。每個分支應當有一個獨有的名字,HEAD表示當前正在操作的提交。

新的提交只能在某個分支上進行,即HEAD指針停留在某個分支指針上,而不能在任意提交上進行。

新分支可以從某個提交處產生,舊分支也可以與別的分支合并然后刪除。所以所有的提交構成一張圖。

Git的分支信息都存儲在庫的.git/refs/heads目錄下,庫的.git/HEAD文件存儲HEAD指針的信息,庫的.git/logs/refs/heads目錄下記錄了分支的變化歷史。

Git提交的相對訪問

^,父提交,^2,第二個父提交,例如HEAD^2。

~n,第n個祖先提交,例如HEAD~5。

^{tree},提交所對應的目錄樹,例如HEAD^{tree}。

:path/to/file,提交所對應的目錄樹中的文件,例如HEAD:path/to/file,不帶分支名時指的是暫存區中的文件。

Git分支操作

分支移動。

git commit # 進行一次提交并將當前分支移動到新的提交

git reset <commit> # 將當前分支移動到指定提交

分支查看。

git branch -a

HEAD指針切換。

git checkout <commit>

從當前位置創建新分支。

git checkout -b <branch>

分支合并。

git merge <commit>

分支刪除。

git branch -d <branch>

Git庫類型

Git庫主要分為三種類型。

1.bare,可讀寫的主庫,一般放在遠端服務器上,并設置成不能撤銷寫入的模式。不能在bare庫本地直接對bare庫進行操作。

2.mirror,可讀不可寫的bare庫鏡像,一般放在遠端服務器上,也可以放在開發機上。可以在mirror庫本地操作其與bare庫進行同步。

3.local,可以任意操作的本地庫,放在開發機上。可以與遠端的bare、mirror庫進行交互操作。

Git庫的常規操作流程

1.使用git clone克隆遠端bare庫或者mirror庫到本地,此時遠端bare庫默認使用origin這個名稱。也可以使用git remote add將本地已初始化的庫關聯到遠端bare庫或者mirror庫。

git clone git@github.com:hnxuruochen/test.git

git remote add origin git@github.com:hnxuruochen/test.git

注意:每個local庫都可以有任意多個遠端關聯庫,用不同的名稱區分,origin是默認名稱。

2.使用git pull將遠端bare或者mirror庫的指定分支的最新改動拉到本地當前分支。如果分支之間有沖突則需要進行沖突解決和分支合并。

git pull = git fetch + git merge

git pull origin <branch>

3.使用git push將本地庫的當前分支的最新改動推到遠端bare庫的指定分支。如果分支之間有沖突則需要先通過git pull解決沖突并合并分之后,才能繼續push。

git push origin <branch>

團隊一般通過一個bare庫,每人一個local庫的方式進行合作開發。

Git文件區

Git庫本地分為三個文件區。

1.工作區。存放本地文件的文件系統,對文件的改動都是在工作區完成的。

2.暫存區。用于記錄和追蹤文件狀態的臨時區,庫的.git/index記錄的就是暫存區的目錄樹。

3.版本庫。存放確定文件改動的庫。所有的提交、分支都是在版本庫中的,bare、mirror庫與local庫的交互實際上是版本庫的交互。

提交文件只能從工作區到暫存區,或者暫存區到版本庫。還原文件只能從版本庫到暫存區,或者暫存區到工作區。不能跨區操作。

文件區之間的操作

文件狀態。

git status

文件比較。

git diff # 比較工作區與暫存區

git diff HEAD # 比較工作區與版本庫中的當前提交

git diff --cached?HEAD # 比較暫存區與版本庫中的當前提交

文件提交。

git add?<file> # 從工作區到暫存區

git commit # 從暫存區到版本庫的新提交

文件還原。

git checkout -- <file> # 從暫存區到工作區

git reset HEAD # 從版本庫中的當前提交到暫存區

git checkout HEAD <file> # 從版本庫中的當前提交到暫存區再到工作區

文件刪除。

git rm <file> # ?刪除工作區和暫存區中的文件

git rm --cached <file> # 只刪除暫存區的文件

git clean # 刪除工作區中未加入版本庫的文件

Git存放處

Git還有一個特殊的文件區叫做stash,是用來臨時存放當前工作區和暫存區的改動的。

每次存放相當于是作了一次不被實際應用的提交,然后記錄在庫的.git/refs/stash中,存放的變化存放在庫的.git/logs/refs/stash中。

存儲并撤銷當前工作區和暫存區的改動。

git stash

恢復工作區和暫存區的改動。

git stash pop

查看所有存放的改動。

git stash list

Git里程碑

Git里程碑是人為對提交進行的命名。里程碑相關信息存儲在庫的,git/refs/tags目錄下。

里程碑分類

1.輕量級里程碑,創建時使用-l參數。該里程碑本質上是一個提交,但是沒有創建者信息。

2.帶說明的里程碑,創建時使用-a或-m參數。該里程碑式一個tag對象。

3.帶簽名的里程碑,創建時使用參數-s或者-u。該里程碑也是一個tag對象,還添加了GnuPG簽名。

里程碑操作

顯示里程碑。

git tag

創建里程碑。

git tag <name>

刪除里程碑。

git tag -d <name> # 刪除本地

git push <remote> :<name> # 刪除遠程

推送里程碑。

git push <remote> <name>

Git子模塊

Git庫可以將其他git庫作為子模塊引入。

創建子模塊。

git submodule add <repo_path> <submodule_path>

初始化子模塊。

git submodule init

更新子模塊。

git submodule update

查看子模塊。

git submodule status

其他

文件忽略

可以通過編輯.gitignore文件來讓git忽略一些僅在工作區中的文件,.gitignore文件可以放在任意目錄下,對當前目錄和子目錄生效。

一些復雜的分支操作

git cherry-pick,將指定提交的增量改動應用到當前提交上。

git rebase,將指定的一段連續的增量提交應用到指定提交上。

git revert,使用一個新提交的方式撤銷上一個提交的內容。

文件追溯

git blame指令可以追溯一個文件的改動歷史信息。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容

  • Git教程 一、Git簡介 1.1. Git的誕生1.2.集中式的vs分布式 二、安裝Git 三、創建版本庫 四、...
    曹淵說創業閱讀 959評論 0 2
  • 五、圖 圖是比較復雜的數據結構,它由頂點和頂點之間的弧組成。任何兩個頂點之間都可能存在弧,利用計算機存儲圖的完整信...
    MinoyJet閱讀 252評論 0 1
  • 醇香綿長的父愛滋味,像一杯美酒,在上世紀八十年代初期,熠熠生輝,溫暖著我懵懂無知的青春。那滋味,盤桓在心底,盤桓在...
    田園執筆閱讀 263評論 0 0
  • 最近考慮要買房子,壓力很大,壓力有三:其一,通過信用卡套現和東拼西湊得來的15萬,如果首付兩成,剛剛好做為首付,但...
    小小牽牛花兒閱讀 327評論 1 2