我的git repo软管怎么样?

时间:2013-06-28 22:59:33

标签: git git-push git-pull git-checkout git-reset

我的项目在服务器上有一个简单的repo设置。我目前在分行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。不幸的是,我丢失了服务器发回的特定消息,但它是" success",它显示远程仓库已更新为提交f6c84a0。

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

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

但是,当我从登台服务器运行git log时,合并中的所有提交仍然在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不是新分支。使用此问题的信息:How to clone all remote branches in 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指向0.9/develop的HEAD?另外,我想在我的开发环境中做同样的事情,但我宁愿以正确的git方式做到这一点,而不是擦除整个服务器并重新开始。我可以这样做,还是只需要通过从repo重建服务器来强制它?感谢大家的帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的根本问题可能是answered here

像你这样的操作之后,客户必须重新设置一些提交并再次拉动,因为他们的回购是强制推送。

如果您恰好处于分离式听力状态,请不要担心checkout 本地分支。如果您在直接哈希,标记或远程分支上使用checkout,或者只是在某些操作的中间,它很容易发生。这只是意味着你目前没有分支。

你得到了

git checkout origin/0.9/develop

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

答案 2 :(得分:0)

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