精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

您有一篇Git 原理,請(qǐng)注意查收

開(kāi)發(fā) 項(xiàng)目管理
Git是一種用于源代碼管理的工具。它是一個(gè)免費(fèi)且開(kāi)源的版本控制系統(tǒng),用于高效地處理從小型到非常大型的項(xiàng)目。Git用于跟蹤源代碼的更改,使多個(gè)開(kāi)發(fā)人員能夠共同在非線性開(kāi)發(fā)中合作。Git是由Linus Torvalds于2005年為L(zhǎng)inux內(nèi)核的開(kāi)發(fā)而創(chuàng)建的。

前言

作為一個(gè)新時(shí)代的開(kāi)發(fā)者,想必大家在工作中,有一樣?xùn)|西是和大家「形影不離」的。那就是git。(當(dāng)然,這里也有個(gè)例,如果大家項(xiàng)目還停留在svn階段,就算我剛才的話唐突了)。

無(wú)論大家平時(shí)是喜歡在命令行中手搓git命令,還是利用git可視化工具(SourceTree)進(jìn)行代碼管理。終究都逃不過(guò),add/commit/merge/push等命令的支配。所以,今天我們來(lái)聊聊,在進(jìn)行這些命令的時(shí)候,在最底層到底發(fā)生了啥。

還有一點(diǎn),也算是一個(gè)認(rèn)知提升吧。需要和大家嘮叨一下,以后遇到比較棘手的問(wèn)題,可以往這方面來(lái)靠攏

所有軟件的底層實(shí)現(xiàn)都是「操作和管理數(shù)據(jù)」。

無(wú)論是我們平時(shí)用到的桌面程序,亦或是在命令行中進(jìn)行敲敲打打處理一些特定的操作,還有就是我們熟悉的編程開(kāi)發(fā)中,無(wú)論是前端的開(kāi)發(fā)過(guò)程中,使用原生也好,各種框架也罷,最后的根結(jié)都是數(shù)據(jù)的羅列和排布;還是后端就更明顯了,有SQL的操作,那就更是再「玩弄」數(shù)據(jù)。 之所以我們看到的現(xiàn)象有些不同,無(wú)非就是數(shù)據(jù)的表現(xiàn)形式和處理方式的不同。可以說(shuō),在編程界,--「萬(wàn)物皆數(shù)據(jù)」。

這里簡(jiǎn)單舉一個(gè)例子,日歷大家都見(jiàn)過(guò)哇。

如果,給我們一個(gè)需求,要讓我們實(shí)現(xiàn)一個(gè)飛書(shū)日歷或者google 日歷的開(kāi)發(fā)任務(wù),我們是不是一時(shí)感覺(jué)到無(wú)法下手。

那我們往「萬(wàn)物皆數(shù)據(jù)」這個(gè)定論上靠,那是不是每一個(gè)「日程」(無(wú)論是簡(jiǎn)單日程還是重復(fù)日程),它們本質(zhì)上就是在每個(gè)小格子上展示。無(wú)非就是有的日程在單個(gè)格子上,有的日程是跨格子。 而針對(duì)這種情況,是不是就是在當(dāng)前視圖中,我們需要維護(hù)一個(gè)數(shù)組,而這個(gè)數(shù)組中的項(xiàng)就是每個(gè)格子的示例。(針對(duì)月視圖/周視圖/日視圖的數(shù)據(jù),其實(shí)都是一套,只不過(guò)在框架內(nèi)部為我們提供了各自的展示邏輯)

這是一個(gè)開(kāi)源的日歷庫(kù)(FullCalendar)。

圖片圖片

而下面的events就是我們?cè)谌諝v上顯示的日程信息。

圖片圖片

好了,天不早了,干點(diǎn)正事哇。

我們能所學(xué)到的知識(shí)點(diǎn)

  1. 前置知識(shí)點(diǎn)
  2. git init
  3. 新增一個(gè)文件
  4. git commit
  5. 新增修改
  6. 創(chuàng)建分支
  7. 分支切換
  8. 分支合并
  9. 遠(yuǎn)程提交

1. 前置知識(shí)點(diǎn)

「前置知識(shí)點(diǎn)」,只是做一個(gè)概念的介紹,不會(huì)做深度解釋。因?yàn)椋@些概念在下面文章中會(huì)有出現(xiàn),為了讓行文更加的順暢,所以將本該在文內(nèi)的概念解釋放到前面來(lái)。「如果大家對(duì)這些概念熟悉,可以直接忽略」同時(shí),由于閱讀我文章的群體有很多,所以有些知識(shí)點(diǎn)可能「我視之若珍寶,爾視只如草芥,棄之如敝履」。以下知識(shí)點(diǎn),請(qǐng)「酌情使用」。

什么是git

Git是一種用于源代碼管理的工具。它是一個(gè)免費(fèi)且開(kāi)源的版本控制系統(tǒng),用于高效地處理從小型到非常大型的項(xiàng)目。Git用于跟蹤源代碼的更改,使多個(gè)開(kāi)發(fā)人員能夠共同在非線性開(kāi)發(fā)中合作。Git是由Linus Torvalds于2005年為L(zhǎng)inux內(nèi)核的開(kāi)發(fā)而創(chuàng)建的。

集中式管理

在使用Git之前在維護(hù)代碼之前,團(tuán)隊(duì)合作的模式如下:

  • 開(kāi)發(fā)人員過(guò)去會(huì)將他們的代碼提交到「中央服務(wù)器」,而沒(méi)有自己的副本。
  • 對(duì)源代碼所做的任何更改對(duì)其他開(kāi)發(fā)人員來(lái)說(shuō)都是「未知的」。
  • 沒(méi)有任何開(kāi)發(fā)人員之間的溝通。

圖片圖片

它的典型代表為SVN

分布式管理

  • 每個(gè)開(kāi)發(fā)人員都在其本地系統(tǒng)上擁有「完整的代碼副本」。
  • 對(duì)源代碼所做的任何更改都可以「被其他人跟蹤」。
  • 開(kāi)發(fā)人員之間有定期的溝通。

圖片圖片

毋庸置疑,git是這方面的王者。

git基礎(chǔ)概念
  • workspace:是本地項(xiàng)目的工作目錄,屬于「本地代碼發(fā)生更新但尚未執(zhí)行 git add 命令時(shí)的狀態(tài)」,working tree的狀態(tài)也隨之更新
  • index:是索引文件,它是連接working tree和commit的橋梁,每當(dāng)我們使用git add命令來(lái)登記后,index file的內(nèi)容就會(huì)改變,此時(shí)index file就和working tree同步了。
  • 它還有一個(gè)家喻戶(hù)曉的名字 -「暫存區(qū)」
  • local repository:是「本地倉(cāng)庫(kù)」,當(dāng)我們使用git commit命令提交最新代碼時(shí),代碼才真正進(jìn)入git倉(cāng)庫(kù)。
  • git commit -m “xxx” 就是「將 index 里的內(nèi)容提交到本地倉(cāng)庫(kù)中」

  • remote repository:是「遠(yuǎn)程倉(cāng)庫(kù)」,當(dāng)我們使用git push命令時(shí)就會(huì)將本地倉(cāng)庫(kù)的代碼上傳至遠(yuǎn)程倉(cāng)庫(kù),完成整個(gè)代碼的上傳工作

圖片圖片

git init --bare VS git init

git init --bare 和 git init 是兩種不同的Git初始化命令,它們用于創(chuàng)建不同類(lèi)型的Git倉(cāng)庫(kù)。

下面是它們之間的主要區(qū)別:

  1. 「?jìng)}庫(kù)類(lèi)型」:
  • git init: 這個(gè)命令用于創(chuàng)建一個(gè)「標(biāo)準(zhǔn)的Git工作目錄倉(cāng)庫(kù)」。它會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè).git子目錄,其中「包含Git的版本控制文件和歷史記錄」(這是我們這篇文章的重點(diǎn))。這種類(lèi)型的倉(cāng)庫(kù)通常用于開(kāi)發(fā)和維護(hù)代碼。
  • git init --bare: 這個(gè)命令用于創(chuàng)建一個(gè)"裸"(bare)倉(cāng)庫(kù),它不包含工作目錄。這意味著它只包含Git版本控制的文件和歷史記錄,「沒(méi)有實(shí)際的項(xiàng)目文件」。"裸"倉(cāng)庫(kù)通常用作「中央版本庫(kù)」,用于協(xié)作和共享代碼。
  1. 「默認(rèn)分支」:
  • git init 默認(rèn)創(chuàng)建一個(gè)帶有master分支的工作目錄倉(cāng)庫(kù)。

  • git init --bare 默認(rèn)不創(chuàng)建分支,因?yàn)槁銈}(cāng)庫(kù)不包含工作目錄。我們需要手動(dòng)創(chuàng)建和設(shè)置分支。

一般情況下,如果我們需要?jiǎng)?chuàng)建一個(gè)新的Git倉(cāng)庫(kù)用于開(kāi)發(fā)和維護(hù)代碼,我們應(yīng)該使用 git init。如果我們需要?jiǎng)?chuàng)建一個(gè)中央版本庫(kù)用于團(tuán)隊(duì)協(xié)作和共享代碼,我們可以考慮使用 git init --bare。

Hook

鉤子(Hooks)是一種通用概念,通常用于「在特定事件發(fā)生時(shí)觸發(fā)自定義代碼」。雖然不是編程語(yǔ)言本身的一部分,但編程語(yǔ)言和開(kāi)發(fā)工具通常提供一些機(jī)制來(lái)支持編寫(xiě)和使用鉤子。

下面我們簡(jiǎn)單介紹幾種大家比較常見(jiàn)的利用Hook概念的技術(shù)。

名稱(chēng)

描述

示例語(yǔ)法

Git Hooks

Git 允許在代碼倉(cāng)庫(kù)的特定事件上運(yùn)行自定義腳本。事件包括提交、推送、合并等。

使用 Bash 腳本編寫(xiě),如 pre-commitpost-commit 等。

JavaScript Hooks

JavaScript 用于前端和后端開(kāi)發(fā),事件處理程序在特定事件發(fā)生時(shí)執(zhí)行自定義 JavaScript 代碼。

前端中,事件處理程序如事件監(jiān)聽(tīng)器。后端中,使用 EventEmitter 模塊。

React Lifecycle Hooks

React 用于構(gòu)建用戶(hù)界面,包括生命周期方法,允許在組件的不同生命周期階段運(yùn)行自定義代碼。

生命周期方法如 componentDidMount 和 componentWillUnmount

當(dāng)然,還有甚囂塵上的針對(duì)函數(shù)組件的React Hook

GitHub Webhooks

GitHub 提供 Webhooks,是 HTTP 回調(diào),用于在存儲(chǔ)庫(kù)的特定事件上觸發(fā)自定義操作。

開(kāi)發(fā)者編寫(xiě) Webhook 處理程序響應(yīng)事件,配置 Webhook URL。

Jenkins Pipeline Hooks

Jenkins 是一個(gè)持續(xù)集成工具,允許創(chuàng)建自定義流水線腳本。使用鉤子定義流水線的階段和操作。

鉤子嵌入到 Jenkinsfile 中以定義流水線。

Git Hook

Git Hook是一種非常強(qiáng)大的Git自定義「腳本系統(tǒng)」,它允許我們?cè)贕it版本控制過(guò)程的不同階段執(zhí)行自定義操作。這些操作可以是自動(dòng)化測(cè)試、代碼格式化、驗(yàn)證提交消息格式、預(yù)防性錯(cuò)誤檢查等等。Git hooks是一種強(qiáng)大的自定義工具,可以提高代碼質(zhì)量和協(xié)作效率。

  1. 「Git Hook的種類(lèi)」: Git提供了多種不同類(lèi)型的Hook,每種類(lèi)型對(duì)應(yīng)著Git操作的不同階段。以下是一些常見(jiàn)的Git掛鉤類(lèi)型:

「pre-commit」:在執(zhí)行實(shí)際提交之前運(yùn)行,用于執(zhí)行「預(yù)提交檢查」。

「pre-push」:在執(zhí)行實(shí)際推送之前運(yùn)行,用于「驗(yàn)證推送到遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容」。

「pre-receive」:在接收端執(zhí)行,通常用于「驗(yàn)證推送到遠(yuǎn)程倉(cāng)庫(kù)的提交」。

「post-receive」:在接收端執(zhí)行,通常用于「通知或自動(dòng)化部署」。

  1. 「Hook的位置」: 每個(gè)Git存儲(chǔ)庫(kù)都有一個(gè).git/hooks目錄,其中包含用于存儲(chǔ)各種Hook腳本的文件。當(dāng)我們?cè)诖鎯?chǔ)庫(kù)中運(yùn)行g(shù)it init時(shí),Git會(huì)為我們創(chuàng)建示例Hook文件,我們可以根據(jù)需要編輯或替換它們。這些示例文件以.sample為擴(kuò)展名。
  2. 「編寫(xiě)Git Hook」: 要編寫(xiě)Git Hook,我們只需創(chuàng)建一個(gè)可執(zhí)行的腳本文件并將其放入.git/hooks目錄中。腳本的名稱(chēng)必須與hook類(lèi)型相匹配(例如,pre-commit)。在腳本中,我們可以執(zhí)行任何自定義操作,例如檢查代碼、驗(yàn)證提交消息、運(yùn)行測(cè)試等。

git diff

git diff命令后通常需要跟兩個(gè)參數(shù),參數(shù)1是要比較的舊代碼,參數(shù)2是要比較的新代碼。如果只寫(xiě)一個(gè)參數(shù),表示默認(rèn)跟 workspace 中的代碼作比較。

?

git diff 顯示的結(jié)果為「第二個(gè)參數(shù)所指的代碼在第一個(gè)參數(shù)所指代碼基礎(chǔ)上的修改」

?

  • git diff:查看 workspace 與 index 的差別
  • git diff --cached:查看 index 與 local repositorty 的差別
  • git diff HEAD:查看 workspace 和 local repository 的差別

HEAD 指向的是 local repository 中的代碼最新提交版本

  • git diff HEAD^ 是比較 workspace 與最新commit的前一次commit的差異,與git diff HEAD的是不同的
  • git diff HEAD~2 是比較 workspace 與上2次commit的差異,相當(dāng)于 git diff HEAD~2 HEAD~0,注意兩個(gè)HEAD的位置,diff顯示的結(jié)果表示 參數(shù)2(HEAD~0) 相對(duì)于參數(shù)1(HEAD~2)的修改

git 別名

在Git中,別名(Git Aliases)是一種機(jī)制,允許我們?yōu)槌S玫腉it命令或命令序列創(chuàng)建簡(jiǎn)短的自定義命令。別名使我們可以用更短、更易記的名稱(chēng)來(lái)執(zhí)行常用的Git操作,提高工作效率。

「1. 創(chuàng)建別名:」 我們可以使用git config命令來(lái)創(chuàng)建Git別名。

git config --global alias.<alias-name> <git-command-or-sequence>
  • <alias-name>:自定義別名的名稱(chēng),我們可以選擇任何喜歡的名稱(chēng)。
  • <git-command-or-sequence>:要與別名關(guān)聯(lián)的Git命令或命令序列。

「2. 例子:」 以下是一些Git別名的例子:

git config --global alias.co checkout        # 創(chuàng)建 'co' 別名來(lái)代替 'checkout'
git config --global alias.br branch          # 創(chuàng)建 'br' 別名來(lái)代替 'branch'
git config --global alias.ci commit          # 創(chuàng)建 'ci' 別名來(lái)代替 'commit'
git config --global alias.st status          # 創(chuàng)建 'st' 別名來(lái)代替 'status'
git config --global alias.unstage 'reset HEAD --'  # 創(chuàng)建 'unstage' 別名來(lái)取消暫存

「3. 使用別名:」 創(chuàng)建別名后,我們可以在命令行中使用它們。例如,使用上面的例子,我們可以這樣執(zhí)行命令:

git co my-branch     # 等同于 'git checkout my-branch'
git br -a            # 等同于 'git branch -a'
git ci -m "Message"  # 等同于 'git commit -m "Message"'
git st               # 等同于 'git status'
git unstage file.txt # 等同于 'git reset HEAD -- file.txt'

從基本層面上說(shuō),Git只是一堆「通過(guò)文件名相互關(guān)聯(lián)的文本文件」。

還有一點(diǎn)需要提前聲明,如果大家也在自己的電腦中進(jìn)行實(shí)驗(yàn),下面文章中出現(xiàn)的各種hash值,都是和內(nèi)容有關(guān)系。所以,大家要和自己的內(nèi)容對(duì)號(hào)入座,不要和本文中的hash值比較。

2. git init

為了演示方便,我們?cè)诒镜氐暮线m的文件夾中新建了一個(gè)dot_git的項(xiàng)目。

mkdir dot_git

與此同時(shí)通過(guò)git init來(lái)初始化項(xiàng)目。

圖片圖片

現(xiàn)在讓我們來(lái)看看.git文件夾中有什么內(nèi)容。

我們使用erd來(lái)查看文件結(jié)構(gòu)。

erd -y inverted .git

文檔結(jié)構(gòu)如下

圖片圖片

看起來(lái)它創(chuàng)建了一堆文件和文件夾。讓我們挑幾個(gè)重要的來(lái)解釋一下:

  • hooks包含了在Git執(zhí)行任何操作之前/之后可以運(yùn)行的腳本。
  • HEAD 指向的是 local repository 中的代碼最新提交版本

根據(jù)我們?cè)O(shè)置的“默認(rèn)”分支是什么(git config --global init.defaultBranch <分支名稱(chēng)>),它將是refs/heads/master(默認(rèn)),refs/heads/main,或者我們?cè)O(shè)置的其他分支名稱(chēng)。


