创建git分支,并将原始状态恢复为上游状态
我最近搞砸了我的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
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: