我最近搞砸了我的git repo,想知道是否有任何补救措施。
我的设置是:
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分支上工作。所以我对我的主人进行了更改,并且不再从中分支以获得Central的副本。每当我需要制作并将一些修复程序推送到Central时,我必须将Central克隆到另一个目录并从那里开始工作。
我的问题:有没有办法将我的主人“还原”为中央的相同副本,同时将我在主人身上所做的所有更改移到另一个分支(比如功能)?
我知道这很令人困惑,我很感激任何帮助。如果有什么不清楚,我会澄清。
答案 0 :(得分:47)
解决方案非常简单,Pat Notz和Bombe暗示。
#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
#
现在我有两个不错的分支:master和old_master。 master是我的Central的副本,用于修复生产,old_master持有我以前做过的所有工作!
谢谢!
答案 1 :(得分:16)
# 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
并像使用feature
分支一样使用它
答案 2 :(得分:3)
你究竟是什么意思
我弄乱了我的主人,不能再从那里分支了。
你总是可以从你的存储库中的任何提交创建一个新的分支,无论它有多么“混乱” - 顺便说一下Git没有这个概念。
基本上你可以将你的存储库恢复到以前的任何状态,因为Git不会明确地删除任何对象,它只会偶尔收集未引用的(悬空)对象。所以你只需要找出你的存储库看起来像什么。 gitk
或git log
可以帮助您。
将本地存储库还原到您喜欢的状态后,只需将其推回到中央公共存储库即可。如果这导致非快进推送,则可能需要在推送时指定--force
标志。