圖片圖片

「它指向了refs/heads文件夾」,并指向一個(gè)叫做master的文件,這個(gè)文件在我們進(jìn)行第一次提交之前是不存在的。

這個(gè)master文件「只會(huì)在我們進(jìn)行第一次提交后出現(xiàn)」。

  • config是一個(gè)「文本文件」,它包含了「當(dāng)前倉(cāng)庫(kù)的Git配置」。
  • 如果我們查看它,我們會(huì)看到一些關(guān)于我們的倉(cāng)庫(kù)的基本設(shè)置,比如是否bare、文件模式等。

  • objects包含了Git對(duì)象,也就是關(guān)于倉(cāng)庫(kù)中文件、提交等的「數(shù)據(jù)」。(這個(gè)狠最重要,狠重要)

  • refs,存儲(chǔ)引用(指針)的地方。

  • refs/heads包含分支的指針

  • refs/tags包含標(biāo)簽的指針

3. 新增一個(gè)文件

現(xiàn)在,我們已經(jīng)了解了.git目錄中初始文件的情況,讓我們執(zhí)行第一個(gè)將內(nèi)容添加到.git目錄的操作。我們將創(chuàng)建一個(gè)文件并將其添加到暫存區(qū)(但還沒(méi)有提交)。

echo 'hello,789' > file
git add file

我們繼續(xù)使用erd -y inverted .git來(lái)查看文件變化。

圖片圖片

git add file這會(huì)引起兩個(gè)主要的更改。

  • 首先,它新增了索引文件(index)。Index用于存儲(chǔ)有關(guān)「當(dāng)前暫存區(qū)」的信息,用于表示名為file的文件已被添加到暫存區(qū)。
  • 第二個(gè)更為重要的更改是「添加」了一個(gè)新文件夾objects/c3,其中包含一個(gè)名為dc8e6cf3e1117a8d9731ddde9916da644296aa的文件。這是Git中存儲(chǔ)對(duì)象的部分。

窺探objects中信息

我們使用file來(lái)查看一下內(nèi)容是何方神圣。

file .git/objects/c3/dc8e6cf3e1117a8d9731ddde9916da644296aa
.git/objects/c3/dc8e6cf3e1117a8d9731ddde9916da644296aa: zlib compressed data

結(jié)果顯示這是經(jīng)過(guò)zlib壓縮的數(shù)據(jù)。這就很讓人抓馬。「你有張良計(jì),我有過(guò)墻梯」,我們可以使用zlib庫(kù)對(duì)其解壓處理。

zlib-flate -uncompress < .git/objects/c3/dc8e6cf3e1117a8d9731ddde9916da644296aa
blob 10hello,789

結(jié)果顯示它包含了文件名為file的文件的類(lèi)型、大小和數(shù)據(jù)。

也就是說(shuō),/c3/dc8e6cf3e1117a8d9731ddde9916da644296aa表示它是一個(gè)大小為10的blob,內(nèi)容是hello,789的數(shù)據(jù)。(只不過(guò)是被zlib處理了)

上面提到的/c3/dc8e6cf3e1117a8d9731ddde9916da644296aa這是Git對(duì)象的一部分,用于存儲(chǔ)文件內(nèi)容。

注意,此時(shí)我們用到了zlib庫(kù),我們可以通過(guò)brew install zlib下載該庫(kù)。(我是Mac環(huán)境,其他環(huán)境大家自行尋找解決方案)

文件名的由來(lái)

文件名來(lái)自?xún)?nèi)容的SHA-1 hash值。

如果我們將zlib壓縮的數(shù)據(jù)通過(guò)sha1sum命令處理,我們會(huì)得到文件名。

$ zlib-flate -uncompress <.git/objects/c3/dc8e6cf3e1117a8d9731ddde9916da644296aa | sha1sum
c3dc8e6cf3e1117a8d9731ddde9916da644296aa

Git使用內(nèi)容的SHA-1散列值,取「前兩個(gè)字符」(在這種情況下是c3),創(chuàng)建一個(gè)文件夾,然后將剩余部分用作文件名。Git從前兩個(gè)字符創(chuàng)建文件夾,以確保我們不會(huì)在單個(gè)objects文件夾下有太多文件。

在Mac環(huán)境下,我們需要通過(guò)brew install md5sha1sum

git cat-file

由于objects的內(nèi)容在Git中比較重要,Git還特意提供了一個(gè)名為git cat-file的命令,用于查看git對(duì)象的內(nèi)容。 使用git cat-file命令

  • 帶有-t選項(xiàng)查看類(lèi)型(type)
  • 帶有-s選項(xiàng)查看大小(size)
  • 帶有-p選項(xiàng)查看內(nèi)容(pretty-print)
  • 這個(gè)選項(xiàng)用于顯示 Git 對(duì)象的內(nèi)容,以更易讀的方式呈現(xiàn),通常用于查看提交、樹(shù)或標(biāo)簽對(duì)象的內(nèi)容
git cat-file -t c3dc8e6cf3e1117a8d9731ddde9916da644296aa
blob

git cat-file -s c3dc8e6cf3e1117a8d9731ddde9916da644296aa
10

git cat-file -p c3dc8e6cf3e1117a8d9731ddde9916da644296aa
hello,789

4. git commit

既然,已經(jīng)將內(nèi)容通過(guò)git add 添加到Index(暫存區(qū)),接下來(lái)我們就需要將內(nèi)容commit到local repository:(本地倉(cāng)庫(kù))

前面講過(guò),下面的ci等同于commit。

git ci -m '首次提交'

繼續(xù)使用erd -y inverted .git 來(lái)查看目錄結(jié)構(gòu)

圖片圖片

嚯,一下多了很多文件。讓我們來(lái)解讀一下。

首先是一個(gè)新文件COMMIT_EDITMSG,它包含了(最新的)提交消息。

