1. ホーム
  2. git

[解決済み] 複数のGitコミット(既にプッシュ済み)を公開リポジトリに戻すにはどうすればよいですか?

2023-02-22 17:54:10

質問

git を使い始めたばかりで、すでに失敗しています。

私はいくつかの変更をコミットしてリモートの開発マシンにプッシュしました。 私は古いバージョンを回復する必要がありますが、別のブランチで作業を続けるために、これまでに行った "bad progress" を保持します。

私はそれをこのようにすることを考えていました。

  1. ローカルブランチを作成する という名前のブランチを作成します。
  2. ローカルリポジトリを復帰させる が動作していた状態に戻す (うまくいけば意味のあるコミットで) ;
  3. リモートへのプッシュ

  4. tested-thingのテストを終了します。

  5. マージ "tested-thing" を開発へ
  6. リモートにプッシュする

ステップ 3 と 5 の間に他の開発者がコミットしてプッシュする可能性があり、これが "マージの悲劇" につながるのではないかと心配です。

UPDATEです。

ここでの主な問題は、2)にあります。

ここで、トピックについて: "トピックブランチに仕事を分割する"。 http://learn.github.com/p/undoing.html

と提案されています。

  1. gitブランチテスト
  2. $ git reset --hard a6b4c974

そうすることで、他の開発者はまだ

$ git commit (開発ブランチにおいて)

そして、私は をチェックアウトしてテストすることができます。 を行い マージ の時間です。

すべての選択肢にもかかわらず、これは従うべき素晴らしいアプローチのように感じられます。 しかし、これはプッシュした後に実行できるかどうかは記載されていません。

以下のことに注意してください。 これらの変更を行ってから、私はすべてのことを台無しにしました。 このリポジトリで作業した人は誰もいません。 . だから、作業ディレクトリを元に戻しても、誰も気づかないでしょう。

どのように解決するのですか?

問題点

使用できるワークフローはいくつかあります。主なポイントは、そのブランチを利用する可能性のあるすべての人とコミュニケーションをとり、すべての人のクローンに対して手術をする気がない限り、公開ブランチの履歴を壊さないようにすることです。避けられるのであれば、そうしないのが一番です。

公開ブランチの解決策

あなたが示した手順にはメリットがあります。開発ブランチをすぐに安定させる必要があるのなら、そのようにすればよいのです。あなたは Git でのデバッグ を使えば正しいブランチポイントを見つけることができます。そして、最後の安定版コミットと HEAD の間のすべてのコミットを元に戻すことができるのです。

コミットをひとつずつ逆順に取り消すか、あるいは <first_bad_commit>..<last_bad_commit> の範囲で指定します。ハッシュはコミット範囲を指定する最もシンプルな方法ですが、他の表記もあります。 たとえば、5 つの不良コミットをプッシュしてしまった場合、次のようにリバートすることができます。

# Revert a series using ancestor notation.
git revert --no-edit dev~5..dev

# Revert a series using commit hashes.
git revert --no-edit ffffffff..12345678

これは、作業ディレクトリに反転したパッチを順番に適用し、既知のグッドコミットに向かって逆向きに作業します。このとき --no-edit フラグを付けると、作業ディレクトリへの変更は、反転したパッチが適用されるたびに、自動的にコミットされます。

参照 man 1 git-revert を参照してください。 man 7 gitrevisions を使えば、取り消すコミットを指定するさまざまな方法があります。

別の方法として、HEADから分岐して必要な部分を修正し、再マージすることもできます。その間、ビルドは壊れますが、これはある状況下では理にかなっているかもしれません。

危険地帯

もちろん、もしあなたが 絶対確実 が確実で、かつ、リモートが ベアリポジトリ であれば、fast-forward でないコミットを行うことができます。

git reset --hard <last_good_commit>
git push --force

これは、あなたのシステムと上流側のホストに reflog をそのまま残します。しかし、直接アクセスできる履歴からは間違ったコミットが消え、プルで伝搬することもなくなります。リポジトリが整理されるまで、あなたの古い変更は残ります。しかし、あなたが誤って行ったコミットを見たり回復したりできるのは Git の忍者だけでしょう。