web-dev-qa-db-ja.com

特定のコミット後にブランチ内のすべてのコミットを削除する

これを達成するためにリベース/リバートを使用する方法を理解するのに苦労しています。

私はmasterブランチで作業していましたが、特定のコミットの後、ソフトウェアが機能しなくなりました。その時点で行われた変更を失いたくなかったので、マイルストーンに到達するように時間どおりにプレッシャーをかけられたので、git checkoutでいくつかのコミットに戻り、workingという新しいブランチを作成してプッシュを開始しましたそこに私のすべての変更。後で、これらの変更(masterブランチで行われた)は必要ないことに気付きました。ここで、マスターブランチに戻り、workingブランチの作成に使用したコミット後にすべてのコミットを削除してから、workingブランチをmasterブランチにマージします。

オンラインフォトエディタで画像を作成して、自分がやろうとしていることを説明しようとしています。私はそれが役立つことを願っています:

screen shot of bitbucket

5cb967f以降はすべて保持したい。 5cb967fとa0c1de2の間のすべてを取り除きます(それらを含まない)

20
Zaki Aziz

2つのオプションがあります。

書き換え履歴(破壊的)

git-rebaseを使用して履歴を書き換え、これらのコミットを省略できます。インタラクティブなリベースを実行できます。あなたの説明から、あなたがmasterworkingに何を持っているかは正確にはわかりませんが、すべての履歴(必要なものと不要なもの)がそこにあると思います。

  git checkout master
  git rebase -i a0c1de2

この時点で、$EDITORがポップアップし、a0c1de2からmasterのHEAD)へのコミットのリストが表示されます。対応する行を削除できます。 c460070..a3cb10eに移動して、履歴から削除します。

あなたの履歴はローカルで書き直されます。この変更をプッシュしようとすると、早送りではない更新になります。

元に戻し、履歴を保持(非破壊)

履歴を保持したい場合は、コミットのシーケンスを元に戻すことができます。

git checkout master
git revert c460070..a3cb10e

これにより、7つの新しいコミットが作成され、それぞれがこれらの不要なコミットの変更を順番に元に戻します。

16
djs

歴史のグラフィックについての何かが厄介です。その中のテキストマークアップで行くと、あなたが欲しいのは単に

$ git branch -f master working

マスター上に保持したいポストworking-ベースコミットがなかったためです。

0
jthill