将git推送到远程仓库,但似乎没有上传到仓库。

3

我正在使用 mac,尝试向本地存储库模拟器目录执行 "git push" 命令:

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 push,而“远程”仓库中没有任何东西会发生什么。


你可能没有推到你想要的地方...顺便问一下,裸仓库的原因是什么? - Tim Biegeleisen
2个回答

6
Git不会推送文件。实际上,仓库也不直接存储文件(但请参阅下面几段)。仓库存储提交,而Git则推送提交。
--bare克隆的整个目的是避免有任何文件,这样就没有文件会妨碍提交。如果你在那里有文件,则可能会阻止更新提交。
你可能会想:一个没有文件的系统有什么用?确实,它将毫无用处,因此仓库存储提交,每个提交表示整个文件目录树的快照。然后,您可以指示Git从存储在仓库中的所有提交集合中提取任何提交。
现在,如果您确实指示Git提取某个提交-使目录中包含保存在该特定提交中的每个文件,您需要给Git一个放置这些文件的位置。非 --bare 仓库有一个专门的位置,称为工作树(或类似的工作树),它让您查看所有文件,更改它们,添加新文件,删除文件,然后从结果中创建一个新提交。
换句话说,工作树是您的工作区。
如果您正在工作树中进行工作,并且其他人将提交推送到您的仓库并使用该新提交替换您的工作树,那么您所有的工作会发生什么情况?全部都会丢失!因此,当您的仓库有工作树时,Git通常会拒绝向您的仓库推送。
因此,Git提供了裸仓库。裸仓库是没有工作树的仓库。没有工作树,就没有人可以在其中进行工作,因此推送不会丢失工作。因此,它是一个始终可以安全推送到的地方。这就是全部内容,但这非常重要。
如果您想查看被推送到裸仓库的提交(及其文件),则可以创建非裸克隆,并从被推送到的仓库中获取,进入非裸克隆,然后检出相关的提交。这将用他们的工作替换您的工作-但既然您说“现在就做”,那么您必须意味着这一点,而不是因为他们碰巧现在推送而粗鲁地覆盖您的工作。
正如脚注所示,有许多注意事项和调整,但这是基本设置。裸克隆仅用于推送,而非裸克隆是您进行工作的地方。

1实际上,只有在推送到当前分支时才会出现这种情况,即使在此情况下也是可以控制的。

2通常的git checkout也会尝试确保您不会丢失任何未保存的工作。您可以告诉它“强制”覆盖您自己的工作,或者使用git reset --hard先放弃您自己的工作,这里有许多复杂的边缘情况,但Git通常将所有提交的数据视为永久和不可删除的。工作树数据则要少得多。


2

您的提交已成功记录在 gitremote 仓库中。尝试重新克隆该仓库,您将看到“1st file”提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接