31

我最近搞砸了我的 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 状态。

现在我所做的是开始在 Master 分支上工作。所以我对我的 master 进行了更改,并且不能再从它分支来获取 Central 的副本。每当我需要对 Central 进行一些修复并将其推送时,我必须将 Central 克隆到另一个目录并从那里工作。

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

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

4

3 回答 3

46

好吧,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 持有我之前所做的所有工作!

谢谢!

于 2009-04-21T17:38:23.940 回答
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分支一样结帐和使用它

于 2009-04-21T15:20:27.017 回答
3

你到底是什么意思

我搞砸了我的主人,不能再从它分支。

您总是可以从存储库中的任何提交创建一个新分支,无论它可能多么“混乱”——顺便说一句,这是 Git 没有概念的。

基本上,您可以将存储库恢复到以前的任何状态,因为 Git 不会明确删除任何对象,它只会不时地垃圾收集未引用(悬空)的对象。所以你只需要找出你的存储库是什么样子的。gitk或者git log可以帮助你。

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

于 2009-04-21T14:59:25.133 回答