创建git分支,并将原始状态恢复为上游状态

创建git分支,并将原始状态恢复为上游状态,git,version-control,github,Git,Version Control,Github,我最近搞砸了我的git回购,想知道是否有什么补救办法 我的设置如下: Central repo on github. Personal repo on github (which is a fork of Central) +Central is setup as remote (upstream/master) +Master branch (origin/master) +Feature branch (origin/feature) 我的工作流程如下: Need to

我最近搞砸了我的git回购,想知道是否有什么补救办法

我的设置如下:

Central repo on github.
Personal repo on github (which is a fork of Central)
   +Central is setup as remote (upstream/master)
   +Master branch (origin/master)
   +Feature branch (origin/feature)
我的工作流程如下:

Need to fix something in Central:
   1. checkout Master
   2. Make changes
   3. Pull from upstream/master and merge
   3. Commit, push to upstream/master

Need to work on a New Feature:
   1. Checkout/Create Feature branch
   2. Work work work
   3. Pull from upstream/master and merge
   4. Commit, push to upstream/master
这样,我在我的主分支中始终保持着一种原始的中央状态

现在我所做的是开始在Master branch上工作。因此,我对我的主机进行了更改,无法再从主机进行分支以获取Central的副本。每当我需要制作一些补丁并将其推送到Central时,我都必须将Central克隆到另一个目录并从那里开始工作

我的问题:有没有一种方法可以“还原”我的母版,使其成为中心版的相同副本,同时将我对母版所做的所有更改移动到另一个分支(比如功能)


我知道这很让人困惑,如果有任何帮助,我将不胜感激。如果有什么不清楚的地方,我会澄清。

你说的确切意思是什么

我把我的主人弄得一团糟,再也无法摆脱了

您总是可以从存储库中的任何提交创建一个新分支,不管它有多“混乱”——顺便说一句,Git根本不知道这一点

基本上,您可以将存储库恢复到以前的任何状态,因为Git不会明确删除任何对象,它只会时不时地对未引用(悬挂)的对象进行垃圾收集。因此,您只需要了解您的存储库是什么样子
gitk
git-log
可以在这方面帮助您

将本地存储库恢复到喜欢的状态后,只需将其推回到中央公共存储库即可。如果这导致非快进推送,则推送时可能需要指定
--force
标志

# Make sure we're on the master branch
$ git checkout master

# Make a new branch to hold the work I've done
$ git branch old_master

# Reset my local master back to match origin/master
$ git reset --hard origin/master

现在您可以签出
old_master
并像使用
功能一样使用它
分支帕特·诺茨和邦贝暗示,解决方案非常简单

#Make sure we're on the master branch
$ git checkout master

# Make a new branch to hold the work I've done
$ git branch old_master

# Save this branch on my remote repo (for backup)
$ git checkout old_master
$ git push origin old_master

# Reset my local master back to match the commit just before I started 
# working on my new feature
$ git checkout master
$ git reset --hard 2aa93842342342

# Get it to be the same as my Central
$ git pull upstream master

# Now DELETE my master on my remote repo
$ git push origin :master

# And recreate it
$ git push origin master

# Branch created!
#* [new branch]      master -> master

#
现在我有两个不错的分支:大师和老大师。大师是我的中心的副本,用于修复生产,而老大师掌握着我以前所做的所有工作


谢谢

嗨,我的意思是我不能再从它分支来获得中央回购协议的副本,所以我可以开始开发一个新功能。关于你的建议,我想到了——但那会使我失去我对我主人所做的所有工作。不是吗?谢谢。Origin/master指的是我的master的远程存储库。但我已经把我的更改推到了github回购协议上。我需要将其重置为我的中央回购所在的上游/主回购。有什么方法可以做到这一点吗?毫不奇怪,
git reset--hard-upstream/master
似乎工作得很好(如果您已将upstream设置为指向正确的回购)。感谢您跟进您的解决方案。我只是想整理一下你的情况——很高兴你弄明白了。我想你应该用“git push origin old_master”,而不是你在那里的第四个命令“git push origin old_master”,你应该用“git push origin old_master”?我希望这是对的,因为这对我来说似乎很有效。否则,我会收到一条错误消息:“致命:'old_master'似乎不是git存储库”我无法“git push origin:master”。这篇文章解释了一种处理方法。关键是,确保master不是github上的默认分支。如果您正在处理分叉回购,或者如果您具有对裸回购的ssh/命令行访问权限,则可以从裸回购目录
git symbolic ref HEAD refs/heads/old_master
,发出此命令,然后删除,然后将symbolic ref切换回master: