我在本地计算机和远程服务器上设置了三个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 :(得分:1)
您有三个存储库。每个人都有一个master
分支。
您在计算机上执行了存储库#1中的git reset
。这将你的 master
设置为指定的提交。
然后,您从您的计算机到服务器上的存储库#2执行了git push -f origin master:master
(或等效)。将存储库#2的master
设置为指定的提交。实际上,删除了#2中与您的存储库#1中的git reset
一起删除的相同提交。
然后您从存储库#3(“网站”)执行了git pull
。这运行git fetch
以查看存储库#2中master
的位置。然后,存储库#3(在Git版本> = 1.8.4中)根据它从存储库#2的Git获得的内容设置自己的origin/master
,然后运行git merge
到添加任何 new 提交它的(网站)master
。
但是存储库#3已经在其主服务器上提交了这些提交,和更多。所以它没有做任何事情,并且说“我已经达到了最新状态!事实上,我甚至更多是最新的,所以那里!”
由于您正在尝试删除提交,因此必须让Git#3在存储库#3中工作才能从 主服务器中删除 提交。 Git是围绕添加提交而不是删除提交而构建的。您必须使用git reset
删除它们,或强制将Git#3的master
更新为Git#2的master
,或者沿着这些行强制更新。