我对我创建的场景很困惑。我在Github上创建了一个存储库(让我们称之为A)并将代码推送到它。之后,我将该存储库克隆到我的本地(让我们称之为B),这样我本地的来源就是远程回购A.
现在我从我的本地B克隆来创建另一个本地实例C.现在我有远程起源的C作为repo B而C的上游是A.
A → B → C
这类似于分叉,但在这里我在客户端而不是服务器端创建了克隆。
现在,如果我尝试使用从C到其原点B的推送:
git push origin
然后我收到一个错误,指出我无法推送到非裸存储库。我知道推送到非裸存储库可能会导致本地远程不存在的提交丢失。
但是,这种情况与我将代码从B推送到A的情况类似吗?
我很困惑,如果B到A是可能的,那么为什么C到B.
为了合并到A,我们可以推送到上游:
git push upstream
git clone
,你都希望处理刚刚克隆的代码。所以GIT为你提供了一个“工作树”。它被称为树,因为当你考虑所做的所有提交和分支并将其放在图表上时,它就像一棵树。git init
- 这是原始程序员用GIT开始跟踪克隆代码所做的工作。你也可以将它克隆到一个裸存储库中,但它的细节和用处应该是一个关于它的正确问题的答案。git init --bare name_of_repository.git
。它将创建一个名为name_of_repository.git的目录,其中包含GIT所需的所有文件。 git扩展只是一个使用的约定;它不是必需的,可以是任何东西或什么也不是。git push
,至少可以说它是混乱的。 GIT永远不会错,因为它会要求您检查,更改或强制执行您正在执行的操作。所以任何错误都不是GIT的错,而只是你的错。我们考虑以下几点:
话虽这么说,让我们说你修改了B中的一些文件。你可以多次执行git commit
,最后甚至是git push
。或者你什么都不做。但你在主分支机构。
稍后,你修改C中的文件。你确实提交并尝试推送到A.记住:你是C的主分支.git push
工作!
然后,您也尝试将C推送到B.它不起作用。
结果:GIT将(不)字面上尖叫,警告您正试图玷污(更新)非裸存储库B的主分支,其HEAD指向另一个提交!如果他允许你进行推送,你将把GIT跟踪的历史记录弄乱在存储库B上。它不会再知道B发生了什么!您甚至可能使用驻留在B上的相同名称覆盖该分支上的修改!所以不,如果两者都是非裸存储库,你不能从C推送到B!
现在怎么办?!我的世界会这样结束吗?!我能做的伟大的事情是什么?! GIT怎么可能忽视他主人的意愿?!这是纯粹的异端邪说!
1 - B上有两个分支 - 主分支和临时分支。并将头指向临时分支。例:
cd B # change to B's working directory
git branch temp # create 'temp' branch
git checkout temp # change from master branch to branch temp
2 - 现在,转到C工作目录(简称wd)并使用B的内容拉。注意我正在考虑B是C的远程(正如您在案例中提到的):
cd ../C # change to C's working directory
git pull B master # pulls B's modifications to C
3 - 用C修改你的文件。注意你在C的主分支上。然后,在提交C的修改后,将其推送给B的主人:
git push B master # pushes C's mods to B's master branch
4 - 现在回到B wd并将HEAD指向主分支:
cd ../B # change to B's working directory
git checkout master # change from temp branch to branch master
5 - 如果您不再使用它,可以删除临时分支:
git branch -d temp # delete branch temp
6 - 如果要在C中进行新的修改,则不需要同时执行步骤4和5.如果这样做,只要您希望在C中进行修改,就需要事先执行步骤1和2。
这解决了你的问题!大概...
git branch name_of_the_branch
创建了一个新分支;git checkout name_of_the_branch
让HEAD指向这个新的分支;git checkout -b name_of_the_branch
创建一个分支,并在一个命令中使HEAD指向它。我使用较长的方法,因为你应该知道更长的方法;如果你使用
git clone --bare http://github.com/xxx/A B
那么你可以从C推到B.你当然不能用B来工作,因为它是裸露的。
我仍然不明白为什么你想要“额外”B回购?