コンテンツにスキップ
GitTree

レッスン 32 · 回復

プッシュ後のミスを回復する

他の人がすでに犯している可能性のある間違いを修正します。新しいコミットを好み、自分が所有するブランチを書き直す必要がある場合は、レビューした正確なリモート ヒントに固定されたリースを使用して強制します。

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

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

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

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

何を学ぶか

  • 追加的な修復とプッシュされたミスの再書き込みのどちらかを選択します。
  • リースが何をチェックするのか、そしてなぜ期待されるコミットが重要なのかを説明します。
  • 古いリースの拒否を予測し、チームメイトの仕事を続けます。
  • GitTree が強制的にプッシュする前に、何が保持されているかを把握してください。

始める前に

ローカル リハーサル サーバー上の 2 つの状況。 shared では、不正なコミットがすでにプッシュされており、他のコミットがそれを持っている可能性があります。 lease で、ドラフトをプッシュしてローカルで書き直しましたが、その間に Leo は新しいコミットを同じブランチにプッシュしました。

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

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

概念と状態の効果

チームメイトが間違ったコミットを持っている可能性がある場合は、新しいコミットで修復し (元に戻す、レッスン 28)、通常どおりプッシュします。間違いは歴史に残り、誰もクローンが無効になることはありません。公開されたブランチは、自分が所有している場合にのみ書き換えてください。

lease は強制プッシュを条件付きにします。Git は、リモート ブランチがまだ予期した場所を指している場合にのみリモート ブランチを置き換えます。 --force-with-lease=<ref>:<commit> は、予想されるコミットに名前を付けます。裸の --force-with-lease はリモート追跡参照を使用し、git fetch はその参照を移動するため、フェッチしてプッシュすると、ダウンロードしたばかりの内容が上書きされる可能性があります。 GitTree は最後に取得したコミットを固定し、ダイアログに表示し、置き換えられたチップを refs/ogt/trash の下に保持します。

リースは、チームメイトの作業を上書きできるかどうかを決定するものではありません。見ていないものを上書きしないように保護するだけです。

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

新しいローカルのベア リポジトリを唯一のリモートとして使用して、レッスン 18 の結果の別の通常のコピーから開始します。 RECOVERY_BAD は不正なスタイルシートです。 LEASE_A、LEASE_B、LEASE_REWRITE はノートの 3 つのバージョンです。

完全なファイル入力

以下の各ファイルを、示されているとおりに正確に保存します。UTF-8、LF 行末と最後の改行を、Markdown フェンス線なしで保存します。リストされていないファイルは、その内容が M から保持されます。

スタイル.css — RECOVERY_BAD

ファイルの抜粋 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #f7f8fa;
  --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;
}

docs/lease-note.md — LEASE_A

出力
# Private release rehearsal

The reviewed draft is still private.

docs/lease-note.md — LEASE_B

出力
# Private release rehearsal

Leo added a review that must not be overwritten.

docs/lease-note.md — LEASE_REWRITE

出力
# Private release rehearsal

This alternative draft has not seen Leo's review.

GitTreeで

Command+Shift+P (Ubuntu では Ctrl+Shift+P) でパレットを開きます。

  1. 次のセクションで示すようにリハーサルを構築します。不正なコミットが shared にプッシュされ、サーバー上に Leo の新しいコミットを含む lease ブランチが作成されます。
  2. Additive repair. shared で、不正なコミットを右クリックして Revert Commit を選択し、次に Push をクリックします。これは通常のプッシュです。 [強制プッシュ (リースあり)] は選択しないでください。
  3. Stale lease. private/lease で、ブランチにプッシュされたコミットが含まれないようにドラフトをローカルで書き直し、ツールバー Push を使用してプッシュしてみます。 private/lease は別の名前で origin/lease を追跡しているため、GitTree は最初にどこにプッシュするかを尋ねます。Push to origin/lease を選択します。 「リモートがプライベート/リースを拒否しました」というタイトルのダイアログに、Fetch Only、Rebase and Push、Merge and Push、および Force Push… が表示されます。
  4. 最初に Fetch Only を選択してグラフを読んでください。リモート ブランチには Leo のコミットが含まれていますが、リライトには含まれていません。それはチームメイトの仕事です。
  5. Force Push… を開きます。 「プライベート/リースをオリジン/リースに強制プッシュしますか?」ダイアログブランチに不足しているコミットはリモートから削除され、リモートが表示されているコミットにある間のみプッシュが続行され、置き換えられたチップが refs/ogt/trash の下に保持されることが示されています。キャンセル;レオの仕事はあなたの代わりにはなりません。
  6. 代わりに和解してください: Rebase and Push はレオの下書きの上にあなたの下書きを置くか、最初に彼に尋ねてください。実際に強制プッシュが実行された場合、通知には「強制プッシュされました。交換されたリモート チップは…に保たれます」と表示され、Undo は強制プッシュを、再度押すと元に戻るリモコンへの変更として扱います。

