【问题标题】:Git can't pull changes from resetGit无法从重置中提取更改
【发布时间】:2017-03-10 00:47:38
【问题描述】:

我在本地机器和远程服务器上设置了三个 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

【问题讨论】:

  • git log --graph --oneline --decorate 看起来像什么?我们鼓励您删除您不想分享的任何细节。
  • 各位,我以为git reset只会影响HEAD,而HEAD只是一个没有SHA哈希的符号引用,所以不能推拉,我错了吗? @Makoto
  • git reset 将 HEAD 移动到工作树中的特定点。否则它代表你的树的尖端。推和拉在那里没有真正的上下文。无论哪种情况...我真的想看看我给你的那个命令的输出...
  • @Makoto,对不起,你是在说我还是 OP?
  • @AndrewSavinykh:我在向 OP 讲话。无论出于何种原因,我一定是看到了你名字中的“S”并弄错了。

标签: git git-reset


【解决方案1】:

您有 三个 存储库。每个都有一个master 分支。

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

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

然后您从存储库 #3(“网站”)执行了 git pull。这运行git fetch 以查看master 在存储库#2 中的位置。然后存储库 #3(在 Git 版本 >= 1.8.4 中)根据从 Git 获得的存储库 #2 的内容设置自己的 origin/master,然后运行 ​​git mergeadd any new 将它刚刚得到的提交到它的(网站)master

但是存储库 #3 已经在其主库上进行了这些提交,等等。所以它什么也不做,并说“我是最新的!事实上,我甚至比你更多最新,所以在那里!”

由于您正在尝试删除提交,您必须让 Git #3 在存储库 #3 中工作以从 its 主节点中删除 its 提交. Git 是围绕添加提交而不是删除它们而构建的。您必须在那里使用git reset 来删除它们,或者将Git #3 的master 强制更新为Git #2 的master,或者类似的东西。

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2018-10-01
    • 2018-07-27
    • 2017-02-28
    相关资源
    最近更新 更多