目錄
圖解git工作原理
首頁 開發工具 Git 圖文詳解!搞懂Git工作原理

圖文詳解!搞懂Git工作原理

Feb 10, 2022 pm 06:19 PM
git

本篇文章為大家帶來了關於Git工作原理的相關知識,其中主要是用來圖片結合文字進行詳解,希望對大家有幫助。

圖文詳解!搞懂Git工作原理

圖解git工作原理

本文圖解Git中的最常用指令。如果你稍微理解Git的工作原理,這篇文章能夠讓你理解的更透徹。

圖文詳解!搞懂Git工作原理

上面的四個指令在工作目錄、暫存目錄(也稱為索引)和倉庫之間複製檔案。

  • git add files把目前檔案放入暫存區域。

  • git commit為暫存區域產生快照並提交。

  • git reset – files用來撤銷最後一次git add files,你也可以用git reset撤銷所有暫存區域檔案。

  • git checkout – files把檔案從暫存區域複製到工作目錄,用來丟棄本地修改。

你可以用git reset -p,git checkout -p,or git add -p進入互動模式。

也可以跳過暫存區域直接從倉庫取出檔案或直接提交程式碼。

圖文詳解!搞懂Git工作原理

  • git commit -a相當於執行git add把所有目前目錄下的檔案加入暫存區域再運行。

  • git commit files進行一次包含最後一次提交加上工作目錄中檔案快照的提交。並且文件被加入到暫存區域。

  • git checkout HEAD – files回滾到複製最後一次提交。

後文中以下面的形式使用圖片。

圖文詳解!搞懂Git工作原理

綠色的5位元字元表示提交的ID,分別指向父節點。分支以橘色顯示,分別指向特定的提交。目前分支由附在其上的HEAD標識。這張圖片裡顯示最後5次提交,ed489是最新提交。 master分支指向這次提交,另一個maint分支指向祖父提交節點。

Diff

有許多種方法可以查看兩次提交之間的變動,以下是一些範例。

圖文詳解!搞懂Git工作原理

Commit

提交時,Git用暫存區域的檔案建立一個新的提交,並且把此時的節點設為父節點。然後把目前分支指向新的提交節點。下圖中,目前分支是master。在執行指令之前,master指向ed489,提交後,master指向新的節點f0cec並以ed489為父節點。

圖文詳解!搞懂Git工作原理

即使目前分支是某次提交的祖父節點,git會同樣運作。下圖中,在master分支的祖父節點maint分支進行一次提交,產生了1800b。這樣,maint分支就不再是master分支的祖父節點。此時,合併[1](或衍合[2])是必須的。

圖文詳解!搞懂Git工作原理

如果想更改一次提交,請使用git commit –amend。 Git會使用與目前提交相同的父節點進行一次新提交,舊的提交會被取消。

圖文詳解!搞懂Git工作原理

另一個例子是分離HEAD提交[3],後面說。

Checkout

Checkout指令用於從歷史提交(或暫存區域)拷貝檔案到工作目錄,也可用於切換分支。

當給定某個檔案名稱(或開啟-p選項,或檔案名稱和-p選項同時開啟)時,Git會從指定的提交中拷貝檔案到暫存區域和工作目錄。例如,git checkout HEAD~ foo.c會將提交節點HEAD~(即目前提交節點的父節點)中的foo.c複製到工作目錄並且加到暫存區域中。 (如果命令中沒有指定提交節點,則會從暫存區域拷貝內容。)注意目前分支不會發生變化。

圖文詳解!搞懂Git工作原理

當不指定檔案名,而是給予一個(本地)分支時,那麼HEAD標識會移動到那個分支(也就是說,我們「切換」到那個分支了),然後暫存區域和工作目錄中的內容會和HEAD對應的提交節點一致。新提交節點(下圖中的a47c3)中的所有檔案都會被複製(到暫存區域和工作目錄中);只存在於舊的提交節點(ed489)中的檔案會被刪除;不屬於上述兩者的文件會被忽略,不受影響。

