2011-02-07 18 views
29

私はリモートのGitリポジトリへの最初のプッシュで間違いを犯したとしましょう。リポジトリが元の状態に戻るように、これを元に戻すことはできますか?私はリモートマシンにアクセスできないので、.gitディレクトリを削除することはできません。リモートのGitリポジトリを完全に空にすることはできますか?

私が見る限り、問題はあなたが頭を「セットしない」ことができないということです。

これは、(誰がこれをテストすることができますので、私はここに地元の「リモート」レポを行う)、I(または実際には、このことについて尋ねた同僚が)何をしたかである:

mkdir git-remote 
cd git-remote 
git init --bare 
cd .. 
mkdir git-local 
cd git-local 
git clone ../git-remote . 
touch a 
git add a 
git commit -m "initial" 
git push origin master 

そして、この時点で、彼は彼を実現間違ったものをリモートのリポジトリにプッシュしました。

私が持っていた唯一のアイデアは依然としてfaultyがコミットままになりますが、ファイルは、第2のプッシュを気にしないだろう彼のレポからすべてを削除& &のgitのrm & & Gitのプッシュです。

+0

http://stackoverflow.com/questions/588414/git-rolling-back-a-remote-repository – Christian

+0

これは、少なくとも1つのコミットがまだ残っているようです。私はそこで一回のコミットをしたくない。 – Makis

答えて

51

私はあなたがXYの問題を抱えているかもしれないと思う(FWIW、私は、このインターフェースはかなりばかげていると思います)。最初からやり直すために、リモートリポジトリを元の状態に戻す必要はありません。あなたは単にローカルで起動し、それを強制的にリモートにプッシュする必要があります。

# create a new repository that has the initial commit that you want 
mkdir foo; cd foo; git init; ...; git commit 

# set up a remote 
git remote add origin <url-of-remote> 
git branch --set-upstream master origin/master 

# push your new history 
git push -f 

# delete obsolete remote branches 
git push origin :deprecated-branch 

リモートリポジトリは決して無コミット状態に戻りませんが、あなたがそれをしたい場所、それが終わると、それは重要なことすべてです!

(実際のところ、古いコミットはまだリモートリポジトリに残っていますが、残ったまま残っていますが、参照はありません。)

何かの理由で実際にそれを空にしたい場合は、receive.denyDeleteCurrentをリモートリポジトリに設定して、すべてのブランチをプッシュ削除することができますこれには現在のものも含まれます。私はなぜあなたが実際に必要なのか分からない!

+0

これは実際に動作します! – Makis

+0

なぜ3番目のコマンドに '-f'フラグが必要ですか? –

+2

@John: '-f'は' --force'を意味します。非早送りのプッシュ(祖先としてブランチの前の位置を持たない枝を押し込む)に必要です。 – Cascabel

0

git revertコミットできます。 git revert HEAD

あなたがコミットしたコンテンツは、.gitディレクトリに存在することに注意してください。 (それについて何もできません)

.gitディレクトリにアクセスせずに履歴からコミットを削除することは実際には不可能です。

+0

答えは「いいえ」です。 – Makis

+1

@マキス:この回答は間違っています。リモートのブランチを削除し、マスターブランチを最初のコミットに強制的に戻すことができます。すべてのコミットを一切せずに残すことはできませんが、ルートコミットを置き換えることができます。*元のコミットはぶら下がり、最終的には自動的に 'git gc --auto'でクリーンアップされます。その後。 – Cascabel

+0

Jonas、gitコマンド(プッシュを含む)は、.gitディレクトリの内容にアクセスし、場合によっては変更することで動作します。あなたは 'git push'を通してリモートの.gitディレクトリにアクセスできます。それは間接的かつ不完全ですが、この作業にも十分です。 – Cascabel

0

"最初のプッシュ"と言うと、ブランチへの最初のプッシュを意味するのでしょうか?あなたがそれにプッシュする前に、そこにコードが全くなかったからです。その場合は...

はじめてリモートブランチにローカルブランチFOOをプッシュしたい場合、あなたはこれを行うだろう:

git push origin foo:foo 

ためにからリモートブランチを削除FOOは、あなたはそれに「何を」プッシュしないようにgitのを教えて:あなたが好きしかし

git push origin :foo 

今、あなたはそれをやり直すことができます。

実際にサーバー上に何が物理的に残っているのかよく分かりませんが、ブランチの履歴を完全にリセットするという点では、これは機能します。

+0

そこに唯一の支店がある場合、どのようにマスター支店にしますか?上記の質問にワークフローを追加しました。 – Makis

+1

'git push origin:master' - それが唯一のブランチであり、あなたがチェックアウトしたものであるため、これはいくつかのエラーを生成し、問題を回避する方法を説明します。 –

+0

(簡単な回避策は 'git checkout -b master_tmp; git push origin:master'です) –

関連する問題