私は自分自身をぎこちなくしました。この画像は、私が自分自身を置いた状況を示しています。
当然のことながら、早送りではない更新が拒否されるため、グリーンコミットをプッシュできなくなりました。リモートで、リモートgit reset --hard HEAD~1
のコミットを消去するコマンドを実行できるようにdevブランチをチェックアウトしようとしましたが、これはベアリポジトリであるため、devブランチをチェックアウトできません。現在のブランチは常に「マスター」です。私の目標は、リモートの赤いコミットを削除して、緑のコミットをプッシュできるようにすることです。
リモートのdevブランチをチェックアウトせずに、リモートdevブランチの赤いコミットを削除するにはどうすればよいですか?
git revert
元に戻す必要のあるコミットがすでにプッシュされている場合は、代わりにコマンドを使用する必要があることがわかりました。私はこれらの質問(およびその他多くの質問)を調べましたが、リモートでコミットを削除するためのソリューションを適用する方法がわからないか、そうでないため、現在の質問に対応していないと思います。裸のリポジトリで動作します。
「Gitプッシュの早送り以外の更新が拒否された」とはどういう意味ですか?
Gitで最後のコミットを元に戻す方法は?
チェックアウトせずにブランチを早送りするにはどうすればよいですか?チェックアウト
せずにブランチをリベースします
他のリポジトリがリモートからプルし、それらを壊したくないので、プッシュを強制したくありません。ただし、まだ誰もリモートからプルしていないことを知っているので、赤いコミットを削除するだけで大丈夫です。
フォースプッシュは、まさにここでやりたいことです。強制プッシュは、関係するすべての関係者のリモートリポジトリを魔法のように破壊するわけではありません。代わりに、forceフラグを使用してプッシュすると、早送り以外の変更を行う必要がある場合でも、Gitにブランチポインターを更新するように指示するだけです。
これがあなたの(裸の)リモートでのあなたの状況だと想像してください:
A -- B -- C -- D
↑
master
ブランチは、リポジトリの履歴内のコミットへの単なるポインタであることに注意してください。ここで、親としてE
持つコミットをプッシュしたいC
ので、最初のステップでは、コミットを転送するだけです。
/-- E
/
A -- B -- C -- D
↑
master
ここで、をmaster
指すようにブランチを更新するようにリモートに指示しE
ます。通常の状況では、Gitはmaster
に早送りできないため、これを拒否しますE
。したがって、代わりに、強制的にプッシュして、Gitにその事実を無視するように指示する必要があります。したがって、リモートリポジトリは次のようになります。
master
↓
/-- E
/
A -- B -- C -- D
したがって、他のブランチがD
(直接的または間接的に)指し示していない限り、そのコミットは「失われ」、最終的にはガベージコレクションされます。
通常、コミットを知っているD
(そしてそれを指すローカルブランチを持っている)すべての人が新しいリモートで問題を抱えているため、これを避ける必要があります。たとえば、古いローカルがをmaster
指している場合、代わりにD
をmaster
指すようE
にブランチを手動でリセットする必要があります。したがって、通常、ルールは、D
一度プッシュしたものを決して削除しないことです(技術的には履歴から削除します)。
ただし、誰もフェッチしたことがないと確信している場合はD
、これに問題はありません。一度も持っていなかった人D
は、それがD
消えたことに気づかず、master
いつもこうだったと思います。そして、フォースプッシュの前に存在し、後でまだ存在する他のすべてのコミットは、状況について何も変更しません。重要なのは、フォースプッシュで「削除」されるコミットのみです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加