2017-03-10 85 views
0

我在本地计算机和远程服务器上设置了三个git存储库。我修改我的本地机器上的源代码,推到裸回购在服务器上,登录到服务器,从裸回购拉我的网站:Git无法从重置中提取更改

Local Machine     SERVER  
+++++++++++++++++  +++++++++++++++++++++++++++++++++ 
+ Source Code +  +      Website + 
+ repo 1 ---------------->bare repo----------->repo 3 + 
+    + [push] +    [pull]   + 
+++++++++++++++++  +++++++++++++++++++++++++++++++++ 

我重置一些提交我的本地机:

    HEAD 
    1  2  3  4 
    o-----o-----o-----o 

git reset --hard 1 


HEAD 
    1  2  3  4 
    o-----o-----o-----o 

当我按下复位裸回购

git push -f 

的问题是,我似乎并没有能够从裸回购到我的网站拉他们:

git pull origin master 

From bare-repo 
* branch   master  -> FETCH_HEAD 
Already up-to-date. 

编辑:git log --graph --oneline --decorate

本地计算机的输出:

* 0f8c9c7 (HEAD -> master, origin/master, origin/HEAD) commit 1 
* 3e65e8f commit 0 
* 821e81f commit -1 
* 78c9427 commit -2 
* 57ab3d3 commit -3 

服务器:

* 5075401 (HEAD, master) commit 4 
* 39402d0 commit 3 
* 4ebbf54 commit 2 
* 0f8c9c7 commit 1 
* 3e65e8f commit 0 
* 821e81f (origin/master, origin/HEAD) commit -1 
* 78c9427 commit -2 
+0

'git log --graph --oneline --decorate'看起来像什么?感觉鼓励删除您不想分享的任何细节。 – Makoto

+0

伙计们,我认为'git reset'只影响HEAD,HEAD只是一个没有SHA哈希的符号引用,所以你不能推或拉它,我错了吗? @Makoto –

+0

'git reset'将HEAD移动到工作树中的特定点。它代表了你的树的尖端。推拉并没有真正的背景。在任何一种情况下......我真的*喜欢看到我给你的那个命令的输出...... – Makoto

回答

0

你有库。每个人都有一个master分支。

您在机器上的存储库#1中执行了git reset。将设置为master指定的提交。

然后,您在机器上执行了git push -f origin master:master(或同等)到服务器上的存储库#2。将存储库#2的master设置为指定的提交。实际上,删除了在#2中提交的相同提交与您在存储库#1中用您的git reset删除了相同。

然后您从存储库#3(“网站”)执行了git pull。这运行git fetch以查看master位于存储库#2中的何处。然后存储库#3(在Git版本> = 1.8.4中)根据从Git存储库#2获得的内容设置自己的origin/master,然后运行git merge添加任意新的提交它刚刚得到其网站(master)。

但是存储库#3已经在其主服务器上提交了这些提交,和更多。所以它什么都不做,并且说:“我是最新的!实际上,我甚至还有更多比你更新,所以那里!”

既然你正试图删除提交,你必须得到的Git#3#库3个工作从主删除提交。 Git围绕添加提交而不是删除它们。您必须在那里使用git reset删除它们,或者强制更新Git#3的master到Git#2的master,或者沿着这些线路。