2009-04-21 17 views
30

私は最近git repoを台無しにして、何か救済策があるかどうか調べたいと思います。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 

この方法です。

今私が行ったことは、代わりにマスターブランチで作業を開始したことです。そこで私はマスターに変更を加え、もはやセントラルのコピーを得るためにそれから分岐することはできません。 Centralにいくつかの修正を加える必要があるときは、Centralを別のディレクトリにクローンしてそこから作業する必要があります。

私の質問:私のマスターをセントラルの同じコピーにする方法はありますか?マスターに加えたすべての変更を別のブランチに移動していますか?

私はそれが混乱していることを知っており、何か助けていただければ幸いです。何かが不明であるかどうかを明確にします。

答えて

47

まあ、溶液はかなり簡単だった、行ったようにそれを使用することができます。

#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の2つの良いブランチがあります。マスターは私のセントラルのコピー、プロダクションの修正はold_master、以前はやったすべての作業を保持しています!

ありがとうございます!

+1

あなたの解決策をフォローアップしてくれてありがとう。私はちょうどあなたの状況を整理しようとしていた - あなたがそれを理解してうれしい。 –

+5

私はあなたの4番目のコマンドの代わりに、 "git push old_master origin old_master"と思っています。 "git push origin old_master"が必要ですか?それは私のために働くように思えたので、それが正しいと思っています。それ以外の場合、エラーメッセージが表示されます: "fatal: 'old_master'がgitリポジトリではないようです。 –

+4

" git push origin:master "できませんでした。この投稿はそれを扱う方法を説明しています。 http://matthew-brett.github.com/pydagogue/gh_delete_master.htmlキーは、masterがgithubのデフォルトブランチでないことを確認します。フォークされたレポに取り組んでいるなら、良い方針です。 – pduey

3

あなたは

によって正確に何を意味するのか、私は私のマスターとそれからすることができなくなった枝を[アップ]台無し。

あなたはリポジトリ内の任意のコミットから、いつでもそれが何か「混乱」していても、新しいブランチを作成することができます.Gitには何の概念もありません。

Gitは明示的にオブジェクトを削除しないため、リポジトリを元に戻すことができます。これは、参照されていない(ダングリングしている)オブジェクトだけをガベージコレクションします。だから、あなたのリポジトリの見た目を知る必要があります。 gitkまたはgit logがお手伝いします。

あなたが好きな状態にローカルリポジトリを復元した後、単純に中央のパブリックリポジトリに戻すことができます。その結果、早送り以外のプッシュが発生する場合は、プッシュするときに--forceフラグを指定する必要があります。

+0

こんにちは、私はもはや中央リポジトリのコピーを得るためにそれから分岐できないので、私は新しい機能の作業を開始できます。 あなたの提案について、私はそれを考えました - しかし、それは私が私の主人にしたすべての仕事を失う原因になります。それはありませんか?ありがとう。 – drozzy

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をチェックアウトし、あなたはパットNotzとボムによって示唆あなたのfeatureブランチ

+0

Origin/masterは、マスタのリモートリポジトリを参照します。しかし、私はすでに私のgithub repoに自分の変更をプッシュしました。 私が必要とするのは、私のCentral Repoがあるupstream/masterにリセットすることです。それを行う方法はありますか? – drozzy

+0

'git reset -hard upstream/master'はうまく動作しているようです(正しいリポジトリを指すように上流を設定した場合)。 – starwed

関連する問題