gitの最初のコミットを削除する方法は?


179

gitの最初のコミットを削除する方法に興味があります。

何かをコミットする前のリビジョンは何ですか?このリビジョンには名前またはタグがありますか?


2
gitの使用を開始するには、リビジョンが無意味であることを知っておく必要があります。コミットまたはその相対SHAについて話すことができます。また、なぜこれをしたいのですか?最初のコミットは、すべてがその上に構築されるものです。新しい最初のコミットになる最初のコミットを含むいくつかのコミットをまとめて潰すことができますが、最初のコミットを削除する(または最後のコミット以外を削除する)とはどういう意味ですか?
Shahbaz

@Shahbazええ、それが最良の方法です。たとえば、こちらをご覧ください。ariejan.net
2011/07/05

5
使用できますgit rebase -i --root。:詳細については、以下のSOの答えを参照してくださいstackoverflow.com/questions/2246208/...
MKroehnert


この答えは、ルートを削除するには、正しい解決策を持っているが、現在のブランチのコミット:git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
ジョディBruchon

回答:


321

私にとって、最も安全な方法は update-ref次のコマンド:

git update-ref -d HEAD

名前付き参照を削除します HEADので、現在のブランチのすべてのコミットリセットされます(ソフトで作業が失われることはありません)。

最初のコミットを2番目のコミットとマージしたい場合は、次のrebaseコマンドを使用できます。

git rebase -i --root

最後の方法は、孤立したブランチ、つまり同じ内容でコミット履歴のないブランチを作成し、その上に新しいコンテンツをコミットすることです。

git checkout --orphan <new-branch-name>

7
これが受け入れられない答えであることは残念です。グーグルのほとんどのヒットが多かれ少なかれ「最初のコミットを取り消すことはできない」と言うのもあまりにも悪いです。これは私にとってはトリックでした。ありがとう!
danielpops

1
あなたのサポートを@danielpopsに感謝します!3年後にこの質問に答えたことに気付くとよいでしょう。その間、Gitは進化しました。
tzi

私はリベースを使用し、2番目のコミットを「スカッシュ」としてマークし、次に--forceをオリジンにプッシュしました。ありがとう!
フィリップアッツ2018

1
git update-ref -d HEADは、最初のコミットだけでなく、すべての履歴を削除する最も安全な方法です。
user1767316

私はそれを行い、最初のコミットに追加したすべてのファイルを削除しました。悲しい。少なくともそれほど多くはなかった
Vyacheslav Tsivina

42

すべてのコミットは親コミットを参照しているため、最初のコミットの前には何もありません。これは最初のコミットを特別なもの(孤立したコミット)にするため、以前の「状態」を参照する方法はありません。

したがって、コミットを修正する場合は、次のように簡単にできますgit commit --amend。これにより、別のコミットを作成せずにコミットが変更されます。

最初からやり直したい場合は、.gitリポジトリを削除し、別のリポジトリを作成しますgit init


7
この答えは正しくありません。最初のコミット前の状態に戻す方法があります。以下のtziの回答を参照してください。
David Nelson

2
また--amend、最初に正しく構成されていなかった場合、作成者は適切に更新されません。それが私が必要とするものなので、私は受け入れられた答えを使用してから、代わりに新しいコミットを実行しました。
Mark Edington、

11
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master

3
答えではありません:「最初のコミットを削除する方法」ではなく、「最後のコミット以外をすべて削除する方法」ではありませんでした。
peterh-モニカを

1
私はまさにこれを探していました。ありがとう!
Krzysztof Tomaszewski

6

最初のコミットを編集したいだけかもしれません(gitリポジトリには常に最初のコミットがあるため)。git commit --amend --reset-author通常の代わりに使用することを検討してくださいgit commit --amend


1
答えではありません:最初のコミットを削除し、最後のコミットのプロパティを変更したくありませんでした。
peterh-モニカを

@ peterh-ReinstateMonica説明:インタラクティブなリベース中にコミットを修正してコンテンツを完全に変更できますが、作成者を変更するには--reset-authorも提供する必要があります。これで、最初のコミットを好みに完全に置き換えることができます。CharlesBの回答も参照してください。
Max Beikirch

3

私はそれらが決して起こらなかったように、リポジトリからすべてのgitコミットを取り消す方法を探していました。

リベースはある程度まで機能します。ただし、最初の(年代順で最も古いgit commit)には親がないため、常に問題が発生し、エラーが発生します。

これらの答えのどれも私のためにそれをかなり解決しませんでした。しかし、多くの検索と試行錯誤の結果、これは機能することがわかりました。

git update-ref -d HEAD
git push origin master -f

これがお役に立てば幸いです。すてきな一日を。


1
この答えを読んでいる人に明確にするために:これはすべてのコミットを削除しますが、OPはリポジトリに対して行われた最初のコミットのみを削除したいです。すべてのコミットが削除されるため、最初のコミットを削除するためにこれを実行しないでください。
ジョディブルション

2

あなたができる別の方法は:

  1. 保持したいブランチへのチェックアウト(たとえばdev) git checkout dev
  2. 次に、リセットするブランチを削除します git branch -D master
  3. 次に、同じ名前の空のブランチを作成します git checkout --orphan master

