[解決済み] 複数のGitコミット(既にプッシュ済み)を公開リポジトリに戻すにはどうすればよいですか?
質問
git を使い始めたばかりで、すでに失敗しています。
私はいくつかの変更をコミットしてリモートの開発マシンにプッシュしました。 私は古いバージョンを回復する必要がありますが、別のブランチで作業を続けるために、これまでに行った "bad progress" を保持します。
私はそれをこのようにすることを考えていました。
- ローカルブランチを作成する という名前のブランチを作成します。
- ローカルリポジトリを復帰させる が動作していた状態に戻す (うまくいけば意味のあるコミットで) ;
-
リモートへのプッシュ
-
tested-thingのテストを終了します。
- マージ "tested-thing" を開発へ
- リモートにプッシュする
ステップ 3 と 5 の間に他の開発者がコミットしてプッシュする可能性があり、これが "マージの悲劇" につながるのではないかと心配です。
UPDATEです。
ここでの主な問題は、2)にあります。
ここで、トピックについて: "トピックブランチに仕事を分割する"。 http://learn.github.com/p/undoing.html
と提案されています。
- gitブランチテスト
- $ 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 の忍者だけでしょう。
関連
-
[解決済み】複数のgitコミットを元に戻すには?
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] Git でブランチからコミットを削除する
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] 複数のコミットを1つのスクワッシュされたコミットとして別のブランチにマージするにはどうすればよいですか?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】複数のgitコミットを元に戻すには?
-
git commit コマンドで追跡した新規ファイルをコミットすると、プロンプト *** Please tell me who you are が表示されます。
-
Git がエラーを報告しました。現在のブランチの先端が遅れているため、更新が拒否されました。
-
git reports an error fatal: unable to auto-detect email address (got 'Administrator@MS-20180504MMDH.(none)')
-
[解決済み] フォルダからサブモジュールのリポジトリを作成し、そのgitコミット履歴を保持する
-
[解決済み] Git は、省略形のコミット ID が 2 つの異なるコミットを参照する場合に警告を発しますか?
-
[解決済み] なぜgit AuthorDateはCommitDateと違うのですか?
-
[解決済み] Git のリモート HEAD を master 以外に指定するように変更する
-
[解決済み] gitは "サイレントモード "で動作しますか?
-
[解決済み] 別のユーザーでコードをコミットするにはどうすればよいですか?