国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Git 提交是差異、快照還是歷史記錄?

系統(tǒng) Linux
大家好!我一直在慢慢摸索如何解釋 Git 中的各個(gè)核心理念(提交、分支、遠(yuǎn)程、暫存區(qū)),而提交這個(gè)概念卻出奇地棘手。

要明白 Git 提交是如何實(shí)現(xiàn)的對我來說相當(dāng)簡單(這些都是確定的!我可以直接查看!),但是要弄清楚別人是怎么看待提交的卻相當(dāng)困難。所以,就像我最近一直在做的那樣,我在 Mastodon 上問了一些問題。

大家是怎么看待 Git 提交的?

我進(jìn)行了一個(gè) 非常不科學(xué)的調(diào)查,詢問大家是怎么看待 Git 提交的:是快照、差異,還是所有之前提交的列表?(當(dāng)然,把它看作這三者都是合理的,但我很好奇人們的 主要

結(jié)果是:

  • 51% 差異
  • 42% 快照
  • 4% 所有之前的提交的歷史記錄
  • 3% “其他”

我很驚訝差異和快照兩個(gè)選項(xiàng)的比例如此接近。人們還提出了一些有趣但相互矛盾的觀點(diǎn),比如 “在我看來,提交是一個(gè)差異,但我認(rèn)為它實(shí)際上是以快照的形式實(shí)現(xiàn)的” 和 “在我看來,提交是一個(gè)快照,但我認(rèn)為它實(shí)際上是以差異的形式實(shí)現(xiàn)的”。關(guān)于提交的實(shí)際實(shí)現(xiàn)方式,我們稍后再詳談。

在我們進(jìn)一步討論之前:我們的說 “一個(gè)差異” 或 “一個(gè)快照” 都是什么意思?

什么是差異?

我說的“差異”可能相當(dāng)明顯:差異就是你在運(yùn)行 git show COMMIT_ID 時(shí)得到的東西。例如,這是一個(gè) rbspy 項(xiàng)目中的拼寫錯(cuò)誤修復(fù):

diff --git a/src/ui/summary.rs b/src/ui/summary.rs
index 5c4ff9c..3ce9b3b 100644
--- a/src/ui/summary.rs
+++ b/src/ui/summary.rs
@@ -160,7 +160,7 @@ mod tests {
  ";
          let mut buf: Vec<u8> = Vec::new();
-        stats.write(&mut buf).expect("Callgrind write failed");
+        stats.write(&mut buf).expect("summary write failed");
          let actual = String::from_utf8(buf).expect("summary output not utf8");
          assert_eq!(actual, expected, "Unexpected summary output");
      }

你可以在 GitHub 上看到它: https://github.com/rbspy/rbspy/commit/24ad81d2439f9e63dd91cc1126ca1bb5d3a4da5b

什么是快照?

我說的 “快照” 是指 “當(dāng)你運(yùn)行 git checkout COMMIT_ID 時(shí)得到的所有文件”。

Git 通常將提交的文件列表稱為 “樹”(如“目錄樹”),你可以在 GitHub 上看到上述提交的所有文件:

https://github.com/rbspy/rbspy/tree/24ad81d2439f9e63dd91cc1126ca1bb5d3a4da5b(它是 /tree/ 而不是 /commit/

“Git 是如何實(shí)現(xiàn)的”真的是正確的解釋方式嗎?

我最常聽到的關(guān)于學(xué)習(xí) Git 的建議大概是 “只要學(xué)會 Git 在內(nèi)部是如何表示事物的,一切都會變得清晰明了”。我顯然非常喜歡這種觀點(diǎn)(如果你花了一些時(shí)間閱讀這個(gè)博客,你就會知道我 喜歡

但是作為一個(gè)學(xué)習(xí) Git 的方法,它并沒有我希望的那么成功!通常我會興奮地開始解釋 “好的,所以 Git 提交是一個(gè)快照,它有一個(gè)指向它的父提交的指針,然后一個(gè)分支是一個(gè)指向提交的指針,然后……”,但是我試圖幫助的人會告訴我,他們并沒有真正發(fā)現(xiàn)這個(gè)解釋有多有用,他們?nèi)匀徊幻靼住K晕乙恢痹诳紤]其他方案。

但是讓我們還是先談?wù)剝?nèi)部實(shí)現(xiàn)吧。

Git 是如何在內(nèi)部表示提交的 —— 快照

在內(nèi)部,Git 將提交表示為快照(它存儲每個(gè)文件當(dāng)前版本的 “樹”)。我在 在一個(gè) Git 倉庫中,你的文件在哪里? 中寫過這個(gè),但下面是一個(gè)非常快速的內(nèi)部格式概述。