如果我們運(yùn)行g(shù)it ci命令而沒(méi)有使用-m標(biāo)志,那么Git獲取提交消息的方式是打開(kāi)一個(gè)文本編輯器,使用COMMIT_EDITMSG文件來(lái)讓用戶(hù)編輯提交消息。一旦用戶(hù)更新了消息并退出編輯器,Git就會(huì)使用該文件的內(nèi)容作為提交消息。

它還添加了一個(gè)全新的logs文件夾。這是Git用來(lái)「記錄倉(cāng)庫(kù)中所有提交更改的一種方式」。我們將能夠「在這里看到所有refs和HEAD的提交更改」。

在refs/heads目錄,其中新增了一個(gè)名為master的文件。這是對(duì)主分支(master)的引用。

使用cat查看對(duì)于的內(nèi)容信息。

cat .git/refs/heads/master
fe010b33df5078cdbd96f2397aad60ec5f42a967

看起來(lái)它指向了其中一個(gè)新對(duì)象。我們用內(nèi)置命令cat-file查看內(nèi)容。

$ git cat-file -t fe010b33df5078cdbd96f2397aad60ec5f42a967
commit

$ git cat-file -p fe010b33df5078cdbd96f2397aad60ec5f42a967
tree 658524b859ae78d902597253a3b68b4da3b70466
author xxx <xxx@simple> 1697178492 +0800
committer xxx <xxx@xxx> 1697178492 +0800

首次提交

我們也可以使用以下命令查看該引用的類(lèi)型:git cat-file -t refs/heads/master

看起來(lái)這是一種新的對(duì)象類(lèi)型,似乎是一個(gè)「提交對(duì)象」(commit object)。提交對(duì)象的內(nèi)容告訴我們,它包含一個(gè)哈希為658524b859ae78d902597253a3b68b4da3b70466的「樹(shù)對(duì)象」(tree object),這看起來(lái)就像我們?cè)谔峤粫r(shí)添加的另一個(gè)對(duì)象。提交對(duì)象還包含了作者和提交者的信息。最后,它還顯示了這個(gè)提交的提交消息是什么。

我們繼續(xù)來(lái)看看樹(shù)對(duì)象包含了什么內(nèi)容。

git cat-file -t 658524b859ae78d902597253a3b68b4da3b70466
tree

git cat-file -p 658524b859ae78d902597253a3b68b4da3b70466
100644 blob c3dc8e6cf3e1117a8d9731ddde9916da644296aa    file

我們會(huì)發(fā)現(xiàn)該文件指向了在我們執(zhí)行g(shù)it add file時(shí)添加的原始對(duì)象(c3dc8e6cf3e1117a8d9731ddde9916da644296aa)。

圖片圖片

樹(shù)對(duì)象內(nèi)部使用更多的樹(shù)對(duì)象來(lái)表示文件夾,這些樹(shù)對(duì)象與提交對(duì)象相連,用于表示目錄結(jié)構(gòu)。

5. 新增修改

讓我們對(duì)文件進(jìn)行更改并查看它是如何工作的。

echo 'git,hello,789' > file

git ci -am "修改文件內(nèi)容"

還是利用erd查看文檔目錄

圖片圖片

  • 創(chuàng)建了3個(gè)新的對(duì)象。

一個(gè)包含文件新內(nèi)容的blob對(duì)象

一個(gè)是一個(gè)樹(shù)對(duì)象

最后一個(gè)是一個(gè)提交對(duì)象

讓我們?cè)俅螐腍EAD或refs/heads/master開(kāi)始跟蹤它們。

git cat-file -p refs/heads/master
tree 02185c57f2040abcaa0c67dfd7026464d916da2b
parent fe010b33df5078cdbd96f2397aad60ec5f42a967
author 789 <789@xx.net> 1697179597 +0800
committer 789 <789@xxx.net> 1697179597 +0800

修改文件內(nèi)容

git cat-file -p 02185c57f2040abcaa0c67dfd7026464d916da2b
100644 blob 1f9224976e282aa9e32398a5bca0cec08041f1dc    file

git cat-file -p 1f9224976e282aa9e32398a5bca0cec08041f1dc
git,hello,789

提交對(duì)象現(xiàn)在有一個(gè)額外的屬性,名為parent,它鏈接到「前一個(gè)提交」,因?yàn)檫@個(gè)提交是建立在前一個(gè)提交之上的。

這是Git中的提交歷史的關(guān)鍵概念,

每個(gè)提交都有一個(gè)或多個(gè)父提交,形成一個(gè)提交鏈。

6. 創(chuàng)建分支

是時(shí)候創(chuàng)建一個(gè)分支了。讓我們使用git br fix-text命令創(chuàng)建一個(gè)名為fix-text的分支。

前面講過(guò),下面的br等同于branch。

圖片圖片

這將在refs/heads文件夾下創(chuàng)建一個(gè)新文件,文件名為分支名稱(chēng),文件內(nèi)容為最新提交的ID。

我們首先用git log查看提交記錄

圖片圖片

發(fā)現(xiàn)最新的提交記錄為efa223e697c6452a393963887f9926ea0662c923

cat .git/refs/heads/fix-text
efa223e697c6452a393963887f9926ea0662c923

在Git中,分支是非常輕量級(jí)的。標(biāo)簽(Tags)的行為也類(lèi)似,只不過(guò)它們是創(chuàng)建在refs/tags下的。

還會(huì)在logs目錄下添加一個(gè)文件,用于存儲(chǔ)與主分支類(lèi)似的提交歷史數(shù)據(jù)。這有助于跟蹤各個(gè)分支的提交歷史。Git的分支和標(biāo)簽是非常有用的版本控制工具,可以幫助我們管理項(xiàng)目的不同狀態(tài)和版本。

7. 分支切換

在Git中,檢出(checkout)操作是獲取「提交」的樹(shù)對(duì)象,并將working tree中的文件更新為與樹(shù)對(duì)象記錄的狀態(tài)相匹配。

圖片圖片

