圖解Git_圖解

來源:互聯網
上載者:User
圖解Git 其他語言:  Deutsch  English  Español  Français  Italiano  日本語  한국어  Polski  Português  Русский  Slovenčina  Tiếng Việt  正體中文

此頁圖解git中的最常用命令。如果你稍微理解git的工作原理,這篇文章能夠讓你理解的更透徹。 如果你想知道這個網站怎樣產生,請前往GitHub repository。 本文 基本用法 約定 命令詳解 Diff Commit Checkout Detached HEAD(匿名分支提交) Reset Merge Cherry Pick Rebase 技術說明 基本用法

上面的四條命令在工作目錄、臨時目錄(也叫做索引)和倉庫之間複製檔案。 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 commit -a 相當於運行 git add 把所有目前的目錄下的檔案加入暫存地區再運行。git commit. git commit files 進行一次包含最後一次提交加上工作目錄中檔案快照的提交。並且檔案被添加到暫存地區。 git checkout HEAD -- files 復原到複製最後一次提交。 約定

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

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

有許多種方法查看兩次提交之間的變動。下面是一些樣本。 Commit

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

即便當前分支是某次提交的祖父節點,git會同樣操作。下圖中,在master分支的祖父節點maint分支進行一次提交,產生了1800b。 這樣,maint分支就不再是master分支的祖父節點。此時,合并 (或者 衍合) 是必須的。

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

另一個例子是分離HEAD提交,後文講。 Checkout

checkout命令用於從曆史提交(或者暫存地區)中拷貝檔案到工作目錄,也可用於切換分支。

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

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

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

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

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

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

reset命令把當前分支指向另一個位置,並且有選擇的變動工作目錄和索引。也用來在從曆史倉庫中複製檔案到索引,而不動工作目錄。

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

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

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

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

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

cherry-pick命令"複製"一個提交節點並在當前分支做一次完全一樣的新提交。 Rebase

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

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

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

同樣有git rebase --interactive讓你更方便的完成一些複雜操作,比如丟棄、重排、修改、合并提交。沒有圖片體現這些,細節看這裡:git-rebase(1) 技術說明

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

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


from: https://marklodato.github.io/visual-git-guide/index-zh-cn.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.