這是一個(gè)提交的表示方式:

$ git cat-file -p 24ad81d2439f9e63dd91cc1126ca1bb5d3a4da5b
tree e197a79bef523842c91ee06fa19a51446975ec35
parent 26707359cdf0c2db66eb1216bf7ff00eac782f65
author Adam Jensen <adam@acj.sh> 1672104452 -0500
committer Adam Jensen <adam@acj.sh> 1672104890 -0500
Fix typo in expectation message

以及,當(dāng)我們查看這個(gè)樹對象時(shí),我們會看到這個(gè)提交中倉庫根目錄下每個(gè)文件/子目錄的列表:

$ git cat-file -p e197a79bef523842c91ee06fa19a51446975ec35
040000 tree 2fcc102acd27df8f24ddc3867b6756ac554b33ef    .cargo
040000 tree 7714769e97c483edb052ea14e7500735c04713eb    .github
100644 blob ebb410eb8266a8d6fbde8a9ffaf5db54a5fc979a    .gitignore
100644 blob fa1edfb73ce93054fe32d4eb35a5c4bee68c5bf5    ARCHITECTURE.md
100644 blob 9c1883ee31f4fa8b6546a7226754cfc84ada5726    CODE_OF_CONDUCT.md
100644 blob 9fac1017cb65883554f821914fac3fb713008a34    CONTRIBUTORS.md
100644 blob b009175dbcbc186fb8066344c0e899c3104f43e5    Cargo.lock
100644 blob 94b87cd2940697288e4f18530c5933f3110b405b    Cargo.toml

這意味著檢出一個(gè) Git 提交總是很快的:對 Git 來說,檢出昨天的提交和檢出 100 萬個(gè)提交之前的提交一樣容易。Git 永遠(yuǎn)不需要重新應(yīng)用 10000 個(gè)差異來確定當(dāng)前狀態(tài),因?yàn)樘峤桓揪筒皇且圆町惖男问酱鎯Φ摹?/p>

快照使用 packfile 進(jìn)行壓縮

我剛剛提到了 Git 提交是一個(gè)快照,但是,當(dāng)有人說 “在我看來,提交是一個(gè)快照,但我認(rèn)為它在實(shí)現(xiàn)上是一個(gè)差異” 時(shí),這其實(shí)也是對的!Git 提交并不是以你可能習(xí)慣的差異的形式表示的(它們不是以與上一個(gè)提交的差異的形式存儲在磁盤上的),但基本的直覺是,如果你要對一個(gè) 10,000 行的文件編輯 500 次,那么存儲 500 份文件的效率會很低。

Git 有一個(gè)將文件以差異的形式存儲的方法。這被稱為 “packfile”,Git 會定期進(jìn)行垃圾回收,將你的數(shù)據(jù)壓縮成 packfile 以節(jié)省磁盤空間。當(dāng)你 git clone 一個(gè)倉庫時(shí),Git 也會壓縮數(shù)據(jù)。

這里,我沒有足夠的篇幅來完整地解釋 packfile 是如何工作的(Aditya Mukerjee 的 《解壓 Git packfile》是我最喜歡的解釋它們是如何工作的文章)。不過,我可以在這里簡單總結(jié)一下我對 deltas 工作原理的理解,以及它們與 diff 的區(qū)別:

  • 對象存儲為 “原始文件” 和一個(gè) “變化量delta” 的引用
  • 變化量是一系列例如 “讀取第 0 到 100 字節(jié),然后插入字節(jié) ‘hello there’,然后讀取第 120 到 200 字節(jié)” 的指令。它從原始文件中拼湊出新的文本。所以沒有 “刪除” 的概念,只有復(fù)制和添加。
  • 我認(rèn)為變化量的層次較少:我不知道如何檢查 Git 究竟要經(jīng)過多少層變化量才能得到一個(gè)給定的對象,但我的印象是通常不會很多。可能少于 10 層?不過,我很想知道如何才能真正查出來。
  • 原始文件不一定來自上一個(gè)提交,它可以是任何東西。也許它甚至可以來自一個(gè)更晚的提交?我不確定。
  • 沒有一個(gè) “正確的” 算法來計(jì)算變化量,Git 只是有一些近似的啟發(fā)式算法

當(dāng)你查看差異時(shí),實(shí)際上發(fā)生了一些奇怪的事情

