歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 六百字讀懂Git

六百字讀懂Git

日期:2017/2/28 14:23:20   编辑:Linux教程

譯注:來自 Hacker School 的 Mary Rose Cook 最近實現了一個純 JavaScript 寫就的 Git:Gitlet,包括了 Git 核心命令的概念實現。Mary 說,這個項目一是為了了解 Git 內部原理,二是希望寫一篇深入淺出解釋 Git 核心概念的短文。最好的學習方法就是親自去實現它,而 Git 的核心功能代碼也不過 300 行。相應的代碼在 Github 上。短文很有趣,思路清晰也足夠深入,值得一看。

設想你現在位於 alpha/ 目錄下,這裡有一個文本文件 number.txt,裡面的內容只有一個詞:“first”。

現在執行 git init 將這個 alpha 文件夾初始化為 Git 倉庫。

執行 git add number.txt 會將 number.txt 添加到 Git 的索引(index)中。這個索引記錄了所有 Git 保持追蹤的文件,現在它有了一個映射記錄 number.txt -> first,同時 add 命令還會把一個包含了 first 字符串的二進制對象加入 Git 的對象數據庫裡。

現在執行 git commit -m first。這條命令會做三件事情。首先在對象數據庫內創建一個樹對象,用以記錄 alpha 目錄下的文件列表,這個對象有一個指針指向前面 git add 命令創建的 first 二進制對象;第二,這條命令還會創建一個 commit 對象用以代表剛剛提交的版本,它包含一個指針指向剛剛的樹對象;第三,master 分支也會指向這個新創建的 commit 對象。

現在執行 git clone . ../beta。它會創建一個新目錄 beta 並將其初始化為 Git 倉庫,然後把 alpha 倉庫的對象數據庫中所有對象拷貝給 beta 的對象數據庫,將 beta 的 master 分支像 alpha 的 master 一樣指向相應的對象。它還根據 first提交的內容配置索引,並根據索引更新目錄下的文件——也就是 number.txt

現在切換到 beta 目錄,修改 number.txt 的內容為“second”,執行 git add number.txtgit commit -m second,新創建的提交對象 second(譯注:姑且稱之為 second)會有一個指向父提交(first)的指針,表示 second 繼承自 first,而 master 分支則指向 second 提交。

回到 alpha 目錄,執行 git remote add beta ../beta,將 beta 倉庫設為遠程倉庫。然後執行 git pull beta master

在這條命令背後,它其實會執行 git fetch beta master,從 beta 倉庫中找到 second 提交的相關對象拷貝到 alpha 倉庫;把 alpha 中關於 beta 的 master 分支記錄指向這個 second 提交;更新 FETCH_HEAD 指向剛剛從 beta 倉庫拉取的 master 分支,還是這個 second 提交。

此外,pull 命令還會執行 git merge FETCH_HEAD。從 FETCH_HEAD 得知最近拉取的分支是 beta 倉庫的 master 分支,據此拿到相應的對象,也就是 second 提交對象。此時 alpha 的 master 分支指著 first 提交,正好是 second 的祖先提交,於是對於 merge 命令來說只需要將 master 分支指向 second 提交即可。接下來 merge 命令還會更新索引以匹配 second 提交的內容,並且相應更新工作目錄中的文件。

現在執行 git branch red,創建一個名為“red”、指向 second 提交的新分支。

然後執行 git checkout red。在 checkout 之前,HEAD 指向 master 分支,執行命令之後它就指向了 red 分支,使得 red 成為當前分支。

接下來把 number.txt 的內容修改為 “third”,執行 git add numbers.txtrun git commit -m third

之後再執行 git push beta red,這條命令會把 alpha 倉庫內跟 third 提交相關的對象拷貝至 beta 倉庫,並且將(alpha 倉庫內記錄的)beta 倉庫 red 分支指向 third 提交。就醬。

英文原文:Git in 600 words

GitHub 教程系列文章

GitHub 使用教程圖文詳解 http://www.linuxidc.com/Linux/2014-09/106230.htm

Git 標簽管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm

Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm

Git 遠程倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm

Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm

Git 服務器搭建與客戶端安裝 http://www.linuxidc.com/Linux/2014-05/101830.htm

Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm

分享實用的GitHub 使用教程 http://www.linuxidc.com/Linux/2014-04/100556.htm

Git 的詳細介紹:請點這裡
Git 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved