git 推送到远程仓库,但似乎没有任何内容上传到仓库

git push to remote repo, but seems nothing is uploaded on repo

我正在 mac 并尝试 "git push" 到本地 repo 模拟器目录:

mkdir ~/gitremote
cd ~/gitremote
git init --bare

然后在另一个目录中:

git clone /Users/trosky/gitremote
vi readme (add one line)
git add .
git commit -m "1st file"
git push -u origin master

Counting objects: 2, done.
Writing objects: 100% (2/2), 211 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To /Users/trosky/gitremote/
   c0a3498..ff5511b  master -> master
Branch master set up to track remote branch master from origin.

一切似乎都很好。但是在 ~/gitremote:

$ls
HEAD        config      hooks       objects
branches    description info        refs

似乎 "readme" 文件根本没有上传。 我多次尝试这个测试,总是同样的问题。当我可以成功 git 推送到 master 时会发生什么,而 "remote" 回购没有任何东西。

您的提交已成功记录在 gitremote 存储库中。尝试再次克隆 repo,您​​将看到“第一个文件”提交。

Git 不推送文件。就此而言,存储库也不存储文件——至少不直接存储(但请参阅接下来的几段)。存储库存储 提交 ,并且 git 推送提交。

--bare 克隆的重点是避免有任何文件,这样就没有文件会妨碍提交。如果您在那里确实有文件,它们可能会阻止更新提交。

你可能会想:没有文件的系统有什么用?事实上,这一点都不好,所以存储库存储提交,每个提交代表一个充满文件的整个目录树的 快照 。然后,您可以指示 Git 从存储库中保存的所有提交集中提取 any 提交。

现在,如果并且当您 指示 Git 提取一些提交 — 使目录充满保存在该特定提交中的每个文件 — 您需要给 Git 一个地方来 放置 这些文件。一个普通的非 --bare 存储库有一个显着的位置,称为 work-tree (或有时 working-tree 或相似的)。此工作树允许您查看所有文件、更改它们、添加新文件、删除文件,然后根据结果进行 new 提交。

换句话说,工作树就是你工作的地方。

如果你在你的工作树中做你的工作,并且其他人将一个提交推送到你的存储库,那新提交用于用他们的提交树替换你的工作树,你的所有工作会发生什么?这一切都会丢失!因此,当您的存储库有工作树时,Git 通常会拒绝推送到您的存储库。1

因此,Git 提供 bare 存储库。裸存储库是没有工作树的存储库。没有工作树,没有人可以在其中工作,所以 push 不会丢失工作。因此,它是您始终可以安全推动的地方。这是 全部,但这非常重要。

如果你想查看被推送到裸仓库的提交(及其文件),你可以制作一个非裸克隆,然后从推送的 fetch到存储库,进入非裸克隆,然后 检查 有问题的提交。这将用他们的工作取代你的工作2——但既然说"do it now"你一定是那个意思,而不是粗鲁地让你的工作被他们的工作覆盖只是因为他们现在碰巧推送了。

正如脚注所暗示的那样,对此有很多注意事项和调整,但这是基本设置。裸克隆纯粹是为了推进,非裸克隆是你工作的地方。


1其实只有在push到当前分支的时候才可以控制

2通常的 git checkout 还试图确保您不会丢失任何您自己未保存的工作。你可以告诉它 "force" 覆盖你自己的工作,或者使用 git reset --hard 先丢弃你自己的工作,这里有很多复杂的边缘情况,但 Git 通常会处理所有 提交的数据 永久且不可磨灭。工作树数据要少得多。