當(dāng)我們運(yùn)行 git show SOME_COMMIT 來查看某個(gè)提交的差異時(shí),實(shí)際上發(fā)生的事情有點(diǎn)反直覺。我的理解是:

  1. Git 會在 packfile 中查找并應(yīng)用變化量來重建該提交和其父提交的樹。
  2. Git 會對兩個(gè)目錄樹(當(dāng)前提交的目錄樹和父提交的目錄樹)進(jìn)行差異比較。通常這很快,因?yàn)閹缀跛械奈募际峭耆粯拥模?git 只需比較相同文件的哈希值就可以了,幾乎所有時(shí)候都不用做什么。
  3. 最后 Git 會展示差異

所以,Git 會將變化量轉(zhuǎn)換為快照,然后計(jì)算差異。它感覺有點(diǎn)奇怪,因?yàn)樗鼜囊粋€(gè)類似差異的東西開始,最終得到另一個(gè)類似差異的東西,但是變化量和差異實(shí)際上是完全不同的,所以這是說得通的。

也就是說,我認(rèn)為 Git 將提交存儲為快照,而 packfile 只是一個(gè)實(shí)現(xiàn)細(xì)節(jié),目的是節(jié)省磁盤空間并加快克隆速度。我其實(shí)從來沒必要知道 packfile 是如何工作的,但它確實(shí)能幫助我理解 Git 是如何在不占用太多磁盤空間的情況下將提交快照化的。

一個(gè) “錯(cuò)誤的” Git 理解:提交是差異

我認(rèn)為一個(gè)相當(dāng)常見的,對 Git 的 “錯(cuò)誤” 的理解是:

  • 提交是以基于上一個(gè)提交的差異的形式存儲的(加上指向父提交的指針和作者和消息)。
  • 要獲取提交的當(dāng)前狀態(tài),Git 需要從頭開始重新應(yīng)用所有之前的提交。

這個(gè)理解當(dāng)然是錯(cuò)誤的(在現(xiàn)實(shí)中,提交是以快照的形式存儲的,差異是從這些快照計(jì)算出來的),但是對我來說它似乎非常有用而且有意義!在考慮合并提交時(shí)會有一點(diǎn)奇怪,但是或許我們可以說這只是基于合并提交的第一個(gè)父提交的差異。

我認(rèn)為這個(gè)錯(cuò)誤的理解有的時(shí)候非常有用,而且對于日常 Git 使用來說它似乎并沒有什么問題。我真的很喜歡它將我們最常使用的東西(差異)作為最基本的元素——它對我來說非常直觀。

我也一直在思考一些其他有用但 “錯(cuò)誤” 的 Git 理解,比如:

  • 提交信息可以被編輯(實(shí)際上不能,你只是復(fù)制了一個(gè)相同的提交然后給了它一個(gè)新的信息,舊的提交仍然存在)
  • 提交可以被移動到一個(gè)不同的基礎(chǔ)上(類似地,它們是被復(fù)制了)

我認(rèn)為有一系列非常有意義的、 “錯(cuò)誤” 的對 Git 的理解,它們在很大程度上都受到 Git 用戶界面的支持,并且在大多數(shù)情況下都不會產(chǎn)生什么問題。但是當(dāng)你想要撤銷一個(gè)更改或者出現(xiàn)問題時(shí),它可能會變得混亂。

將提交視為差異的一些優(yōu)勢

就算我知道在 Git 中提交是快照,我可能大部分時(shí)間也都將它們視為差異,因?yàn)椋?/p>

  • 大多時(shí)候我都在關(guān)注我正在做的 更改 —— 如果我只是改變了一行代碼,顯然我主要是在考慮那一行代碼而不是整個(gè)代碼庫的當(dāng)前狀態(tài)
  • 點(diǎn)擊 GitHub 上的 Git 提交或者使用 git show 時(shí),你會看到差異,所以這只是我習(xí)慣看到的東西
  • 我經(jīng)常使用變基,它就是關(guān)于重新應(yīng)用差異的

將提交視為快照的一些優(yōu)勢

但是我有時(shí)也會將提交視為快照,因?yàn)椋?/p>

  • Git 經(jīng)常對文件的移動感到困惑:有時(shí)我移動了一個(gè)文件并編輯了它,Git 無法識別它是否被移動過,而是顯示為 “刪除了 old.py,添加了 new.py”。這是因?yàn)?Git 只存儲快照,所以當(dāng)它顯示 “移動 old.py -> new.py” 時(shí),只是猜測,因?yàn)?nbsp;old.py 和 new.py 的內(nèi)容相似。
  • 這種方式更容易理解 git checkout COMMIT_ID 在做什么(重新應(yīng)用 10000 個(gè)提交的想法讓我感到很有壓力)
  • 合并提交在我看來更像是快照,因?yàn)楹喜⒌奶峤粚?shí)際上可以是任何東西(它只是一個(gè)新的快照!)。它幫助我理解為什么在解決合并沖突時(shí)可以進(jìn)行任意更改,以及為什么在解決沖突時(shí)要小心。

