コンテンツにスキップ
GitTree

レッスン 28 · 回復

共有履歴の変更を元に戻す

履歴を削除するのではなく、変更をキャンセルする新しいコミットを追加することで、他の人がすでに行っている不適切な変更を元に戻し、通常のプッシュで修正を公開します。

このブラウザに進行状況が保存されました。

再生すると、YouTube からビデオが読み込まれます (プライバシー強化モード)。

英語ナレーション · English and Arabic 件のキャプション

動画ページを開くYouTubeで見る

何を学ぶか

  • 逆コミットとしてのリバートと、それが他のユーザーの履歴に適している理由を説明します。
  • 新しいコミットの親とそれが残すファイルを予測します。
  • 競合する元に戻す処理を処理し、マージを元に戻すときに親が必要になる理由を理解します。
  • 強制せずに修正を公開します。

始める前に

あなたは、レッスン 18 の結果 M からの分岐である shared/dark-regression にいます。その最後のコミット「style: recruit the rehearsal contrast regression」は、styles.css、body { color: #f7f8fa; } に 1 つのルールを追加し、ページ テキストを背景と同じ淡い色にします。そのコミットはこのレッスン用に設定したローカル サーバー上にすでに存在するため、チームメイトがそれを持っている可能性があります。他の人がすでに持っているものを書き換えることなく、テキストを再び読めるようにしたいとします。

すべてがローカルであり、無料プランです (GitTree はサインインを要求します)。ホスティング アカウント、プロバイダー、インターネットはありません。サーバーはローカルのベア リポジトリであり、GitHub ではありません。すべてのアイデンティティは架空のものです (example.com)。このレッスンを実際のプロジェクトで実行しないでください。

変更は、GitTree 内で行うか、ネイティブ Git コマンドを使用して行います。同じコピー内で両方を行うことはできません。結果の読み取りは常に安全です。メニュー ラベルは GitTree 2.0 独自の文字列から取得され、ネイティブ コマンドは使い捨てコピーの Git 2.43 で実行されました。 GitTree ステップは macOS、Windows、または Linux で実行されませんでした。

概念と状態の効果

Revert は、1 つのコミットの変更内容を確認し、反対の変更を適用する new commit を追加します。不正なコミットは履歴に残り、それが起こったという証拠も残ります。リセットはその逆です。ブランチを元に戻してコミットを残します。これは自分だけが持っている作業には問題ありませんが、すでにコミットを持っている全員にコピーの修復を強制します。

ここでは、新しいコミットの親は不正なコミットであり、ファイルは以前とまったく同じになります。ブランチは 1 つのコミット分だけ前進し、サーバーは通常のプッシュでそれを受け入れます。これは、そこにあるものに追加するだけであるためです。

逆の変化は周囲にあるものによって異なります。不正なコミットの後に誰かが同じ行を変更した場合、復帰は競合で停止し、他の場合と同様に解決するか (レッスン 23)、中止します。 merge コミットを元に戻すには、変更を測定する親を選択するよう求められます。通常は、最初のブランチがマージされます。マージを元に戻すと、その変更が処理されたことが Git に通知されるため、後で同じブランチをマージすると、マージ対象が何も報告されない可能性があります。このレッスンでは、通常のコミットを元に戻し、そのダイアログのみを表示します。

現在のブランチのみがコミットを取得します。あなたが押すまで何も動きません。

正確なプロジェクトの状態を準備する

レッスン 18 の結果 M の別の通常のコピーから開始し、オリジナルはそのままにしておきます。ブランチを作成し、DOC_DARK_BAD を styles.css 上に保存してコミットします。コピーの横に新しい空のベア リポジトリを作成し、それを rehearsal という名前のリモートとして追加し、そのアップストリームでブランチをプッシュします。 CSS_RESTORED は、元に戻した後のファイルの外観です。

完全なファイル入力

以下のフェーズでのみ保存します。これらは、最後に改行を含む完全な UTF-8/LF 本文です。 Markdown フェンスは決して貼り付けないでください。変更されていない実行可能ファイルは、名前付き入力を継承します。別のバリアントのバージョンでオリジナルを上書きしてはなりません。

スタイル.css — DOC_DARK_BAD

ファイルの抜粋 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

body { color: #f7f8fa; }

スタイル.css — CSS_RESTORED

ファイルの抜粋 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

GitTreeで

Command+Shift+P (Ubuntu では Ctrl+Shift+P) でパレットを開きます。コミットに対するアクションでは、そのコミットの右クリック メニューを使用します。

  1. 次のセクションで示すように、ブランチ、コミット、ローカル サーバーを構築します。 shared/dark-regression をチェックアウトし、ワークツリーをクリーンな状態に保ちます。
  2. グラフで不正なコミットを選択し、その詳細を確認します。変更されたパスが 1 つ、styles.css、追加された行が 1 つあります。
  3. 右クリックして Revert Commit を選択します。これは、現在いるブランチにすぐに適用されます。メッセージエディタはありません。通知には「取り消しました」と書かれています。代わりに停止した場合は、「Shared/dark-regression で元に戻す…」というバナーが Resolve、Continue、および Abort… を提供します。
  4. 新しいコミットを選択します。その件名は Revert "style: introduce the rehearsal contrast regression" で、その親は不正なコミットです。不正なコミットはまだグラフ内にあります。
  5. styles.css を開きます。ルールが追加されていない CSS_RESTORED です。
  6. ツールバー Push をクリックします。これはブランチの上流への通常のプッシュです。 [強制プッシュ (リースあり)] は選択しないでください。通知には「共有/ダーク回帰をリハーサル/共有/ダーク回帰にプッシュしました」と書かれています。
  7. 結果を確認します。ワーク ツリーはクリーンで、両方のコミットがグラフ内にあり、サーバー ブランチが新しいコミット上にあります。

マージ コミットを右クリックすると、Revert Commit は First parent (the branch merged into) と Second parent (the branch merged in) を含む「マージを元に戻す…」を開きます。ここでは実行しないでください。

コース内のすべての通常のコミット: Summary は指定された件名、Description は空、オプション Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit、および Allow Empty Commit はオフのままです。

ターミナル内

レッスン 18 の結果の別のコピー:

Command · bash
git switch --create shared/dark-regression

DOC_DARK_BAD を styles.css として保存し、次のようにします。

Command · bash
git add -- styles.css
git commit --quiet -m "style: introduce the rehearsal contrast regression"
BAD_SHA="$(git rev-parse HEAD)"
git init --quiet --bare --initial-branch=main ../gittree-revert-origin.git
git remote add rehearsal ../gittree-revert-origin.git
git push --quiet --set-upstream rehearsal shared/dark-regression

次に、結果を元に戻し、公開し、読み取ります。

Command · bash
git revert --no-edit "$BAD_SHA"
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?
git log -1 --format=%s
git push --quiet rehearsal shared/dark-regression
git status --short
git ls-remote --heads rehearsal refs/heads/shared/dark-regression
git rev-parse HEAD
出力
0
Revert "style: introduce the rehearsal contrast regression"

祖先チェックでは 0 が出力されます。不正なコミットはまだ HEAD の後にあります。 styles.css は CSS_RESTORED、ステータスは空、ls-remote と rev-parse の 2 つの ID は等しいです。強制オプションは含まれていませんでした。後のコミットが同じ行を編集する別のコピーでは、git revert は「CONFLICT (content)」とヒント git revert --continue および git revert --abort で停止します。そして、マージコミットの git revert は「マージですが、-m オプションが指定されていません」という理由で拒否されます。 -m 1 は最初の親を選択します。

結果

Where you end: shared/dark-regression には、不正なコミットをキャンセルする新しいコミットが 1 つあります。ページは CSS_RESTORED を使用しており、不正なコミットはまだ履歴にあり、サーバー ブランチは新しいコミット上にあり、ワーク ツリーはクリーンであり、何も強制されていません。

よくある間違い

  • リセットと強制プッシュを使用して、他の人がすでに持っているコミットを「削除」します。
  • 不正なコミットがログから消えることを期待します。
  • 意図的に親を選択せずにマージを元に戻す。
  • ファイルを見る前にプッシュすると、元に戻ります。

何か問題が発生した場合

競合により復帰が停止した場合は、バナーをお読みください。 Resolve と Continue はレッスン 23 と同様に終了します。 Abort… はブランチを元の場所に戻します。終了後に取り消し自体が間違いだった場合は、取り消しを元に戻します。これは単なる別のコミットです。

理解度を確認してください

各質問に答えてから、その理由を読みましょう。 「必須」とマークされた質問は、レッスンの完了にカウントされます。

  1. 質問 1 / 6

    不正なコミットに対して revert は何をしますか?

    答えを 1 つ選択してください。

  2. 質問 2 / 6

    復帰後、正しいのはどれですか?

    当てはまるものをすべて選択してください。

  3. 質問 3 / 6
    必須

    不正なコミットを元に戻して、通常どおりプッシュします。その後、サーバーブランチはどこにありますか?

    答えを 1 つ選択してください。

  4. 質問 4 / 6

    入力を変更します。後のコミットでは、不正なコミットが追加したのと同じ行を編集し、その後、不正なコミットを元に戻します。何が起こるのですか?

    答えを 1 つ選択してください。

  5. 質問 5 / 6
    必須

    マージコミットを元に戻そうとすると、Git は「マージですが、-m オプションが指定されていません」と表示します。何が起こっているのでしょうか?そして何をしますか?

    答えを 1 つ選択してください。

  6. 質問 6 / 6
    必須

    リバートとプッシュの後、レッスンの内容が実行されたことを示すリードバックはどれですか?

    当てはまるものをすべて選択してください。

6 個中 0 個が正解です

必須の質問に正しく答えると、レッスンを完了できます。

このブラウザで確認しました。

練習する

取り消しのサブジェクト、その親、不正なコミットが依然として祖先であるかどうか、サーバー ブランチが HEAD に等しいかどうかを報告します。次に、元に戻す前に後のコミットで同じ行が変更されていた場合に何が起こるかを予測します。

あなた自身の確認: サイトはあなたのコンピュータを認識できません。

レッスンを完了するには、必須の質問に正しく答え、実践的な演習を確認してください。

要約

  • Revert は、別のコミットをキャンセルするコミットを追加します。
  • 歴史は残ります。ファイルは元に戻ります。
  • 普通に押すだけで十分です。

用語集の用語の紹介

元に戻す — 戻る;逆変化 — تغيير معاكس;メインラインの親 — テスト。

ビデオトランスクリプト

ビデオのナレーションが次々と流れます。

トランスクリプトを表示する
  1. 他の人がすでに行った変更を元に戻す 持っています。
  2. リセットするとブランチが元に戻ります。元に戻すと追加 代わりに新しいコミットを実行します。
  3. 他の人はすでに古いコミットを持っています。元に戻す コピーを有効なままにします。
  4. 間違ったコミットを使用して共有ブランチを構築します。 そしてそれを備えたローカルサーバー。
  5. グラフには M と不正なコミットが示されています。 上。
  6. 不正なコミットにより 1 行が追加され、テキストが 青ざめる。
  7. その ID を書き留めます。
  8. それを右クリックし、「コミットを元に戻す」を選択します。
  9. 一気に適用されます。メッセージはありません 編集者。
  10. 通知には元に戻されたと書かれています。
  11. 新しいコミットには古いコミットの名前が付けられます。
  12. その親は不正なコミットです。何もありませんでした 削除されました。
  13. ファイルは元の状態に戻りました。淡いルール なくなってしまった。
  14. グラフには両方のコミットが表示されます。の 歴史は成長するばかりでした。
  15. この支店のみ移転しました。何もない まだ出版されていません。
  16. ブランチはコミットの 1 つ前にあります サーバー。
  17. 「プッシュ」をクリックします。これは通常のプッシュです。
  18. 通知には支店名と サーバー。
  19. 力は必要ありませんでした。プッシュは追加しただけです コミットします。
  20. ターミナルで、編集せずに git revert 同じことをします。
  21. 不正なコミットは依然として祖先です。の 答えはゼロです。
  22. そして主題はRevertから始まります。
  23. プッシュしてサーバーの ID を比較します 頭。彼らは平等です。
  24. 入力を変更します: 誰かが同じものを編集しました 後でライン。
  25. 復帰は競合により停止します。解決する 続行するか中止します。
  26. マージを元に戻すには、親が必要です。 通常はそれが最初です。
  27. マージを元に戻した後、それをマージします 再びブランチしても何も起こらないかもしれません。
  28. 練習: 被験者、親、 祖先チェックとサーバー ID。
  29. 次に、reflog で失われたコミットを見つけます。