在這種情況下,因?yàn)槲覀儚膍aster切換到fix-text,而這兩個(gè)分支「都指向相同的提交和底層樹(shù)對(duì)象」,Git在working tree中沒(méi)有任何事情要處理。

前面講過(guò),下面的co等同于checkout。

git co fix-text

在.git目錄內(nèi)執(zhí)行co操作時(shí),唯一的變化是.git/HEAD文件現(xiàn)在將指向fix-text。

cat .git/HEAD
ref: refs/heads/fix-text

另外,讓我進(jìn)行一次提交。

echo 'hello,git' > file

git ci -am "更換文本內(nèi)容"

這將在fix-text分支上創(chuàng)建一個(gè)新的commit,將文件file中的內(nèi)容更改為hello,git。

8. 分支合并

合并(merging)有主要三種方式。

  1. 最簡(jiǎn)單和最容易的方式是「快進(jìn)合并」(fast forward merge)
  • 在這種情況下,我們只需將一個(gè)分支指向另一個(gè)分支指向的commit object。
  • 這實(shí)際上涉及將refs/heads/fix-text中的hash復(fù)制到refs/heads/master。
  1. 第二種方式是「變基合并」(rebase merge)
  • 在這種情況下,我們首先逐個(gè)將我們的更改應(yīng)用到主分支(main或master)當(dāng)前指向的每個(gè)提交,然后執(zhí)行類(lèi)似于快進(jìn)合并的操作。

  1. 最后一種方式是通過(guò)創(chuàng)建一個(gè)獨(dú)立的合并提交來(lái)合并兩個(gè)分支。

  • 這在于它將在其提交對(duì)象中有兩個(gè)父節(jié)點(diǎn)(parent entries)。

首先,讓我們看看在合并之前圖形是什么樣子。(先將分支切換回master(git co master))

git log --graph --oneline --all

* 4359ab4 (fix-text) 更換文本內(nèi)容
* efa223e (HEAD -> master) 修改文件內(nèi)容
* fe010b3 首次提交

執(zhí)行合并操作

git merge fix-text
更新 efa223e..4359ab4
Fast-forward
 file | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

上面的操作,將一個(gè)master分支的引用(指向的哈希值)更新為fix-text分支的引用指向的哈希值。

git log --graph --oneline --all

* 4359ab4 (HEAD -> master, fix-text) 更換文本內(nèi)容
* efa223e 修改文件內(nèi)容
* fe010b3 首次提交

9. 遠(yuǎn)程提交

為了演示這一點(diǎn),首先讓我創(chuàng)建另一個(gè)Git倉(cāng)庫(kù),它可以作為這個(gè)倉(cāng)庫(kù)的遠(yuǎn)程倉(cāng)庫(kù)。

新建一個(gè)「裸」倉(cāng)庫(kù)

$ mkdir fake_git_remote
$ cd fake_git_remote && git init --bare

切換到我們dot_git項(xiàng)目中,為倉(cāng)庫(kù)設(shè)置remote

git remote add origin ../fake_git_remote

順便說(shuō)一下,添加一個(gè)新的遠(yuǎn)程倉(cāng)庫(kù)是一項(xiàng)配置更改,我們可以在.git/config文件中查看這個(gè)更改。我會(huì)讓我們自己去查看這個(gè)更改是什么。

圖片圖片

現(xiàn)在讓我們進(jìn)行推送操作。

git push origin master

讓我們看看我們的本地倉(cāng)庫(kù)中發(fā)生了什么變化。

圖片圖片

它添加了一個(gè)新的refs/remotes,用于存儲(chǔ)有關(guān)不同遠(yuǎn)程倉(cāng)庫(kù)中的所有可用內(nèi)容的信息。

但是發(fā)送到另一個(gè)Git倉(cāng)庫(kù)的是什么呢?實(shí)際上,

發(fā)送的內(nèi)容就是.git/objects目錄中的所有對(duì)象,以及我們顯式推送的refs下的所有分支和標(biāo)簽。

這就是另一個(gè)Git倉(cāng)庫(kù)需要獲取我們的完整Git歷史記錄所需的一切內(nèi)容。

圖片 圖片

責(zé)任編輯:武曉燕 來(lái)源: 前端柒八九
相關(guān)推薦

2020-02-10 10:12:28

安全意識(shí)安全指南遠(yuǎn)程辦公

2020-01-08 11:42:06

CIO新年祝福

2017-09-05 08:52:37

Git程序員命令

2022-02-21 09:44:45

Git開(kāi)源分布式

2022-06-20 09:01:23

Git插件項(xiàng)目

2022-04-08 08:32:40

mobx狀態(tài)管理庫(kù)redux

2021-08-11 07:02:21

npm包管理器工具

2021-04-08 11:00:56

CountDownLaJava進(jìn)階開(kāi)發(fā)

2018-10-24 11:26:40

1024錦鯉CTO訓(xùn)練營(yíng)

2020-10-22 08:25:22

JavaScript運(yùn)作原理

2018-10-22 12:50:20

CDN網(wǎng)絡(luò)內(nèi)容發(fā)布網(wǎng)絡(luò)

2021-08-26 05:27:08

Base64 字節(jié)流算法

2023-02-27 10:17:05

EventBus觀察者模式

2021-05-14 16:34:12

Semaphore原理

2021-05-24 08:09:21

SentinelRedis 流控原理

2022-02-18 08:54:21

docker操作系統(tǒng)Linux

2022-05-25 08:31:31

ArthasInstrument

2020-04-14 20:40:58

Git內(nèi)部存儲(chǔ)

2023-04-06 08:37:24

2021-06-09 09:08:10