其他一些關(guān)于提交的理解

Mastodon 的一些回復(fù)中還提到了:

  • 有關(guān)提交的 “額外的” 帶外信息,比如電子郵件、GitHub 拉取請求或者你和同事的對話
  • 將“差異”視為一個(gè)“之前的狀態(tài) + 之后的狀態(tài)”
  • 以及,當(dāng)然,很多人根據(jù)情況的不同以不同的方式看待提交

人們在談?wù)撎峤粫r(shí)使用的其他一些詞可能不那么含糊:

  • “修訂”(似乎更像是快照)
  • “補(bǔ)丁”(看起來更像是差異)

就到這里吧!

我很難了解人們對 Git 有哪些不同的理解。尤其棘手的是,盡管 “錯(cuò)誤” 的理解往往非常有用,但人們卻非常熱衷于警惕 “錯(cuò)誤” 的心智模式,所以人們不愿意分享他們 “錯(cuò)誤” 的想法,生怕有什么 Git 解釋者會站出來向他們解釋為什么他們是錯(cuò)的。(這些 Git 解釋者通常是出于善意的,但是無論如何它都會產(chǎn)生一種負(fù)面影響)

但是我學(xué)到了很多!我仍然不完全清楚該如何談?wù)撎峤唬俏覀冏罱K會弄清楚的。

感謝 Marco Rogers、Marie Flanagan 以及 Mastodon 上的所有人和我討論 Git 提交。

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2023-05-09 08:15:32

圖形編輯器撤銷重做功能

2009-08-20 16:25:05

Linux系統(tǒng)歷史記錄linux

2021-04-27 15:38:10

GoogleChrome歷史記錄

2013-12-05 17:37:57

Windows 8文件歷史記錄

2022-01-25 11:33:14

數(shù)據(jù)泄露網(wǎng)絡(luò)攻擊

2009-07-07 15:49:04

root命令歷史記錄安全性 

2021-01-06 18:10:22

ShellLoki系統(tǒng)運(yùn)維

2013-01-21 14:37:05

Windows 8歷史記錄

2021-12-15 23:33:33

Windows 11Windows微軟

2020-06-01 18:20:41

Git

2016-01-27 11:24:20

Windows 10紅石鏡像

2016-01-26 15:27:16

Windows 10歷史記錄備份

2023-08-01 09:30:12

SQL Server數(shù)據(jù)庫

2011-10-09 14:57:35

2019-10-14 16:16:49

BashLinux命令

2022-04-29 16:47:57

AI騰訊

2013-12-06 13:33:08

安全補(bǔ)丁

2021-01-05 10:54:12

Edge微軟服務(wù)器

2017-03-27 16:15:42

ChromeVivaldi瀏覽器

2021-01-20 09:29:09

QQ瀏覽器App
點(diǎn)贊
收藏

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