ターミナル内

元に戻した後、shared で:

Command · bash
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?

答えは 0 です。間違いは歴史に残り、誰もクローンの修復を強制されませんでした。

Leo のコミットがすでにサーバー上にある private/lease で、確認したコミットを使用して固定されたリースをテストします。

Command · bash
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short
出力
 ! [rejected]        HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1

Git は拒否し (「情報が古い」)、サーバーは依然として Leo のコミット名を指定し、ステータスは空です。リモート追跡参照が古い間は裸の git push --force-with-lease origin HEAD:lease も拒否されますが、フェッチによって比較対象の参照が移動されたため、git fetch origin lease の後に同じコマンドが Leo のコミットを置き換えます。レビューしたコミットに名前を付けるか、リベースで調整します。

結果

Where you end: の不正な commit はまだ shared の履歴にあり、その上にある復帰は正常にプッシュされました。 lease で固定プッシュは拒否されましたが、サーバーは Leo のコミットを保持しており、ローカルの書き換えはそのままです。強制的なプッシュは行われませんでした。

よくある間違い

  • リバートが必要な場合は、他の人がすでにプルしたブランチを書き換えます。
  • フェッチし、ベア リースを使用して強制的にプッシュします。これにより、ダウンロードしたばかりのものが信頼されるようになります。
  • リースをチームメイトのコミットを置き換える許可として扱います。
  • 元に戻すことでサーバーへの強制プッシュを元に戻すことができると仮定します。

何か問題が発生した場合

強制プッシュによって間違ったチップが置き換えられた場合、置き換えられたコミットは refs/ogt/trash に保存されます (ネイティブ プッシュの場合は、reflog とチームメイトのクローンに保存されます)。チームメイトに伝え、先端を枝として復元し、同意を得て再度押します。プッシュを拒否しても何も変わりませんでした。

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

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

  1. 質問 1 / 6

    不正なコミットがすでに共有ブランチ上にあります。最も安全な修理とは何でしょうか?

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

  2. 質問 2 / 6

    --force-with-lease について正しいのはどれですか? (複数選択)

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

  3. 質問 3 / 6
    必須

    レビューしたコミットにリースを固定してプッシュしましたが、Leo はその後プッシュしました。何が起こるのですか?

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

  4. 質問 4 / 6

    入力を変更します。git fetch origin lease を実行してから、裸の git push --force-with-lease origin HEAD:lease を実行します。何が起こるのですか?

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

  5. 質問 5 / 6
    必須

    同僚は「リース付きフォースは誰にとっても安全なフォースプッシュになる」と言っています。正しい返答は何ですか?

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

  6. 質問 6 / 6
    必須

    ピン留めされたプッシュの後、何も失われていないことを示すリードバックはどれですか? (複数選択)

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

6 個中 0 個が正解です

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

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

練習する

shared の祖先チェック、ピン留めされたプッシュの終了コードとメッセージ、lease に対するコミット ls-remote の表示、フェッチの前後でベア リースが拒否されたかどうかを報告します。

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

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

要約

  • 他の人が持っているものよりも新しいコミットを優先します。
  • 確認したコミットにリースを固定します。
  • リースはあなたを守るものであり、チームメイトの意図ではありません。

用語集の用語の紹介

リース — قفل;古い情報 — معلومات قديمة;チップを交換しました — الرأس المستبدَل。

ビデオトランスクリプト

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

トランスクリプトを表示する
  1. あなたは間違いを押しました。今は何ですか?
  2. 他の人がコミットを持っている可能性がある場合は、それを修復します コミットを追加することで。
  3. リースには、次の場合にのみリモコンを交換してくださいと記載されています。 それはまだ私が期待しているところです。
  4. しかし、フェッチはなんとベアリースを移動します 期待しています。
  5. ローカルサーバー上の 2 つのブランチ: 共有、 そしてリース。
  6. 共有では、不正なコミットを元に戻します。
  7. 普通に押してください。強制力はありません。
  8. 間違いは歴史に残る、誰も残らない クローンを修復する必要があります。
  9. リースでは、書き換えられたブランチは拒否されます。
  10. 取り出して見るだけです。レオのコミットは そこに。
  11. リモコンがオンになっている間のみ続行されます。 このコミットは古いヒントを保持します。
  12. レオの仕事はあなたの代わりにはなりません。リベース それを聞くか、彼に尋ねてください。
  13. ターミナルで祖先をチェックします。 共有はゼロです。
  14. レビューしたコミットに名前を付けます。 Git は言います 古い情報。
  15. サーバーは依然として Leo のコミットに名前を付けます。
  16. フェッチ後のベアリースでは、 それを交換しました。
  17. 「元に戻す」では、強制プッシュを元に戻すことはできません。 サーバー。
  18. 練習: 終了コードとサーバーを報告する コミットとステータス。
  19. 次に、次のようにして 2 つのブランチを同時に処理します。 ワークツリー。