LDOlowdropoutr穩(wěn)壓器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品三级视频| 亚洲女优在线| 亚洲成av人片在线观看香蕉| 免费看日b视频| 日韩性xxxx| 日本欧美一区二区三区乱码 | 日韩av图片| 中文 欧美 日韩| 欧美一区在线看| 亚洲精品久久久久国产| 天堂av在线网站| 黄色精品免费看| 成人动漫一区二区| 国产精品美女免费视频| 久久一级免费视频| 粉嫩久久久久久久极品| 在线免费观看日韩欧美| 成年人视频大全| 欧美日韩视频精品二区| 国产在线播放一区三区四| 2019国产精品自在线拍国产不卡| 黄色三级视频在线| 少妇视频在线| 久久久精品天堂| 超碰97在线播放| 亚洲精品国产欧美在线观看| 在线中文一区| 国产小视频国产精品| 国产亚洲精品成人a| 91在线成人| 精品国产91乱高清在线观看| 波多野结衣三级在线| 欧美在线一卡| 成人av网在线| 91精品久久久久久蜜桃| 亚洲自拍第二页| 蜜桃视频一区| 91av在线不卡| 欧美日韩一级在线观看| 久久婷婷蜜乳一本欲蜜臀| 亚洲黄在线观看| 涩多多在线观看| 欧美日韩免费电影| 色综合天天做天天爱| 国产69精品久久久久久久| 免费a级人成a大片在线观看| 国产亚洲1区2区3区| 九九99久久| 蜜臀av免费在线观看| 国产一区免费电影| 成人久久18免费网站图片| 亚洲第一网站在线观看| 国产一区二区精品| 欧美激情2020午夜免费观看| 国产精品免费人成网站酒店 | 国产成人精品免高潮在线观看| 综合视频在线观看| 福利片在线观看| 久久久一区二区三区| 国产一区二区精品免费| 亚洲欧美另类视频| 成人a区在线观看| 懂色一区二区三区av片| 99在线小视频| 国产成人精品www牛牛影视| 亚洲free嫩bbb| 亚洲天堂一二三| 毛片av一区二区三区| 国产精品亚洲激情| 91精品国产乱码久久久| 久久成人免费网站| 成人久久久久久| 国产精品羞羞答答在线| 国产激情一区二区三区桃花岛亚洲 | 日本xxxxxxx免费视频| 欧美24videosex性欧美| 亚洲成av人片在线观看无码| av在线播放天堂| √8天堂资源地址中文在线| 激情亚洲一区二区三区四区| www.中文字幕在线| 日韩中文视频| 51久久夜色精品国产麻豆| 天天操夜夜操很很操| 中文字幕日韩在线| 亚洲精品日韩丝袜精品| 国产一二三四区在线| 久久精品影视| 国外成人性视频| 欧美一级黄视频| 国产一区二区三区观看| 国产伦精品一区二区三区| 欧洲视频在线免费观看| 中文字幕一区二区三区av| 日韩视频一二三| 五月天av在线| 欧美日韩在线直播| 中文在线字幕观看| 在线日韩一区| 萌白酱国产一区二区| 日本系列第一页| 麻豆一区二区三区| 国产伦精品一区二区三| jizz在线观看中文| 亚洲成人一二三| 中文字幕网av| 精品亚洲精品| zzjj国产精品一区二区| 国产无人区码熟妇毛片多| 久久精品国产免费| 精品综合在线| 特级毛片在线| 欧美无砖砖区免费| 水蜜桃av无码| 91精品天堂福利在线观看| 7777免费精品视频| a在线观看视频| 国产亚洲精品超碰| 国产精品网站免费| 国产精品日韩精品在线播放| 亚洲欧美一区二区三区在线| 青青草激情视频| 日韩av一区二| 久久亚洲一区二区| 久草在线新免费首页资源站| 欧美日韩高清在线| 成人精品999| 精品9999| 91亚洲精品久久久| 91社区在线| 91黄视频在线观看| 屁屁影院国产第一页| 欧美国产高潮xxxx1819| 国产精品亚洲一区二区三区| 日中文字幕在线| 亚洲成人中文在线| 韩国黄色一级片| 亚洲免费二区| 成人日韩在线电影| 自拍视频在线播放| 欧美在线三级电影| 精品人妻无码一区二区三区换脸 | 亚洲国产成人不卡| 裤袜国产欧美精品一区| 亚洲国产日韩欧美在线动漫| 精品深夜av无码一区二区老年| 亚洲经典在线| 国产成人亚洲欧美| 成人午夜在线影视| 制服丝袜av成人在线看| 看黄色录像一级片| 精品一二线国产| 伊人久久婷婷色综合98网| 国产经典一区| 国产亚洲欧美日韩美女| 亚洲天堂五月天| 国产视频视频一区| 成人免费xxxxx在线视频| 五月综合久久| 日本aⅴ大伊香蕉精品视频| 亚洲AV成人无码一二三区在线| 久久久综合精品| 1024av视频| 国产精品白丝av嫩草影院| 欧美精品福利在线| 天天操天天干天天插| 色综合久久综合网97色综合| 伊人网伊人影院| 日本色综合中文字幕| 亚洲欧洲日本国产| 亚洲我射av| 欧美日本高清视频| 天天干天天草天天射| 日韩人在线观看| 潮喷失禁大喷水aⅴ无码| 国产又粗又猛又爽又黄91精品| 美女一区视频| 久久精品嫩草影院| 精品中文字幕在线| 少妇人妻精品一区二区三区| 色综合色综合色综合色综合色综合 | 欧美激情论坛| 国产精品第一| 欧美黑人性生活视频| 欧美伦理影视网| 91精品国产入口| 久久久久久福利| 久久精品无码一区二区三区| 成人综合久久网| 亚洲狠狠婷婷| 亚洲一区二区精品在线| 亚洲五码在线| 国产不卡视频在线| 在线观看三级视频| 亚洲社区在线观看| 亚洲国产剧情在线观看| 一本色道久久综合亚洲91| 永久免费看片直接| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品久久国产| 激情五月色综合国产精品| 成人黄色在线播放| 午夜伦理在线| 一本大道久久a久久综合婷婷| 亚洲精品乱码久久久久久9色| 国产精欧美一区二区三区蓝颜男同| 91精品久久久久久久久99蜜臂| jizz日本免费| 日本网站在线观看一区二区三区| 日韩欧美亚洲日产国产| 成人黄色理论片| 午夜精品国产精品大乳美女| 国产毛片av在线| 日韩精品专区在线影院重磅| 欧美一区二区三区四| 亚洲欧洲日韩综合一区二区| 国产激情视频网站| 国产一区二区三区在线观看精品 | 日韩video| 欧美91在线| 国产欧美日韩91| sis001欧美| 欧美超级免费视 在线| 日韩美女一级视频| 日韩三级视频中文字幕| 国产污视频网站| 亚洲一区二区三区中文字幕| 男人av资源站| 久久精品人人做人人爽97| 佐佐木明希电影| 日本成人在线不卡视频| www.av蜜桃| 欧美丰满老妇| 日本一区视频在线观看| 久久porn| 国产色综合一区二区三区| 午夜精品久久久久久毛片| 欧美综合国产精品久久丁香| 菠萝菠萝蜜在线视频免费观看| 日韩三级在线观看| 中文字幕在线网址| 欧美日韩国产丝袜另类| 紧身裙女教师波多野结衣| 久久青草国产手机看片福利盒子| 在线观看高清免费视频| 亚洲综合日韩| 奇米影视亚洲色图| 综合天堂久久久久久久| 亚洲色婷婷久久精品av蜜桃| 波多野结衣一区| 日韩电影免费观看在| 欧美另类中文字幕| 18成人在线| 精品国产亚洲一区二区三区| 91精品久久久久久久久久入口| 亚洲wwwww| 久久久999精品视频| av播放在线观看| 国产亚洲精品美女久久久| av在线免费一区| 中文日韩在线观看| 狠狠色伊人亚洲综合网站l| 亚洲免费福利视频| xxxxx日韩| 亚洲香蕉伊综合在人在线视看| 中文字幕精品无码亚| 91福利区一区二区三区| 91麻豆精品在线| 一本色道久久综合精品竹菊| 伊人手机在线视频| 色久综合一二码| 91丨porny丨在线中文| 欧美乱妇一区二区三区不卡视频| 久草中文在线视频| 亚洲一区自拍偷拍| 欧美 日韩 精品| 一本大道久久a久久综合| 三级视频在线观看| 欧美日韩亚洲国产综合| 国产成人免费观看视频| 欧美日韩亚洲精品一区二区三区| 免费看一级黄色| 国产日产精品一区| 91无套直看片红桃在线观看| 国产精品狼人久久影院观看方式| 无码任你躁久久久久久老妇| 91色.com| 午夜精产品一区二区在线观看的| 国产精品资源站在线| 亚洲国产综合av| 久久人人超碰精品| 亚洲天堂最新地址| 亚洲另类一区二区| 五月天婷婷丁香| 欧美日韩国产高清一区二区| 国产色视频在线| 亚洲国产日韩欧美在线动漫| 日韩精品成人av| 欧美激情喷水视频| 精品国产第一福利网站| 国产成人精品在线播放| 欧美激情三级| 欧美日韩一区在线观看视频| 久久理论电影| 成人免费观看视频在线观看| 日本中文在线一区| 337p日本欧洲亚洲大胆张筱雨| 激情综合色综合久久综合| 性生交大片免费看l| 久久综合五月天婷婷伊人| 69视频在线观看免费| 亚洲h在线观看| 一本色道久久综合无码人妻| 精品99一区二区三区| 麻豆传媒在线观看| 2021国产精品视频| 国产精品视频首页| 久久伦理网站| 欧美区国产区| 天天操天天摸天天爽| 99久久精品国产一区二区三区| 中文字幕人妻熟女在线| 国产精品网站在线| 波多野结衣亚洲色图| 一本一本大道香蕉久在线精品| 久久夜色精品国产噜噜亚洲av| 天天综合天天做天天综合| 国产黄色大片网站| 这里只有精品在线播放| 波多野结衣在线观看| 成人久久久久爱| 国产在线日韩精品| 国产人妻777人伦精品hd| 日韩国产成人精品| 一区二区黄色片| 精品欧美激情精品一区| 精品国产九九九| 久久精品国产亚洲精品| 日韩免费va| 精品乱码一区二区三区| 中文一区二区| 国产一级黄色录像| 亚洲综合丝袜美腿| 亚洲第一天堂在线观看| 粗暴蹂躏中文一区二区三区| 不卡亚洲精品| 亚洲三区在线观看| 热久久国产精品| 久久婷婷五月综合| 欧美三片在线视频观看| 国产资源在线观看| 欧美专区在线观看| 国内黄色精品| 久久婷婷国产精品| 91丨porny丨中文| 中文字幕国产在线观看| 精品亚洲va在线va天堂资源站| 邻居大乳一区二区三区| 日韩av三级在线观看| 日韩a级大片| 久久精品视频16| 久久久久久一二三区| 日本亚洲色大成网站www久久| 在线日韩av片| 黄色av网站在线免费观看| 国产精品久久久久久久一区探花| 99精品女人在线观看免费视频| 岛国视频一区免费观看| 欧美三级在线| 亚洲国产精品狼友在线观看| 亚洲大型综合色站| 青草久久伊人| 国产精品日韩久久久久| 欧美色图一区| 青青草精品在线| 亚洲一区二区美女| 午夜视频福利在线| 国产精品久久久久久久7电影| 亚洲精品不卡在线观看| 免费极品av一视觉盛宴| 91日韩精品一区| 中文人妻av久久人妻18| 尤物九九久久国产精品的分类| 色资源二区在线视频| 欧美裸体网站| 免费人成精品欧美精品 | 毛片a片免费观看| 精品国产乱子伦一区| 成人线上视频| 视频一区视频二区视频三区视频四区国产 | 在线观看av不卡| 三级外国片在线观看视频| 国产精品制服诱惑| 日韩黄色一级片| 女同久久另类69精品国产| 日韩欧美精品在线| 亚洲一二三四| 亚洲精品二区| 99久久精品免费观看| 精品国产青草久久久久96|