亚洲视频观看| 精品成人久久av| 人妻内射一区二区在线视频| 成年人黄色大片在线| 深夜福利日韩在线看| 欧美精品激情| 91国内精品在线视频| 亚洲精品99久久久久中文字幕| 美女一区二区在线观看| 精品无码久久久久久久动漫| 免费在线观看视频一区| 久操视频在线观看| 亚洲最新av在线网站| av老司机在线观看| 国产精品自拍偷拍| 亚洲欧美色综合| 91嫩草国产线观看亚洲一区二区 | 欧美二三四区| 在线观看成人av电影| 日韩电影视频免费| 精品一区二区三区免费播放| av手机在线观看| 欧美性潮喷xxxxx免费视频看| 精品视频久久久久久久| 国产精品99久久久久| 九色porny丨入口在线| 91色p视频在线| 日韩亚洲国产欧美| 在线激情免费视频| 香蕉久久免费影视| 伊人亚洲福利一区二区三区| 久久影院午夜片一区| 亚洲日本va| 91美女在线| 国产精品区一区二区三在线播放| 欧美日韩国产综合新一区| 综合久久一区| 9765激情中文在线| 国产91露脸中文字幕在线| 亚洲自拍偷拍九九九| 中文无码日韩欧| igao视频网在线视频| 国内精品久久久久久久果冻传媒| 亚洲成人精品久久| 亚洲在线黄色| 午夜激情在线播放| 一区二区三区偷拍| 亚洲电影免费观看高清完整版在线观看| 蜜臀精品久久久久久蜜臀| 一区中文字幕电影| 国产精品久久一区二区三区不卡| 日产精品久久久久久久蜜臀| 4k岛国日韩精品**专区| 欧美一三区三区四区免费在线看| jlzzjlzz亚洲日本少妇| 神马电影久久| 国产精品专区免费| 欧美视频综合| 亚洲精品乱码久久久久久自慰| 国产91色在线|亚洲| 久久视频在线视频| 在线综合视频播放| 亚洲国产精品黑人久久久| 亚洲精品456| 国产美女高潮在线观看| 偷拍自拍在线视频| 国产超碰在线播放| 青青草成人网| 欧美成人免费小视频| 日韩毛片在线观看| 日韩视频一区在线观看| 国产精品久久久久久久久晋中| 亚洲国产最新| 玖玖玖电影综合影院| av免费在线视| 免费看电影在线| 日本最黄一级片免费在线| 国产乱妇乱子| 黄色一级视频片| 成人免费视频91| 精品一区二区久久久久久久网站| 欧美大片在线看| 亚洲免费一在线| 精品国产伦一区二区三区免费| 欧美在线视频全部完| 欧美视频在线观看 亚洲欧| 国产高清在线精品| 久久99国内精品| 在线欧美视频| 成人高清免费观看mv| 手机亚洲第一页| 中国大陆高清aⅴ毛片| 久久波多野结衣| 日韩啊v在线| 日韩av高清| 一本色道久久99精品综合| 91成人在线视频观看| 国产美女永久无遮挡| 一区二区三区四区| 肉大捧一出免费观看网站在线播放| 一区二区不卡在线| 成人在线免费观看视频网站| 浴室偷拍美女洗澡456在线| 在线视频欧美一区| 欧美 日韩 亚洲 一区| 成人狠狠色综合| 一区二区三区四区国产| 99精品国产高清在线观看| 97夜夜澡人人双人人人喊| 国产精品三级美女白浆呻吟| 97se亚洲综合| 国产91视觉| 99伊人久久| 亚洲欧美成人一区| 久久久久久久影院| 国产精品免费小视频| 欧美xxxx吸乳| 日韩一区二区三区资源| 国产精品久久久久久久久久久久午夜片| 明星裸体视频一区二区| 国产 欧美 日本| 午夜亚洲成人| 黄色软件在线观看| www.8ⅹ8ⅹ羞羞漫画在线看| 久久99久久久久| 日韩精品一二三四区| 中文字幕亚洲综合| 国产高清视频一区三区| 成人网在线免费看| 亚洲wwwav| 久久久人成影片一区二区三区| 中文字幕av一区 二区| 麻豆精品精品国产自在97香蕉| 极品少妇一区二区| 91麻豆免费观看| 久久伊人蜜桃av一区二区| 日韩电影一区二区三区四区| 国产精品12区| 亚洲成人资源网| 日本一区二区三区在线播放| 欧美亚洲日本黄色| 久久精品美女| 四虎影视2018在线播放alocalhost| 久久婷婷五月综合色丁香| 欧美猛男做受videos| 久久国产尿小便嘘嘘| 欧美日韩1234| 九色视频成人porny| 青青草视频在线免费直播| 国产亚洲福利| 日韩一区二区三区在线| 91精品国产综合久久香蕉最新版| 两个人hd高清在线观看| 欧美freesex8一10精品| 亚洲男人天堂av网| 久久天天躁日日躁| 高清av免费一区中文字幕| 日本fc2在线观看| 免费精品一区| 日韩高清在线电影| 欧美色区777第一页| 国产精品伊人日日| av免费在线一区二区三区| 国产成人超碰人人澡人人澡| 亚洲欧美国产另类| 日韩jizzz| 色老太综合网| 亚洲激情自拍视频| 欧美一区二区三区视频| 97高清免费视频| 成人亚洲欧美一区二区三区| 国产91免费看片| 免费成人深夜夜行视频| 国产一级免费在线观看| 国产第一亚洲| 日韩欧美精品网址| 国产精品久久久久久五月尺| 国产精品久久7| 色视频网站在线| 永久免费精品视频| 国产情侣一区| 懂色aⅴ精品一区二区三区蜜月| 亚洲精品电影久久久| 欧美三级网色| 黄色毛片在线看| 亚洲精品在线国产| 欧美三级不卡| 一区二区三区日韩精品| 欧美激情网友自拍| 自拍偷拍视频在线| 男男激情在线| 黄色网zhan| 免费白浆视频| 亚洲国产欧美日韩在线观看第一区 | 在线午夜精品| 一本久久精品一区二区| 国产精品久久久久久久久久久久| 一二三四社区在线视频| 欧美性www| 国产人伦精品一区二区|