圖文詳解!搞懂Git工作原理

如果既沒有指定檔名,也沒有指定分支名,而是標籤、遠端分支、SHA-1值或是像master~3類似的東西,就得到一個匿名分支,稱為detached HEAD(被分離的HEAD標識)。這樣可以很方便地在歷史版本之間互相切換。比如說你想要編譯1.6.6.1版本的Git,你可以執行git checkout v1.6.6.1(這是一個標籤,而非分支名),編譯,安裝,然後切換回另一個分支,比如說git checkout master。然而,當提交操作涉及「分離的HEAD」時,其行為會略有不同,詳情請見在下面。

關注公眾號“Java後端技術全端”,回覆面試,獲取面試優質資料

圖文詳解!搞懂Git工作原理

#HEAD標識處於分離狀態時的提交操作

當HEAD處於分離狀態(不依附於任一分支)時,提交操作可以正常進行,但不會更新任何已命名的分支。 (你可以認為這是在更新一個匿名分支。)

圖文詳解!搞懂Git工作原理

一旦你此後切換到別的分支,比如說master,那麼這個提交節點(可能)再也不會被引用到,然後就會被丟棄掉了。注意這個指令之後就不會有東西引用2eecb。

圖文詳解!搞懂Git工作原理

但是,如果你想要儲存這個狀態,可以用指令git checkout -b name來建立一個新的分支。

圖文詳解!搞懂Git工作原理

Reset

Reset指令把目前分支指向另一個位置,並且有選擇的變動工作目錄和索引。也用來在從歷史倉庫複製文件到索引,而不動工作目錄。

如果不給選項,那麼目前分支指向到那個提交。如果用–hard選項,那麼工作目錄也更新,如果用–soft選項,那麼都不變。

圖文詳解!搞懂Git工作原理

如果沒有給提交點的版本號,那麼預設用HEAD。這樣,分支指向不變,但是索引會回滾到最後一次提交,如果用–hard選項,工作目錄也同樣。

圖文詳解!搞懂Git工作原理

如果給了檔案名稱(或-p選項),那麼工作效果和帶有檔案名稱的checkout差不多,除了索引被更新。

圖文詳解!搞懂Git工作原理

Merge

Merge指令把不同分支合併起來。合併前,索引必須和目前提交相同。如果另一個分支是目前提交的祖父節點,那麼合併命令將什麼也不做。另一種情況是如果目前提交是另一個分支的祖父節點,就導致fast-forward合併。指向只是簡單的移動,並產生一個新的提交。

圖文詳解!搞懂Git工作原理

否則就是一次真正的合併。預設把目前提交(ed489 如下所示)和另一個提交(33104)以及他們的共同祖父節點(b325c)進行一次三方合併[4]。結果是先儲存目前目錄和索引,然後和父節點33104一起做一次新提交。

圖文詳解!搞懂Git工作原理

Cherry Pick

cherry-pick指令「複製」一個提交節點並在目前分支做一次完全一樣的新提交。

圖文詳解!搞懂Git工作原理

Rebase

#

衍合是合併指令的另一個選擇。合併把兩個父分支合併進行一次提交,提交歷史不是線性的。衍合在當前分支上重演另一個分支的歷史,提交歷史是線性的。本質上,這是線性化的自動的 cherry-pick。

圖文詳解!搞懂Git工作原理

上面的指令都是在topic分支中進行,而不是master分支,在master分支上重演,並且把分支指向新的節點。注意舊提交沒有被引用,將被回收。

要限制回滾範圍,使用–onto選項。下面的命令在master分支上重演當前分支從169a6以來的最近幾個提交,即2c33a。

圖文詳解!搞懂Git工作原理

同樣有git rebase –interactive讓你更方便的完成一些複雜操作,像是丟棄、重新排列、修改、合併提交。沒有圖片反映這些,細節看這裡:git-rebase(1)[5]。

檔案內容並沒有真正儲存在索引(.git/index)或提交物件中,而是以blob的形式分別儲存在資料庫中(.git/objects),並用SHA-1值來校驗。索引檔案用識別碼列出相關的blob檔案以及別的資料。對於提交來說,以樹(tree)的形式存儲,同樣用對於的哈希值識別。樹對應著工作目錄中的資料夾,樹中包含的 樹或blob物件對應著對應的子目錄和檔案。每次提交都儲存下它的上一層樹的識別碼。

如果用detached HEAD提交,那麼最後一次提交會被the reflog for HEAD引用。但過一段時間就失​​效,最後被回收,與git commit –amend或git rebase很像。

推薦學習:《Git教學

以上是圖文詳解!搞懂Git工作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

git怎麼更新代碼 git怎麼更新代碼 Apr 17, 2025 pm 04:45 PM

更新 git 代碼的步驟:檢出代碼:git clone https://github.com/username/repo.git獲取最新更改:git fetch合併更改:git merge origin/master推送更改(可選):git push origin master

git怎麼下載項目到本地 git怎麼下載項目到本地 Apr 17, 2025 pm 04:36 PM

要通過 Git 下載項目到本地,請按以下步驟操作:安裝 Git。導航到項目目錄。使用以下命令克隆遠程存儲庫:git clone https://github.com/username/repository-name.git

git commit怎麼用 git commit怎麼用 Apr 17, 2025 pm 03:57 PM

Git Commit 是一種命令,將文件變更記錄到 Git 存儲庫中,以保存項目當前狀態的快照。使用方法如下:添加變更到暫存區域編寫簡潔且信息豐富的提交消息保存並退出提交消息以完成提交可選:為提交添加簽名使用 git log 查看提交內容

git下載不動怎麼辦 git下載不動怎麼辦 Apr 17, 2025 pm 04:54 PM

解決 Git 下載速度慢時可採取以下步驟:檢查網絡連接,嘗試切換連接方式。優化 Git 配置:增加 POST 緩衝區大小(git config --global http.postBuffer 524288000)、降低低速限制(git config --global http.lowSpeedLimit 1000)。使用 Git 代理(如 git-proxy 或 git-lfs-proxy)。嘗試使用不同的 Git 客戶端(如 Sourcetree 或 Github Desktop)。檢查防火

git怎麼合併代碼 git怎麼合併代碼 Apr 17, 2025 pm 04:39 PM

Git 代碼合併過程:拉取最新更改以避免衝突。切換到要合併的分支。發起合併,指定要合併的分支。解決合併衝突(如有)。暫存和提交合併,提供提交消息。

git怎麼更新本地代碼 git怎麼更新本地代碼 Apr 17, 2025 pm 04:48 PM

如何更新本地 Git 代碼?用 git fetch 從遠程倉庫拉取最新更改。用 git merge origin/<遠程分支名稱> 將遠程變更合併到本地分支。解決因合併產生的衝突。用 git commit -m "Merge branch <遠程分支名稱>" 提交合併更改,應用更新。

如何解決PHP項目中的高效搜索問題? Typesense助你實現! 如何解決PHP項目中的高效搜索問題? Typesense助你實現! Apr 17, 2025 pm 08:15 PM

在開發一個電商網站時,我遇到了一個棘手的問題:如何在大量商品數據中實現高效的搜索功能?傳統的數據庫搜索效率低下,用戶體驗不佳。經過一番研究,我發現了Typesense這個搜索引擎,並通過其官方PHP客戶端typesense/typesense-php解決了這個問題,大大提升了搜索性能。

git怎麼刪除倉庫 git怎麼刪除倉庫 Apr 17, 2025 pm 04:03 PM

要刪除 Git 倉庫,請執行以下步驟:確認要刪除的倉庫。本地刪除倉庫:使用 rm -rf 命令刪除其文件夾。遠程刪除倉庫:導航到倉庫設置,找到“刪除倉庫”選項,確認操作。

See all articles