SHA 计算
SHA 是父对象哈希、树哈希、作者姓名和电子邮件、时间戳、提交消息文本以及提交中涉及的文件的结果。 (以及 GPG 签名,如果有的话。)
这就是为什么如果您更改提交消息或重新提交提交,您最终会得到一个新的 SHA。
存储库中的其余文件不直接参与该 SHA,但提交的父级的 SHA 是计算的一部分,因此它们是间接参与的。
您可以使用cat-file 查看所涉及的元数据。获取提交 ID 并执行以下操作:
$ git cat-file -p 3d911c37dc7cc6d50af9cbc66aa36084158308f5
tree 487660899e53bef8b15d3e1692172f689ed965c5
parent aa3b68973e845b7a900ab164603f154c8a1ba1c5
author Dan Lowe <dan@xxxxxx.com> 1483760015 -0500
committer Dan Lowe <dan@xxxxxx.com> 1483760015 -0500
Update line number settings in vim for 7.4+
在这里,我们看到树对象、一个父对象、作者和提交者,以及提交消息文本。未显示附加的文件对象,但它们在那里。在某些情况下,还存在第二个父级(例如合并提交)。
Git 客户端和服务器
所有 git 存储库都是完整的存储库(除了浅克隆)。因此,如果您在笔记本电脑上创建一个新的存储库,它就是一个完整的存储库。您可以添加、删除、提交、变基,所有这些操作都是完全本地的。整个存储库历史记录都在您的笔记本电脑上。这就是 git 如此擅长离线工作的原因之一。
但是,大多数人认为这还不够。他们需要与其他开发人员共享代码,或将其发布以供公众使用。这是 Github、Bitbucket 等服务的目的。
这些服务只是完整存储库的另一个副本,您正在与之同步。
您可以尝试以下方法。我将使用命令行 git 而不是 SourceTree。
## Make two repositories
mkdir a && cd a && git init
cd ..
mkdir b && cd b && git init --bare
## Add some content to 'a'
cd ../a
touch a.txt && git add . && git commit -m "New content"
## Set the other repository as your remote
git remote add origin ../b
## Let's push!
git push -u origin master
## Take a look at 'b' now...
cd ../b
git log
... 你从 a 提交的内容就在那里。你刚刚做了一个 git 服务器!虽然不是最有用的,因为它就在你的磁盘上。但是如果你把一些 SSH 或 https 服务器放在中间......现在你有了 Github,只是没有花哨的 Web 界面部分。