亚州天堂爱爱,做爱视频国产全过程在线观看,成人试看30分钟免费视频,女人无遮挡裸交性做爰视频网站

? ? ?

20 分鐘教你搞懂 Git!(git-)

Git 是最流行的版本管理工具,也是程序員必備的技能之一。本文就來教你 20 分鐘搞懂 Git!

0

以下為譯文:

盡管每天你都會用到Git,但也有可能搞不懂它的工作原理。為什么Git可以管理版本?基本命令git add和git commit到底在干什么?

在這篇文章中,我將用一個例子來解釋Git的運行過程,幫助你理解Git的工作原理。

0

1.初始化

讓我們創建一個項目的目錄,然后進入該目錄。

$ mkdir git-demo-project$ cd git-demo-project

如果想管理項目的版本,那么我們應該做的第一件事情就是通過git init初始化。

$ git init

git init只做了一件事情,那就是在項目的根目錄下創建.git子目錄來保存版本信息。

$ ls .gitbranches/configdescriptionHEADhooks/info/objects/refs/

上述命令顯示了.git子目錄中的內容。

2.保存對象

接下來讓我們創建一個新的空文件test.txt。

$ touch test.txt

然后把這個文件添加到Git代碼庫中,這一步將創建test.txt現有內容的一個副本。

$ git hash-object -w test.txte69de29bb2d1d6434b8b29ae775ad8c2e48c5391

在上述代碼中,git hash-object命令將test.txt現有的內容壓縮成二進制文件,并保存到Git中。該壓縮文件叫做Git對象,保存在.git/objects目錄中。

我們可以通過這個命令根據對象的文件名獲取當前內容,并計算成SHA1 哈希(長度為40的字符串)。讓我們看看下列新生成的Git對象文件。

$ ls -R .git/objects.git/objects/e6:9de29bb2d1d6434b8b29ae775ad8c2e48c5391

如上述代碼所示,.git/objects目錄下又多出了一個子目錄,而且這個子目錄名是上述哈希值的前兩個字符。在這個子目錄下有一個文件,文件名是上述哈希值中其余的38個字符。

讓我們再來看看文件內容。

$ cat .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

上述代碼輸出的文件內容是一些二進制字符。你可能會問既然test.txt是空文件,又怎么會有這些內容呢?這是因為該二進制對象中還存儲了一些元數據。

如果你想看看該文件原始的文本內容,那么應該使用git cat-file。

$ git cat-file -p e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

因為原文件為空,所以上述命令什么都沒有顯示。現在我們往test.txt文件中寫點東西。

$ echo \’hello world\’ > test.txt

這個文件的內容已經改變了,所以你需要再次把它保存為Git對象。

$ git hash-object -w test.txt3b18e512dba79e4c8300dd08aeb37f8e728b8dad

如上述代碼所示,test.txt的哈希值已經隨著文件內容的改變而發生了變化。同時還生成了新文件.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad。現在你可以看到這個文件的內容了。

$ git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dadhello world

3.更新索引

當文件保存成二進制對象以后,你需要告訴Git哪個文件發生了變化。Git會在一個名叫“索引”(或階段)的區域記錄所有發生了變化的文件。然后等到所有的變更都結束后,將索引中的這些文件一起寫入正式的版本歷史記錄中。

$ git update-index –add –cacheinfo 100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt

上述命令記錄了文件名test.txt、二進制對象名(哈希值)以及索引中文件的訪問權限。

git ls-files命令可以顯示索引中當前的內容。

$ git ls-files –stage100644 3b18e512dba79e4c8300dd08aeb37f8e728b8dad 0 test.txt

上述代碼顯示索引中只有一個test.txt文件,還顯示了該文件的二進制對象名和訪問該文件的權限。如果你知道該二進制對象名,就可以查看.git/objects子目錄中該文件的內容。

git status命令可以輸出更多可讀的結果。

$ git statusChanges to submit: The new file: test.txt

上述代碼顯示索引中只有一個新文件test.txt,該文件正在等候寫入版本的歷史記錄中。

4.git add命令

針對每個文件執行上述兩個步驟非常繁瑣。所以Git提供了git add命令來簡化這些操作。

$ git add –all

上述命令相當于針對當前項目中所有發生了變化的文件執行上述兩個步驟。

5.提交(Commit)

索引保存發生了變化的文件信息。等到修改完成,所有這些信息都會被寫入版本的歷史記錄中,這相當于生成一個當前項目的快照。

項目的歷史記錄由不同時間點的項目快照組成。Git可以將項目恢復成任何一個快照。在Git中“快照”有一個專門的術語,即“提交”(commit)。所以生成快照也可以稱之為完成提交。

下列所有“快照”的引用指的都是提交。

6.完成提交

首先,我們需要設置用戶名和郵件地址。在你保存快照的時候,Git需要記錄是誰執行的提交。

$ git config user.name \”username\” $ git config user.email \”Email address\”

接下來,保存現有的目錄結構。在本文的前面我們討論了保存對象只會保存一個文件,并不會記錄文件之間的目錄結構。

git write-tree命令可以根據當前目錄結構生成一個Git對象。

$ git write-treec3b8bb102afeca86037d5b5dd89ceeb0090eae9d

在上述代碼中,目錄結構保存成了二進制對象,而對象的名字是哈希值。它也保存在.git/objects目錄中。

讓我們來看看該文件的內容。

$ git cat-file -p c3b8bb102afeca86037d5b5dd89ceeb0090eae9d100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad test.txt

可以看到,當前目錄中只有一個文件test.txt。

這個所謂的快照就是保存當前的目錄結構,以及每個文件相對應的二進制對象。之前的操作已經保存了文件結構,所以現在你需要把這個目錄結構和一些元數據一起寫入版本的歷史記錄中。

git commit-tree可以將目錄樹對象寫入到版本的歷史記錄中。

$ echo \”first commit\” | git commit-tree c3b8bb102afeca86037d5b5dd89ceeb0090eae9dc9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

在上述代碼中,在提交時你需要提供提交的描述,而且你可以通過echo \”first commit\”提供提交描述。git commit-tree命令會根據元數據以及目錄樹生成一個Git對象。現在,讓我們來看看該對象的內容。

$ git cat-file -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fatree c3b8bb102afeca86037d5b5dd89ceeb0090eae9dauthor jam 1538889134 0800committer jam 1538889134 0800first commit

在上述代碼中,第一行輸出是對應于該快照的目錄樹對象,而第二行和第三行是有關作者和提交者的信息,最后一行內容是提交的描述。

通過git log命令我們還可以查看某個快照的信息。

$ git log –stat c9053865e9dff393fd2f7a92a18f9bd7f2caa7facommit c9053865e9dff393fd2f7a92a18f9bd7f2caa7faAuthor: jam Date: Sun Oct 7 13:12:14 2018 0800 first commit test.txt | 1 1 file changed, 1 insertion( )

7.git commit命令

Git提供了git commit來簡化上述提交操作。在保存到索引后,你只需要執行git commit命令,就可以同時提交目錄結構和描述,并生成快照。

$ git commit -m \”first commit\”

另外,還有兩個命令也非常實用。

通過git checkout命令,我們可以切換到某個快照。

$ git checkout c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

通過git show命令,我們可以顯示某個快照的所有代碼變更。

$ git show c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

8.分支(branch)

然而,如果你使用git log命令來查看整個版本的歷史記錄時,卻無法看到剛剛生成的快照。

$ git log

上述命令輸出為空。這是為什么?這個快照剛剛不是寫入到歷史記錄中了嗎?

真相是:git log命令只可以顯示當前分支上的變化。盡管我們已經提交了這個快照,但是還沒有記錄這個快照屬于哪個分支。

分支是快照的指針,分支的名字就是該指針的名字。雖然哈希值不可讀,但是分支允許用戶給快照起別名。另外,分支還會自動更新,如果當前分支是一個新的快照,那么這個指針會自動指向它。例如,主分支(master branch)有一個名為master的指針指向主分支當前的快照。

用戶可以為任何快照創建新指針。例如,如果你想創建一個新的fix-typo分支,那么只需創建一個名為fix-typo的指針,并指向一個快照。因此,在Git中創建一個新分支非常容易,而且開銷非常低。

Git有一個特殊的指針HEAD,它始終指向當前分支中最新的那個快照。另外,Git還提供了快捷方式。例如,HEAD^指向HEAD之前的快照(父節點),而HEAD~6指向HEAD之前的第六個快照。

每個分支的指針都是一個文本文件,存儲在.git/refs/heads/目錄中。文件的內容是它指向的快照的二進制文件名(哈希值)。

9.更新分支

下面我們將演示如何更新分支。首先,修改test.txt。

$ echo \”hello world again\” > test.txt

然后保存二進制對象。

$ git hash-object -w test.txtc90c5155ccd6661aed956510f5bd57828eec9ddb

接下來,將該對象寫入索引,并保存目錄結構。

$ git update-index test.txt$ git write-tree1552fd52bc14497c11313aa91547255c95728f37

最后,提交目錄結構,并生成一個快照。

$ echo \”second commit\” | git commit-tree 1552fd52bc14497c11313aa91547255c95728f37 -p c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa785f188674ef3c6ddc5b516307884e1d551f53ca

在上述代碼中,我們可以通過git commit-tree命令的參數-p來指定父節點,即以哪個快照為基礎。

下面我們把快照的哈希值寫入到.git/refs/heads/master文件中,并讓master指針指向該快照。

$ echo 785f188674ef3c6ddc5b516307884e1d551f53ca > .git/refs/heads/master

