22

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

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

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

ビットバケットのスクリーンショット

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

4

2 に答える 2

21

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

履歴を書き換える (破壊的)

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

  git checkout master
  git rebase -i a0c1de2

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

履歴はローカルで書き換えられます。この変更をプッシュしようとすると、非早送り更新になります。

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

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

git checkout master
git revert c460070..a3cb10e

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

于 2012-12-08T06:30:57.123 に答える
1

履歴グラフィックについての何かがおかしいです。その中のテキストマークアップを見ると、あなたが望むのは単純です

$ git branch -f master working

workingmaster には保持したいベース後のコミットがなかったからです。

于 2012-12-08T16:34:47.413 に答える