0

我的项目在服务器上有一个裸仓库设置。我目前在分支0.9/develop。我0.9/develop与另一个开发人员正在开发的分支合并。事实证明,修复他的代码比完全消除他的更改要多得多。不幸的是,我git push origin 0.9/develop在提交合并后已经运行了一个,并且我将这些更改拉到了我的开发和登台服务器(是的,我很愚蠢)。

我一直在经历一些关于 SO 的类似问题,但似乎没有一个能完全涵盖我的确切情况。这个特别有用:How to revert Git repository to a previous commit?

使用来自该问题的信息,我能够成功消除项目的最后一次提交。具体来说,我做了一个git reset --hard f6c84a0,在我将其他开发人员的 n00bery 合并到我的诗歌中之前,它成功地将我的本地存储库重置为提交。

好,太棒了。现在我只需要修复裸回购。所以我尝试了git push --force origin 0.9/develop。不幸的是,我丢失了服务器发回的特定消息,但它类似于“成功”,它表明远程 repo 已更新为提交 f6c84a0。

当我尝试 ssh 进入服务器然后进入我的暂存环境并运行 agit pull时,响应是:

From /home/ben/web/example
 + 77d54e4...f6c84a0 0.9/develop -> origin/0.9/develop  (forced update)
Already up-to-date.

但是,当我git log从登台服务器运行 a 时,合并中的所有提交仍在0.9/develop分支上。我尝试了几件事,比如git pull --force,但我无法让错误的提交消失。

好的。给猫剥皮的方法不止一种。我将登台服务器擦干净,然后重新git clone --recursive --no-hardlinks example.git stage.example.com运行并运行了必要的设置脚本,该脚本执行了一些小的服务器维护工作。

现在我无法回到我的0.9/develop branch. 过去,我只是简单地运行git checkout 0.9/develop,但如果我现在尝试,我会得到:

Branch 0.9/develop set up to track remote branch 0.9/develop from origin.
Switched to a new branch '0.9/develop'

等等……什么?0.9/develop不是一个新的分支。使用来自这个问题的信息:如何在 Git 中克隆所有远程分支?我做了一个git branch -a并得到以下结果:

* 0.9/develop
  master
  remotes/origin/0.8/develop
  remotes/origin/0.8/master
  remotes/origin/0.9/develop
  remotes/origin/HEAD -> origin/master
  remotes/origin/category-address
  remotes/origin/jaminimaj
  remotes/origin/master
  remotes/origin/permissions
  remotes/origin/ticket-duration
  remotes/origin/timzone-support

然后我尝试git checkout origin/0.9/develop了,但我收到以下消息:

Note: checking out 'origin/0.9/develop'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at f6c84a0... bugfix: revert email helper

好消息是登台服务器现在有正确的代码库,但我处于分离的 HEAD 状态。我意识到我可能在这里遗漏了一些非常小的东西,但这肯定会影响我的星期五晚上。如何让我的登台服务器 HEAD 指向返回的 HEAD 0.9/develop?另外,我想在我的开发环境中做同样的事情,但我宁愿以正确的git方式来做,而不是擦除整个服务器并重新开始。我可以这样做,还是我只需要通过从 repo 重建服务器来强制它?谢谢大家的帮助!

4

3 回答 3

3

讯息

Branch 0.9/develop set up to track remote branch 0.9/develop from origin.
Switched to a new branch '0.9/develop'

意思如下:

  • git 创建了一个名为 0.9/develop 的新分支指针,指向当前的 origin/0.9/develop
  • 此分支指针具有自动生成的配置设置来跟踪远程分支,以便 git pull 和 git push 按预期工作。

所以它做了它应该做的事情。这有点违反直觉,基本上要使用一个分支,你需要在你克隆的存储库中的一个本地分支。每当您运行时,它都会与远程分支合并git pull

顺便说一下,跟踪分支中的 git pull 相当于

git fetch
git merge remotes/origin/0.9/develop
于 2013-06-28T23:19:14.877 回答
0

可能您的根本问题在这里得到解答

在像您的客户这样的操作之后,必须重置一些提交并再次拉取,因为他们的回购在强制推送之前。

如果您碰巧处于分离状态,请不要担心checkout当地的分支机构。如果您在直接散列、标签或远程分支上使用结帐,或者只是在某个操作的中间,它很容易发生。这只是意味着你目前没有在任何分支上。

你得到了它

git checkout origin/0.9/develop

目前尚不清楚您是否丢失了当地分支机构。用于git branch查看您是否有 0.9/develop,如果有,请检查。如果没有,请启动git gui并使用创建分支菜单从跟踪分支创建它。

于 2013-06-28T23:30:51.837 回答
0

听起来您需要检查裸仓库中的分支并使用git reset将其重置回您想要的位置。或者,您可以git reset在本地 repo 中的本地分支和git push -f它。在暂存存储库中,您必须git reset像在正常工作存储库中一样执行操作。

于 2013-06-28T23:54:01.410 回答