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

时间:2009-04-21 14:28:08

标签: git version-control github

我最近搞砸了我的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克隆到另一个目录并从那里开始工作。

我的问题:有没有办法将我的主人“还原”为中央的相同副本,同时将我在主人身上所做的所有更改移到另一个分支(比如功能)?

我知道这很令人困惑,我很感激任何帮助。如果有什么不清楚,我会澄清。

3 个答案:

答案 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不会明确地删除任何对象,它只会偶尔收集未引用的(悬空)对象。所以你只需要找出你的存储库看起来像什么。 gitkgit log可以帮助您。

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