現在,通過git log命令你可以看到兩個快照了。

$ git logcommit 785f188674ef3c6ddc5b516307884e1d551f53ca (HEAD -> master)Author: jam Date: Sun Oct 7 13:38:00 2018 0800 second commitcommit c9053865e9dff393fd2f7a92a18f9bd7f2caa7faAuthor: jam Date: Sun Oct 7 13:12:14 2018 0800 first commit

git log命令的運行過程大致如下:

  • 找到HEAD指針對應的分支。在上述示例中為master。
  • 找到master指針指向的快照。在上述示例中為785f188674ef3c6ddc5b516307884e1d551f53ca。
  • 找到父節點(即前一個快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa。
  • 等等,最后顯示當前分支中所有的快照。

另外,上述我們曾提到分支指針是動態的,下述三個命令會自動覆蓋分支指針。

  • Git commit:當前分支的指針將移動到新創建的快照上。
  • Git pull:在當前分支和遠程分支合并后,指針會指向新創建的快照。
  • Git reset [commit_sha]:當前分支的指針將被復位到某個指定的快照上。

原文:https://www.tutorialdocs.com/article/how-git-works.html

作者:Alex

譯者:彎月,責編:郭芮

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

(0)
上一篇 2024年7月8日 上午11:57
下一篇 2024年7月8日 下午12:08

相關推薦

  • 農村流動黨員如何管理?這個地方有新招(農村流動黨員如何管理-這個地方有新招人嗎)

    為加強和改進農村流動黨員管理工作,根據《中國共產黨章程》《中國共產黨黨員教育工作條例》及黨內有關規定,南通市制定了《關于加強和改進農村流動黨員管理工作的意見》。讓我們一起來看。 來…

    科研百科 2023年6月8日
    156
  • 科研項目評判指標

    科研項目評判指標 科研項目的評判指標是衡量項目質量的重要標準。合理的評判指標能夠幫助評估項目的成果,并為改進項目提供有價值的信息。本文將介紹一些常用的科研項目評判指標。 1. 研究…

    科研百科 2025年3月6日
    1
  • 項目管理5大工具

    項目管理是組織管理中非常重要的一環,它涉及到計劃、組織、協調和控制項目的過程和成果。在項目管理中,常用的工具包括: 1. 項目計劃工具:項目計劃工具是用來創建和管理項目計劃的工具,…

    科研百科 2025年1月12日
    3
  • 蘇州市科技局項目管理平臺(蘇州科技計劃項目管理系統)

    蘇州科技計劃項目管理系統蘇州科技計劃項目管理系統蘇州科技發展中心蘇州科技 項目管理管理系統包括公司中新社 (一)1.公司計劃:1.公司的計劃2.員工的計劃3.專業組的計劃4.企業的…

    科研百科 2024年7月30日
    33
  • mendix低代碼開發平臺干嘛的

    Mendix低代碼開發平臺是一種強大的工具,可以幫助開發人員快速構建和部署企業級應用程序。它提供了一種簡化的開發環境,使開發人員能夠使用少量的編碼來創建復雜的應用程序。 首先,Me…

    科研百科 2024年2月28日
    58
  • 會議管理辦法

    會議管理辦法 為規范會議管理,保障會議安全、有序、高效進行,根據《中華人民共和國合同法》和其他相關法律法規,制定本管理辦法。 第一條 本管理辦法適用于中華人民共和國境內召開的各類會…

    科研百科 2024年9月18日
    19
  • 技術基礎計量科研項目

    技術基礎計量科研項目簡介 隨著科技的不斷進步,計量技術作為科技的重要組成部分,也在不斷發展壯大。技術基礎計量科研項目是為了更好地推進計量技術的發展,提升計量技術的應用水平,而開展的…

    科研百科 2025年3月12日
    0
  • 涼山農商銀行領導班子

    涼山農商銀行領導班子 涼山農商銀行是四川省涼山彝族自治州一家地方性商業銀行,成立于2011年,是涼山地區唯一一家具備獨立法人資格的地方金融機構。作為一家位于偏遠山區的銀行,涼山農商…

    科研百科 2024年12月4日
    3
  • 廣東省衛計委醫學科研項目有哪些(廣東省衛計委醫學科研項目)

    廣東省衛計委醫學科研項目 近年來,廣東省衛計委一直致力于推進醫學科技創新,提高醫療服務水平。在這個背景下,我們開始了一項關于“精準醫療”的研究項目。 精準醫療是指通過先進的醫學技術…

    科研百科 2024年4月10日
    66
  • 負責人承擔科研項目情況怎么寫

    科研項目負責人是科研項目的重要組成部分,他們的工作直接關系到項目的成功與否。因此,承擔科研項目負責人需要具備一定的科研能力和責任心,同時也需要具備良好的溝通能力和團隊協作能力。 在…

    科研百科 2024年12月3日
    1