web-dev-qa-db-ja.com

masterブランチで「中間」コミットをポップアップして破棄する必要があります。どうすればいいですか?

たとえば、次のマスターブランチでは、コミットaf5c7bf16e6f04321f966b4231371b21475bc4daのみをトラッシュする必要があります。これは、以前のリベースによる2番目です。

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <[email protected]>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <[email protected]>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

私は維持する必要があります

  • 最初のコミット60b413512e616997c8b929012cf9ca56bf5c9113、
  • 3番目のコミットe6523efada4d75084e81971c4dc2aec621d45530および
  • 最後のコミット414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

2番目のコミットだけを「破棄」af5c7bf16e6f04321f966b4231371b21475bc4da

どうやってやるの?事前に感謝ルカ

86
BBJ3

Rebaseまたはrevertはオプションです。 Rebaseは実際に履歴からコミットを削除するため、2番目のコミットは存在しなかったように見えます。マスターブランチを他のリポジトリにプッシュした場合、これは問題になります。この場合、リベース後にプッシュしようとすると、gitは拒否の非早送りマージエラーを返します。

ブランチが他のリポジトリと共有されている場合、Revertは正しいソリューションです。 git revert af5c7bf16は、af5c7bf16が導入した変更を単に元に戻す新しいコミットを行います。このように、履歴は書き換えられず、間違いの明確な記録を維持し、他のリポジトリはプッシュを受け入れます。

消去する良い方法は次のとおりです:git rebase -i <commit>^削除したい直前のコミットに移動します。インタラクティブエディターには、その時点までのすべてのコミットのリストが表示されます。ピック、スカッシュなどが可能です。この場合、removeファイルを消去して保存するコミットの行を削除します。 Rebaseは作業を終了します。

91
JCotton

リベースがオプションの場合、リベースしてドロップすることができます:

$ git rebase -i 414ceffc^

Rebaseがオプションでない場合は、単に元に戻すことができます。

$ git revert af5c7bf16
30
mipadi

ここで元々の回答が受け取ったすべての功績にも関わらず、私は彼らが質問に満足に答えることを見つけることができませんでした。コミットまたはコミットのコレクションを履歴の途中から削除する必要がある状況にいる場合は、次のことをお勧めします。

  • すべてのコミットを含むブランチの先頭に新しいブランチを作成し、それに切り替えます。
  • 新しいブランチを、新しいベースを開始するポイントに戻します。
  • 次に、(ここがキーポイントです)cherry pickその後、元のブランチから新しいブランチに実際に適用したい後続のコミットをスキップします不要になったコミット(つまり、削除しようとしているコミット)。
  • 必要に応じて、元のブランチの名前を古いコードを示す名前に変更し、新しいブランチの名前を元のブランチの名前に変更します。
  • 最後に、変更をリモートリポジトリにプッシュします(使用している場合)。おそらく「強制プッシュ」を使用する必要があります。共同編集者がリビジョンのプルに問題がある場合、リモートソースからリポジトリを再度複製するのが最も簡単かもしれません。いずれにせよ、あなたが歴史の途中からコミットをリッピングしているなら、とにかく彼らと話したいと思うでしょう!

チェリーピッキングに関する情報は次のとおりです。 gitでコミットをチェリーピッキングするとはどういう意味ですか?

Tortoise Gitを使ってそれを実行する方法をいくつか紹介します(私がしたように)この種の操作にGUIユーティリティを使用するのは間違いなく簡単です! TortoiseGitを使用したチェリーピック

26
BuvinJ