歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網

圖解Git

日期:2017/2/28 14:25:29   编辑:Linux教程

GIT是非常優秀的版本控制工具,但是苦於git那晦澀難懂的man pages,還有眾多的命令選項和怪異的用法,git有點難學。這篇文章分享我學習過程中收藏的一些好圖,並圍繞這些圖講講我對git的理解,希望對大家有所幫助。

GIT工作流程

了解git,首先要弄清楚對象在被git管理過程中所處的4個階段,分別是:工作目錄、index(又稱為暫存區)、本地倉庫和遠程倉庫。從時間先後來講,工作目錄的內容是你當前看到的,也是最新的;index區標記了你當前工作目錄中,哪些內容是被git管理的;而本地倉庫保存了對象被提交過的各個版本,比起工作目錄和暫存區的內容,它要更舊一些;遠程倉庫是本地倉庫的異地備份,遠程倉庫的內容可能被分布在多個地點的處於協作關系的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內容是最舊的。任何對象都是在工作目錄中誕生和被修改;任何修改都是從進入index區才開始被版本控制;只有把修改提交到本地倉庫,該修改才能在倉庫中留下痕跡;而要與協作者分享本地的修改,可以把它們push到遠程倉庫來共享。圖最上方的add、commit、push等,展示了git倉庫的產生過程。反過來,我們可以從遠程歷史倉庫中獲得本地倉庫的最後一個版本,clone到本地,從本地檢出對象的各個版本到index暫存區或工作目錄中,從而實現任何對象或整個倉庫的任意階段狀態的”回滾”。當正向和反向都能自由切換後,git就強大到無所不能了。

Linux git命令參數及用法詳解 http://www.linuxidc.com/Linux/2012-01/51205.htm

Fedora通過Http Proxy下載Git http://www.linuxidc.com/Linux/2009-12/23170.htm

在Ubuntu Server上安裝Git http://www.linuxidc.com/Linux/2009-06/20421.htm

服務器端Git倉庫的創建(Ubuntu) http://www.linuxidc.com/Linux/2011-02/32542.htm

Linux下Git簡單使用教程(以Android為例) http://www.linuxidc.com/Linux/2010-11/29883.htm

Git權威指南 PDF高清中文版 http://www.linuxidc.com/Linux/2013-10/91053.htm

Git 2分鐘指南 http://www.linuxidc.com/Linux/2014-11/109201.htm

一開始接觸這些概念可能比較繞,其實在git入門階段,可以先拋開遠程倉庫不看,只了解管理本地倉庫的”3棵樹”就夠了。如下圖:

常用GIT命令

在開始之前,我們需要把下面的圖看懂:

  • HEAD,頭,它始終指向當前所處分支的最新的提交點。你所處的分支變化了,或者產生了新的提交點,HEAD就會跟著改變。
  • working directory,它是你的工作目錄,也是當前你看到的東西。你的工作目錄是與版本、分支相關的。
  • stage的東西雖然看不見,但是執行git status就會看到哪些對象的修改將在下一次commit的時候被放進本地倉庫。這些東西稱為stage。

commit

commit把暫存區的內容存入到本地倉庫,並使得當前分支的HEAD向後移動一個提交點。如果對最後一次commit不滿意,可以使用git commit --amend來進行撤銷,修改之後再提交。如圖所示的,ed489被4ca87取代,但是git log裡看不到ed489的影子,這也正是amend的本意:原地修改,讓上一次提交不露痕跡。

checkout

checkout用來檢出並切換分支。checkout成功後,HEAD會指向被檢出分支的最後一次提交點。對應的,工作目錄、暫存區也都會與當前的分支進行匹配。下圖是執行git checkout maint後的結果:

reset

reset命令把當前分支指向另一個位置,並且相應的變動工作目錄和索引。如下圖,執行git reset HEAD~3後,當前分支相當於回滾了3個提交點,由ed489回到了b325c:

reset有3種常用的模式:
—soft,只改變提交點,暫存區和工作目錄的內容都不改變
—mixed,改變提交點,同時改變暫存區的內容。這是默認的回滾方式
—hard,暫存區、工作目錄的內容都會被修改到與提交點完全一致的狀態

diff

我們在commit、merge、rebase、打patch之前,通常都需要看看這次提交都干了些什麼,於是diff命令就派上用場了:

來比較下上圖中5種不同的diff方式:

  • 比較不同的提交點之間的異同,用git diff 提交點1 提交點2
  • 比較當前分支與其他分支的異同,用git diff 其他分支名稱
  • 在當前分支內部進行比較,比較最新提交點與當前工作目錄,用git diff HEAD
  • 在當前分支內部進行比較,比較最新提交點與暫存區的內容,用git diff --cached
  • 在當前分支內部進行比較,比較暫存區與當前工作目錄,用git diff
    看起來有點復雜?是的,記不住的時候就看看這些圖吧。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-11/109856p2.htm

Copyright © Linux教程網 All Rights Reserved