最初のgit commitを元に戻すには?


357

私は初めてgitリポジトリにコミットします。その後、コミットを後悔し、元に戻したいと思います。やってみる

# git reset --hard HEAD~1

私はこのメッセージを受け取ります:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.

このコミットは、リポジトリの最初のコミットです。gitの最初のコミットを元に戻す方法はありますか?

回答:


565

自分がいるブランチを削除するだけです。git branch -Dこれはこれを行うことに対する安全性チェックがあるので使用できません。update-refこれを行うために使用できます。

git update-ref -d HEAD

他のすべてのブランチとリセットしようとしているブランチを含むリポジトリ全体が完全にワイプされるため、このようなもの使用しないでくださいrm -rf .git


1
リベース中にこれを試しました-最初のコミットを分割したかったのですが-分割しましたgit status、そして驚いたことに、gitは言ったfatal: Not a git repository (or any parent up to mount point ...)
Matt Fenwick 2013年

1
これは私にはうまくいきませんでした。無視すべきであるが無視すべきでないものを含むファイルを作成します.gitignoregit add .git commit -m "initial commit"git update-ref -D HEAD、作成.gitignoreGitはまだ無視すべきことは、以前追加されたファイルを見ていることを、通知を。つまりgit update-ref -d HEAD、最初のコミット前の状態に戻ることはありませんでした。
gman 2014年

1
しかし、それが最初の質問のポイントです。最初のコミットの直前の状態に戻ります。
gman 2014年

2
git reset --hard HEAD~1他のすべてのコミットで追加されたファイルを削除します。明らかに問題は、そのコマンドが他のすべてのケースで機能するのと同じ状態にどのように到達するかです。ソリューションが機能しないことを証明するために、この要旨を参照してください 。gist.github.com
greggman /

11
:ケースで誰もがgmanのコメントによって混乱してしまうgit update-ref -d HEAD 実際に初期のコミット元に戻すが、インデックスに追加されたすべての以前にコミットの変更を保持します。これらの変更も削除したい場合は、以下を実行してくださいgit reset --hard。不完全であっても、この回答は確かに最良の回答です。そのため、使用することは避けてくださいrm -fr .git(自分が何をしているかを理解していない限り)。
rsenna 2015

62

HEADを削除してリポジトリを新しい状態に復元し、新しい初期コミットを作成できます。

git update-ref -d HEAD

新しいコミットを作成した後、すでにリモートにプッシュしている場合は、以前の初期コミットを上書きするために強制的にリモートにコミットする必要があります。

git push --force origin

1
注目に値する...これは正しいコマンドですが、HEADは削除されません... .git \ HEADファイルがチェックアウトした参照(.git \ refs \ headsの下にある)を削除します。このコマンドを実行した後も、削除したrefs / heads / <name>ファイルを指すHEADファイルを見つけることができますが、そのパスをたどると、heads refが存在しないことがわかります。
DanK 2017

15

この質問はこのブログ投稿からリンクされており、Gitの新しいバージョンに対して代替ソリューションが提案されました。

git branch -m master old_master
git checkout --orphan master
git branch -D old_master

このソリューションは、以下を前提としています。

  1. masterブランチにコミットが1つしかない
  2. 呼ばれるブランチがないold_masterので、その名前を自由に使用できます

既存のブランチの名前をに変更しold_master、孤立した新しいブランチmaster (新しいリポジトリ用に作成されるような)を作成します。その後、自由に削除できますold_master...またはできません。あなた次第。

注:gitブランチを移動またはコピーすると、reflog(このコードを参照)が保持されますが、新しいブランチを削除してから作成すると破棄されます。履歴のない元の状態に戻したいので、おそらくブランチを削除する必要がありますが、他の人はこの小さなメモを検討したいと思うかもしれません。


11

質問で規定された条件の下で:

  • コミットはリポジトリ内の最初のコミットです。
  • つまり、実行されたコマンドはほとんどありません。
    • A git init
    • おそらくいくつかのgit add操作、
    • git commit
    • そしてそれだけです!

これらの前提条件が満たされている場合、最初のコミットを元に戻す最も簡単な方法は次のとおりです。

rm -fr .git

あなたがしたディレクトリからgit init。その後、をやり直してgit initGitリポジトリを再作成し、最初に行わなかったことを後悔していると思われる変更を加えて追加をやり直し、最初のコミットをやり直すことができます。

危険!これにより、Gitリポジトリディレクトリが削除されます。

どこかにバックアップがない場合を除き、Gitリポジトリディレクトリを永久的かつ回復不能に削除します。前提条件の下では、リポジトリに保持したいものは何もないため、何も失うことはありません。追加したすべてのファイルは、まだ変更しておらず、削除していない場合など、作業ディレクトリで引き続き使用できます。ただし、これは、リポジトリに他に何もない場合にのみ安全です。「リポジトリを初めてコミットする-後悔する」という質問で説明されている状況では、安全です。しかし、多くの場合、安全ではありません。

これを行って、不要なクローンリポジトリを削除しても安全です。クローン元のリポジトリには影響を与えません。コピーで行ったことはすべて破棄されますが、元のリポジトリには影響しません。

注意してください。ただし、前提条件が満たされている場合は安全で効果的です。

保存したいリポジトリで他のことを行った場合、これは適切な手法ではありません。リポジトリは、これが適切であるための前提条件を満たしていません。


9
これは悪いアドバイスです。もしあなたが失いたくないリポジトリに他のものがある場合はどうなりますか?
Matt Fenwick、2014年

5
その後、それは最初のコミットではないでしょう。最初のコミットは1つだけです。
Jonathan Leffler、

9
「それでは、最初のコミットにはなりません」-実際にはそうです。複数のブランチの非常に一般的なケースを無視しています。チャールズの答えを見てください。
Matt Fenwick、2014

2
参考になりますが、警告が表示されます。
Simon Bengtsson 2014

5
これは実際に機能します。受け入れられた答えはしません。コメントを見る
gman


3

結局私のために働いたものを投入します。隔離されたデータが誤って配置されていたため、リポジトリの最初のコミットを削除する必要があり、コミットはすでにプッシュされていました。

現在正しいブランチにいることを確認してください。

git checkout master

git update-ref -d HEAD

git commit -m "Initial commit

git push -u origin master

これで問題を解決できました。

重要

これは、公開されていない内部リポジトリにありました。リポジトリが公開されている場合、元に戻す必要があるものがすでに他の誰かによってプルダウンされていると想定してください。


1

「修正」が提案されておらず、@ damkratによって取り消されているのはなぜでしょうか。修正は、初期コミットがないという目的がないため、間違ったコミットを修正するという根本的な問題を最も効率的に解決するための正しい方法として私に表示されます。コミット。一部の人が強調したように、リポジトリのクローンを誰も作成していない場合は、マスターのような「パブリック」ブランチのみを変更する必要があります...

git add <your different stuff>
git commit --amend --author="author name <author.name@email.com>"-m "new message"

--authorは、誰かがコミットの著者を修正する場合にのみ必要です
Richard

0

git reset --hard変更を加えてから

git add -A
git commit --amend --no-edit 

または

git add -A
git commit --amend -m "commit_message"

その後

git push origin master --force

--forceは、最初のステップでリセットしたコミットを書き換えます。

VCSシステム、特にgitの全体的な考えに反対しようとしているので、これを行わないでください。唯一の良い方法は、新しいブランチを作成し、不要なブランチを削除することです。git help branch情報を参照してください。


-1

あなたがしなければならないすべては、コミットを元に戻すことです。

git revert {commit_id}'

それを押します

git push origin -f

最初のコミットでそれを行うことはできません。
ユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.