2017-01-10 2 views
0

これは私のシナリオです。 私はブランチAに対して作業しています。ブランチBからブランチAにローカルブランチをマージしました。その後、ブランチAでいくつかの変更を行い、コミットYを行いました。このマージを取り消し、Yコミットだけを残します。 私はローカルからリモートブランチにプッシュしていません。すべての変更は発信コミットにあります。 コミットYで行われた作業を失うことなく、それを実行するにはどうすればよいですか? おかげgitで特定のローカルコミットを取り除く

ところで

:私は(私はおそらく知っているこれは、コマンドラインになりますが、誰もが素晴らしいだろうソースツリー使用していることを行う方法を知っていれば)ソースツリーを使用しているでコミット限り何もないよう

答えて

2

をYはブランチBからのマージされた変更のいずれかと直接衝突し、対話型のリベースを実行してマージコミットをドロップできるはずです。私は、ソースツリーに慣れていないので、私はターミナルコマンドを提供することができます

(分岐Aから):git rebase -i HEAD~3(任意の3、あなたはわずか数コミットを参照する必要があります)

マージコミットを検索し、インタラクティブなリベース命令に続いて、pickという語をdropに変更することができます。保存して終了すると、gitはコミットを再生しますが、指定したコミットをスキップして削除します。

注:仕事を失うことに不安がある場合は、リモートのリポジトリにプッシュして、対話型のリベースを試行することをおすすめします。あなたが望むように動作するならば、あなたのレポを強制的に更新し、期待どおりに動かないなら、元に戻すバックアップを取るでしょう。

希望すると便利です。

+0

これは正しい答えです( 'git rebase -i'を使用します)。ただし、' git rebase -i'はあなたのためにマージコミットを明示的に削除する必要はありません:rebaseのデフォルトは破棄します合併する。 'git rebase -p'を使うと、マージを維持しようとします(実際には*再作成する必要があります)。しかし、これを' git rebase -i'と組み合わせるのは賢明ではありません。 – torek

+0

これは別のアイデアであるため別のコメントとして記しておきます。別のリポジトリにプッシュするのではなく、ちょっと神経質な場合は、新しいブランチ名を作成して現在のコミットチェーンを保存する方が簡単です。 'git rebase -i'を実行する前に' git branch saveme'を実行してください。あなたのrebaseが終了すると、ブランチ 'saveme'は元の(rebase前の)コミットを持ち、あなたの現在のブランチは新しい(post-rebase)コピーを持ちます。すべてが良ければ、 'git branch -D saveme'を実行して保存されたオリジナルを投げることができます。 (実際には、オリジナルの名前を 'ORIG_HEAD'という特別な名前で保存します。) – torek

関連する問題