1

rebase/cherry-pick を使用して、最後の 2 つのコミットを削除しようとしています。呼び出した後git rebase HEAD^^^ -i、必要なコミットのみを残します (すべてを に任せるHEAD^^ので、 and を削除HEAD^HEADます)。

その後、git push次のように表示されます。

! [rejected]        dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:XXXXXX/YYYYYYYYY.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

しかし、git pull前の HEAD コミットを早送りするだけです。だから、私は私が始めたもので終わっています。私は何を間違っていますか?

4

2 に答える 2

5

チェリーピッキングではなく、リベースです。リベース後、ローカル ブランチとリモート ブランチが分岐し、マージが必要になります。Git はリモートでマージを実行することはありません (早送りマージ、つまり 1 つのブランチのみが進んだ場合を除く) ため、プルしてローカルでマージを実行する必要があります。

問題は、マージはあなたが望むものではないということです。リモート ブランチの「分岐した」コミットを明示的に破棄し、ローカル ブランチの状態で上書きしたい場合。

で行うことができますがgit push -f、このブランチを他の人と共有しない場合にのみ行う必要があります。そうしないと、彼らはあなたの変更を引き下げ、それらを独自の分岐したコピーとマージし、あなたが削除しようとしているコミットを再導入することになります。

ブランチをチェックアウトしている可能性のある他の人とこのリポジトリを共有している場合、2 つのオプションがあります

また...

  • とにかく強制プッシュしてから、そのブランチで共同作業している各人に連絡して、ローカルコピーを破棄するようにアドバイスしてください。このワンライナーを送信し、変更がある可能性がある場合は隠しておくようにアドバイスします。

    $ git fetch && git checkout dev && git reset --hard origin/dev
    

    devこれを行った後、ローカルブランチでのコミットが失われた可能性があります。チェリーピッキングでそれらを回復できます。

また...

  • あなたがやろうとしていることをしないでください。共有ブランチの履歴を書き換えるべきではありません。他の人に迷惑をかけるだけです。
于 2014-07-16T20:58:37.190 に答える
1

これがrevert目的です。最後の 2 つのコミットを元に戻すことができます。これにより、古いコミットがグラフに保持され、新しいコミットが作成されて内容が取り消されます。これにより、履歴は書き換えられませんが、効果が生じます。

または、歴史を書き換えて、その結果に苦しむこともできます。

于 2014-07-16T23:20:59.263 に答える