作者: Mary Rose Cook
原文地址
git操作的涉及的位置:
“working-copy”<————>”index”<————>”database”
“working-copy”<—————————-————>”database”
- 创建目录 ”alpha”, 在”alpha”目录下创建文本文件 ”number.txt”, 设置文件内容为 “first”.
- 到 ”alpha” 目录下执行 “git init”.
该命令将 “alpha” 设置为 Git仓库.
- 执行命令 “git add number.txt”, 将 “number.txt” 加入到 “index”.
“index” 是Git所管理之文件之列表. “index” 映射文件名到文件内容. 此时它包含一个映射 “number.txt -> first”. 这个命令的执行也在Git的对象数据库里增加了一个blob对象, blob对象里包含了”first”文本.
- 执行命令 “commit -m first”. 这个命令导致了三件事:
- 在Git的对象数据库里创建了一个”tree”对象. 这个对象代表了”alpha”目录顶层的 ”items”的列表. 这个对象有一个指针指向之前通过 ”git add” 创建的包含了first的blob对象.
- 创建了一个”commit”对象, 代表了你刚刚 ”commit” 的仓库的版本.
- 将 ”master” 分支指向了刚刚创建的 ”commit” 对象.
- 执行命令 ”git clone . ../beta”.
这条命令创建了一个新的目录, 目录名为”beta”. “beta” 已经被初始化为一个Git仓库. “alpha” 对象数据库中的对象被复制到了”beta”中. “beta”仓库里的“master”分支和”alpha”中指向相同的”commit”对象. “beta”中的”index”被设置为”first commit”中的内容. 文件“number.txt”从index中得到更新.
- 进入”beta”目录. 将”number.txt”的内容修改为”second”. 执行”git add number.txt”和”git commit -m second”.
commit对象被创建, 并且有一个指针指向它的parent— “first” commit. commit命令将master分支指向”second commit”.
- 回到”alpha”目录. 执行”git remote add beta ../beta”命令.
这个命令将beta仓库设置为一个远程仓库.
- 执行命令 “git pull beta master”
一条pull命令相当于多条命令:
- 执行 “git fetch beta master”. 这条命令找到”beta”仓库里的“socond commit”的对象们, 把它们拷贝到”alpha” 仓库. 命令将alphpa中的beta的的记录的master指向第二个commit对象. FETCH_HEAD被更新, 用来显示master brach取自beta仓库.
- 执行命令 ”git merge FETCH_HEAD”. FETCH_HEAD被读出. 它显示beta仓库上得master brach是最新获得的分支. 可知alpha的记录中的beta的master指向的commit对象, 正是第二个commit. alpha的master brach指向第一个commit. 这意味着, 要完成这次合并, merge命令只要将master分支指向第二个commit. merge命令更新index, 将第二个commit的内容映射入. 将工作备份从index镜像.
- 执行命令 “git brach red”.
命令创建一个名为”red”的分支, 指向第二个commit object.
- 执行 “git checkout red”.
checkout前, HEAD指向 master分支. 现在HEAD指向了red分支. 命令使red分支成为了”当前分支”.
- 设”number.txt”内容为”third”. 执行”git add numbers.txt”, 再执行“git commit -m third”
- 执行”git push beta red”.
此命令寻第三个commit的对象, 并从alpha仓库复制至beta仓库. 并将beta仓库的red分支指向第三个commit对象.
- 若你想学习Git的内里和细节, 可以读文章: Git由内到外.
(If you would like to learn about the internals of Git in detail, you can read my essay, Git from the inside out.)