搜尋
首頁開發工具Git圖文詳解!搞懂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中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
什麼是簡單的話?什麼是簡單的話?Apr 09, 2025 am 12:12 AM

Git是一個開源的分佈式版本控制系統,幫助開發者跟踪文件變化、協同工作和管理代碼版本。它的核心功能包括:1)記錄代碼修改,2)回退到之前版本,3)協同開發,4)創建和管理分支進行並行開發。

git和github相同嗎?git和github相同嗎?Apr 08, 2025 am 12:13 AM

Git和GitHub不是同一回事。 Git是版本控制系統,GitHub是基於Git的代碼託管平台。 Git用於管理代碼版本,GitHub提供在線協作環境。

如何將github用於HTML?如何將github用於HTML?Apr 07, 2025 am 12:13 AM

使用GitHub管理HTML項目的原因是它提供了版本控制、協作開發和展示作品的平台。具體步驟包括:1.創建並初始化Git倉庫,2.添加和提交HTML文件,3.推送到GitHub,4.使用GitHubPages部署網頁,5.利用GitHubActions自動化構建和部署。此外,GitHub還支持代碼審查、Issue和PullRequest功能,幫助優化和協作開發HTML項目。

我應該從git還是github開始?我應該從git還是github開始?Apr 06, 2025 am 12:09 AM

從Git開始更適合深入理解版本控制原理,從GitHub開始更適合關注協作和代碼託管。 1.Git是一個分佈式版本控制系統,幫助管理代碼版本歷史。 2.GitHub是一個基於Git的在線平台,提供代碼託管和協作功能。

Microsoft是否擁有Git或Github?Microsoft是否擁有Git或Github?Apr 05, 2025 am 12:20 AM

微軟不擁有Git,但擁有GitHub。 1.Git是林納斯·托瓦茲在2005年創建的分佈式版本控制系統。 2.GitHub是基於Git的在線代碼託管平台,成立於2008年,微軟於2018年收購。

我應該把git或github放在簡歷上嗎?我應該把git或github放在簡歷上嗎?Apr 04, 2025 am 12:04 AM

在簡歷上應根據職位要求和個人經驗選擇寫Git還是GitHub。 1.如果職位要求Git技能,突出Git。 2.如果職位看重社區參與,展示GitHub。 3.確保詳細描述使用經驗和項目案例,以完整句子結束。

為什麼Gitlab比Github更好?為什麼Gitlab比Github更好?Apr 03, 2025 am 12:08 AM

GitLab更適合某些開發者和團隊,因為它提供了完整的DevOps工具鍊和強大的CI/CD功能。 1.GitLab的CI/CD功能集成在平台內部,支持從代碼提交到部署的全流程自動化。 2.其服務器端渲染技術提升了大型項目的頁面加載速度。 3.GitLab的權限管理系統更加靈活,支持細粒度控制。

Github難以學習嗎?Github難以學習嗎?Apr 02, 2025 pm 02:45 PM

GitHub不難學。 1)掌握基礎知識:GitHub是基於Git的版本控制系統,幫助追踪代碼變化和協作開發。 2)理解核心功能:版本控制記錄每次提交,支持本地工作和遠程同步。 3)學習使用方法:從創建倉庫到推送提交,再到使用分支和拉取請求。 4)解決常見問題:如合併衝突和忘記添加文件。 5)優化實踐:使用有意義的提交消息,清理分支,使用項目板管理任務。通過實踐和社區交流,GitHub的學習曲線並不陡峭。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1

記事本++7.3.1

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

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具