我刚刚开始使用Git(以前是Subversion)。我遇到了真正的问题让我无法看到原始存储库中的推送或拉动更改。我的'架构'是这样的:
MAIN CODEBASE
-->Development repository 1
-->Development repository 2
当我将更改从其中一个dev repos推回到MAIN CODEBASE
时,我看不到那里的更改。
当我随后从MAIN CODEBASE
拉出时,该dev repo中的所有先前更改都将被覆盖。
我在这里显然错过了一个或多个要点,而且我对文档似乎认为我知道'显而易见'非常困惑。就目前而言,Git对我来说似乎毫无用处,我想知道是否要回到Subversion--它当然更容易学习和理解。
答案 0 :(得分:10)
看起来像问题Why won't I see changes in the remote repo after "git push"?
push
操作总是传播存储库历史记录并更新引用,永远不会触及工作树文件。
特别是,如果您推送更新在远程存储库中检出的分支,则工作树中的文件将不会更新。这是一项预防性设计决定 远程存储库的工作树可能具有本地更改,并且您无法进入远程存储库,以解决您正在推送的更改与工作树中的更改之间的冲突
如上所述,bare remote repo在这里更好
您可以在与MAIN CODEBASE
相同的位置设置非裸仓库,以便查看中“非裸主代码库仓库”中的更改。
注意:使用upcoming Git 1.7,git push
进入当前已检出的分支(即HEAD在非裸存储库中指向)将默认拒绝。
git pull
不应该覆盖任何内容,至少不会覆盖without big warnings。你看到这些警告信息吗?
正如kibitzer在评论中恰当地描述的那样:
中的提交之间不会产生差异
bare
表示不包含实际文件的存储库,只包含元数据(提交)。推送到这样的存储库是安全的,因为磁盘上的文件状态和.git
这个远程仓库是“空的”(它只有.git
文件夹,但没有文件签出)并不意味着git clone
将导致一个空的本地仓库。<登记/>
它将创建和签出从克隆的存储库当前活动分支分叉的初始分支。
因此,“出版架构”将是:
/---
| MAIN SERVER : [ BARE-MAIN-REPO ] == (pull only) ==> [ MAIN-REPO ]
\--- ^^ || ^^ ||
|| || || ||
push pull push pull
|| || || ||
/--- || vv || ||
|DEV1 PC : [ DEV1 REPO ] || ||
\--- || ||
|| ||
/--- || vv
|DEV2 PC : [ DEV2 REPO ]
\---
注意:如果您参考Git Glossary,“origin”的含义是默认的上游存储库。
Bare-main-Repo
是“来源”,即dev1
和dev2
的默认上游回购,这意味着这两个回购都是通过克隆Bare-main-Repo
创建的。
(没有什么可以阻止你添加其他上游存储库:dev1可以将dev2添加为另一个上游存储库,例如允许直接从dev2提取)
答案 1 :(得分:2)
当您将更改推送到主代码库时,git存档会更新,但主代码库的已检出工作目录不会更新。
我强烈建议您将主代码库设为--bare
存储库,以防止这种混淆。
我不知道覆盖以前的更改是什么问题,对我来说似乎不对 - 你能举个例子吗?
作为教程,这些联机主页并不适合初学者,但提醒已经理解git的人如何使用他们朦胧的功能。网上有大量文档和文档,包括user manual。
答案 2 :(得分:1)
我认为其他答案正在使用大量的技术来尝试回答关于存储库工作方式的一个非常简单的误解,因此我将尝试更简单地回答:
存储库是目录的受控版本,其中跟踪任何人添加或修改的每个文件。这可能看起来不像您习惯的目录。例如,您无法在Windows资源管理器中打开它或在UNIX上键入“ls”以查看其内容。
git存储库位于普通文件系统中的“.git”目录中。如果你打开它,它看起来有点无法辨认。在您的情况下,每个开发机器和MAIN CODEBASE机器上都有一个这样的存储库(这就是为什么git被称为分布式版本控制系统)。请记住,此存储库与实际文件不同,实际文件通常与.git目录位于同一目录中。因此,如果您推送到主存储库,那么位于存储库旁边的实际文件根本不会更改 - 只有存储库才会更改。如果这些文件根本不存在,那么就像其他人提到的那样,你有一个裸存储库。
为了进行比较, svn存储库仅位于一个位置,通常位于与实际文件本身完全不同的位置的服务器上。就像在git存储库中一样,打开此目录会显示一些无法识别的文件。大多数人甚至从不关心这一点,因为当他们检出文件时,他们将所有内容都放到他们的本地机器上。
总而言之,如果你想拥有一个主代码库机器,它根本不需要文件,只需要存储库。对于SVN和git都是如此。
答案 3 :(得分:0)
我认为我们需要更多信息,也许会发布一些git status
输出等等?
根据你的情况,我会说你的远程(原始)存储库不是'裸'。所有“中心”式存储库都应该是裸露的。仅仅因为你推送到存储库并不意味着它应该更新它的工作副本(如果它有变化会怎样!?)。
在其他问题中,你问的是什么是裸存储库。
裸存储库非常简单,没有工作副本的存储库。