もちろん、これはすべてユースケースに依存しますが、ブランチが複数ある場合、.gitディレクトリを削除しても意味がありません。


3
これを行った後、プッシュする前にリモートでブランチを削除する必要があります。そうしないと、プッシュしようとすると次のエラーが発生します。[rejected] master-> master(non-fast-forward)-エラー:一部の参照を 'git@github.com:r1 / r2.git'にプッシュできませんでした-ヒント:現在のブランチの先端が原因で更新が拒否されましたbehind-ヒント:そのリモートの対応物。もう一度プッシュする前に、リモートの変更(たとえば、ヒント: 'git pull ...')を統合します...-git pullを実行すると、すべてのコミットが返されます。
dxvargas 2016

2

他のブランチを保持したいが、たとえばmaster他のブランチに共通の履歴なしでブランチを新しく開始する場合、これを実現する安全な方法の1つは、新しいリポジトリを作成し、その内容を古いリポジトリにプッシュすることです。

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

これによりnewmaster、他のどのブランチとも共通ではない履歴を持つ古いリポジトリにブランチが作成されます。もちろん、あなただけ上書きすることができmasterて、同様git push -f

すべてのブランチとすべての既存のコンテンツを破棄したい場合は、単に実行します

rm -rf .git/

1
答えではありません: OPは最初のコミットを削除し、現在の作業ツリーを初期コミットとして新しいgitリポジトリを開始しないことを望んでいました。
peterh-モニカを復活させる'10年

@peterh私が同意するのgit rebase --rootはおそらくOPが望んだものですが、この回答に2つの賛成票があることを考慮して、誰かがまだ関連があるとわかった場合に備えて、私はそれを削除しないようにします。
user1338062

あなたが最初にいくつかのブランチにコミット削除したい場合は、そこに-私はこの答えは正確に関連していると思う一つだけのコミット!(ただし、他のコミットを他のブランチに保持することも必要です。変更をローカルだけでなく、BitbucketまたはGithubに反映させるためにもこれを実行します。)この答えはこれを行う1つの方法だと思います。ここでこれを行う唯一の方法かもしれません。(それは-私の知る限り-いくつかのコミットでリモートブランチを越えてコミットせずにローカルブランチを強制的にプッシュする方法がないためです。)
MikeBeaton

0

コミットしたがプッシュしなかった場合は、.gitディレクトリを削除して、git initもう一度...


@peterhはい、あります。OPの質問は、最初のコミットを削除し、その後のコミットは保持したいというものだと思います(私はそう思います)。別の可能性(私はOPの質問に完全に一致すると思います-これが答えです)は、最初のブランチを削除してブランチからコミットするだけで、ブランチを完全に空に戻すことです。
MikeBeaton

@MikeBeatonあなたは正しいです。コメントを削除しましたが、質問を不明確なものとして閉じるには投票する必要があります。注:私だけがこのコメントを作成しましたが、私の後ろには40000人の訪問者がいて、それらの大部分がGoogleでこの質問を見つけました-そして彼らは彼らが望むものを手に入れませんでした。
peterh-モニカを

それは極端なようです。質問を削除しますか?完全に合理的な質問であるものに対する完全な回答は、...などに応じて、2つの異なるアプローチを取る必要があるということを(完全に)主張することはできませんか?(つまり、私は、1のために、でしょう最初にそれがない場合にのみコミットコミットを削除する方法を知りたい、また、それはときに最初にコミット削除する方法であるだけコミット。それは確かに明白ではない、と確かに依存しないが実装固有の詳細については、実際にはかなりケースごとに異なるアプローチが必要であることが判明しています。)
MikeBeaton

0

質問に対する答えは、次のいずれかによって異なります。

  • (他のブランチをそのままにして)ブランチで最初のAND ONLYコミットを削除するか、または

  • いくつかのブランチで最初のコミットを削除し、その後、後続のコミット(および他のブランチ)を「そのままにする」必要があります。

これらの2番目は比較的単純です。基本的にルートにリベースする必要があります-ここでの答えのほとんどはこれを行う方法についてです。

2番目の処理(最初のブランチを削除して、他のブランチはそのままにして、ブランチからのみコミットする)を行うのは、より困難です。または、少なくとも、変更をGitHubまたはBitbucketに反映させる場合は特に困難です。(私が知る限り)コミットなしでブランチをプッシュまたは強制プッシュする方法はGitにはまったくありません。また、GitHubやBitbucketのいずれにもコミットされていない新しい空のブランチを作成する方法はありません(ここでも、私が見る限り)。したがって、完全に空のブランチを作成するために新しいリポジトリを作成し、必要なブランチ(必要なコミットを含む)を再び追加する必要があります-@ user1338062の回答に従って。

必要が取られることを2つの異なるアプローチがあること、2つの異なる(多かれ少なかれ合理的な)シナリオのために-私は明らかにされていない可能性がありますどのようなこの答えの明確化を願っていますので、両方のあなたが行うことができるようにしたいかもしれないものを、順番にOPが要求することを完全にマスターするため。

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