コンテンツにスキップ

差分モード

エディター全体を、変更を見るための 差分モード に切り替えます。 開き方で、何と比べるか(比較元)が決まります。

キー 比較元 必要なもの
Space G、Ctrl+G、:gitdiff HEAD git
Space g、:pr、:pr <番号> プルリクエストの base git、gh(gh auth login 済み)
  • 開いているときに同じキーを押すと、差分モードを閉じます。
  • 違うキーを押すと、比較元が切り替わります。
  • どちらの比較元でも、右側(作業ツリーのファイル)はその場で編集・保存できます。

画面

上から次の順に並びます。

場所 内容
ヘッダー 比較元と比較先。プルリクエストのときは PR #番号・タイトル・状態・作者も出す
左のサイドバー 上 7 割がファイルツリー、下 3 割が CHANGES(変更ファイルの一覧)
中央 差分。右端に変更位置のバー
ヘルプ行 今使えるキー
ステータス行 モードとメッセージ
  • 変更のないファイルは、通常のエディターで開きます。
  • 変更のあるファイルは、ファイル全体を Split(左が比較元、右が今のファイル)で開きます。
  • 新規ファイル(比較元が HEAD のときは未追跡を含む)は、比較元が HEAD でも PR の base でも、エディター 1 枚で開きます。行に色は付けません。右端のバーは全体が緑になり、上のファイル名の行(+N / -N)も出ます。比較元が HEAD のとき、コミットすると、ほかの変更のあるファイルと同じ表示になります。
  • 比較元が PR の base のとき、1 枚で開いた新規ファイルにも、PR のコメントが正しい行に出ます。コメントの追加や返信もできます。
  • 編集すると、差分がすぐに更新されます。
  • CHANGES は、保存したとき、外部の変更を検知したとき、数秒ごとに更新します。

CHANGES

ファイルツリーと同じく、フォルダのツリーで表示します。 子が 1 つだけのフォルダは、internal/config のように 1 行にまとめます。

ファイルの行には、状態の文字、ファイル名、増えた行数 +N、減った行数 -N を出します。

文字 状態
M 変更
A 追加(未追跡を含む)
D 削除
R 名前の変更

見出しの右端に、今の比較元を出します。DIFF は HEAD、PR はプルリクエストの base です。

Split と Unified

次のどれかで切り替えます。

  • CHANGES で s
  • :gitdiff split、:gitdiff unified
  • 差分の上のファイル名の行をクリック(1 枚で開いている新規ファイルでは、切り替える先が無いので、行の右の [分割 ⇄ 統合] は出ず、クリックしても何も起きません)

Unified でも編集できます。削除された行は、読み取り専用の行として挟まります。

変更位置のバー

差分の右端の 1 列に、ファイル全体のどこに変更があるかを出します。

色 変更の種類
緑 追加だけ
赤 削除だけ
青 書き換え(左右の両方に行がある)。1 段に複数の種類が入るときも青
  • バーの高さがファイル全体に対応します。ファイルが画面より長いときは、1 段に複数の行をまとめます。
  • 今表示している範囲は、バーの背景が明るくなります。
  • バーをクリックすると、その位置へスクロールします。

行内の差分

行の一部だけが変わった行では、変わった部分を行の背景より濃い色で強調します。 左(比較元)は削除の色、右(今のファイル)は追加の色です。

  • 比べるのは、Split で左右に並ぶ行どうしです。Unified でも同じ組を使います。
  • 共通の文字が半分未満の組は、無関係とみなして、行全体の色だけにします。
  • 400 文字を超える行は、行全体の色だけにします。
  • 変更された行がとても多いときは、1 回に比べる量を制限します。残りの行は、編集や更新のたびに少しずつ比べます。

比較元

比較元 内容
HEAD HEAD と作業ツリーを比べる。未追跡ファイルを含む
プルリクエストの base git merge-base <PR の base> HEAD と作業ツリーを比べる

プルリクエストの base と比べると、GitHub の PR 画面の差分に、まだコミットしていない変更を足したものになります。 base ブランチをマージしても、差分には自分の変更だけが出ます。

Space g で開くプルリクエストは、次のとおり選びます。

  • 今のブランチのプルリクエストが 1 つなら、一覧を出さずにそれを開きます。
  • 複数あるなら、そのプルリクエストだけの一覧から選びます。
  • 無いなら、リポジトリのプルリクエストの一覧から選びます。
  • :pr <番号> は、番号で指定したプルリクエストを開きます。:pr だけなら、リポジトリの一覧から選びます。

違うブランチのプルリクエスト

今のブランチと違うプルリクエストを選ぶと、gh pr checkout <番号> を実行してから開きます。

  • 未コミットの変更があると、ステータス行で「未コミットの変更を stash して切り替えますか? (y/n)」と聞きます。
    • y:git stash push -u -m "shijimi: PR #<番号> に切り替える前の変更" を実行してから、チェックアウトします。
    • n:切り替えを中止します。
  • gh pr checkout が失敗して元のブランチのままなら、stash した変更を git stash pop で戻します。戻せなかったときは、変更が stash にあることをステータス行に出します。
  • 未保存のファイルがあるときは、切り替えません。先に保存してください。
  • 別のプルリクエストの未送信コメントがあるときは、「破棄して PR #番号 を開きますか? (y/n)」と聞きます。比較元を HEAD に切り替えただけでは、未送信コメントは消えません。
  • これ以外の場面(比較元の切り替え、差分モードを閉じる、shijimi の終了)では、stash もコミットも自動では行いません。

PR とローカルのずれ

ローカルの HEAD と PR の最新コミットが違うときは、ステータス行に次のように出します。

状態 表示 CHANGES で r
PR が先に進んでいる 「PR が更新されました。r で pull します」 git pull --ff-only してから再読み込みする
ローカルが先に進んでいる 「push していないコミットが N 個あります」 再読み込みだけ
両方が進んでいる 「ローカルと PR が分岐しています」 再読み込みだけ(pull しない)

比べるために、PR の最新コミットと base ブランチを git fetch します。

レビュー

比較元がプルリクエストの base のとき、Space v でレビューのメニューを開きます。 右側はエディタなので、編集のキーとぶつからないように、レビューの操作はこのメニューにまとめています。

キー 動作
Space v c カーソル行、または選択範囲にコメント
Space v C 今のファイル全体にコメント
Space v t カーソル行のスレッドをカードで開く。行に無いときは、ファイルのコメントの一覧から選ぶ
Space v v viewed にする / 戻す
Space v A 承認して送信
Space v R 変更を要求して送信
Space v S コメントのみで送信
  • 範囲は、エディタの選択(x など)をそのまま使います。
  • VS Code キーマップでは、コマンドパレット(F1)の「レビュー:」から同じ操作ができます。
  • CHANGES にフォーカスがあるときの Space v C・t・v は、選んでいるファイルが対象です。

コメントを書けるファイル

GitHub のコメントは、PR の最新コミットの行番号に付きます。 手元で編集やコミットをすると、作業ツリーの行番号とずれます。 そのため、作業ツリーの中身が PR の最新コミットと同じファイルにだけ、コメントを書けます。suggestion の適用も同じです。

中身が違うファイルは、次のように表示します。

  • CHANGES のファイル名と、差分の上のファイル名の行に ✎ を出します。
  • 既存のコメントは行の横に出さず、ファイル名の行に「● コメント N(行には表示しません。Space v t で一覧)」とまとめて出します。
  • コメントしようとすると、ステータス行に「このファイルは手元で変更があるため、行にコメントできません」と出します。

判定は、保存のたびと再読み込みのたびにやり直します。手元の変更を元に戻せば、またコメントできます。 未保存の変更があるファイルにも、コメントできません。

GitHub は、差分の周り(変更された行と、その前後 3 行)にしかコメントを付けられません。それ以外の行では、ステータス行にそう出します。

コメントの表示

場所 表示
行番号の左 コメントのある行に ●
差分の上のファイル名の行 ファイル全体へのコメントがあれば「● ファイルへのコメント N」
CHANGES の行 ✓(viewed)、●N(コメントの数)
CHANGES の見出し viewed 2/5(幅が狭いときは ✓2/5)
ステータス行の右 「未送信コメント N 件」

カード

コメントは、LSP のホバーと同じようなカードで表示します。 ● をクリックするか、Space v t で開きます。

● にマウスを乗せても開きます(mouse-hover が有効なとき)。このカードは読むだけで、キーを受け取りません。キーを押すと閉じて、そのキーはエディタへ渡ります。ポインタがカードの外へ出ても閉じます。

  • コメントは Markdown として整形します。
  • mermaid のコードブロックは図にします(Markdown プレビューと同じ部品です。mermaid-command が無いときはソースを表示します)。

カードが開いている間は、次のキーをカードが受け取ります。

キー 動作
r 返信(未送信のコメントでは編集)
x 解決 / 未解決に戻す(未送信のコメントでは削除)
s suggestion を手元のファイルに適用して保存
Enter その行へカーソルを移す
j / k、Ctrl+D / Ctrl+U スクロール
Esc カードを閉じる

ほかのキーを押すと、カードを閉じて、そのキーはエディタへ渡ります。

コメントの入力

コメント・返信・レビューの本文は、入力欄で書きます。入力欄の下に、カードと同じ見た目のプレビューを出します。

キー 動作
Enter 送信(コメントは未送信の一覧に入る)
Shift+Enter / Alt+Enter / Ctrl+J 改行
Ctrl+S 選んだ範囲の元の行を入れた ```suggestion ブロックを挿入する
Esc 取り消す
  • 行・範囲・ファイルへのコメントは、すぐには送りません。Space v A / R / S で、レビューとしてまとめて送ります。
  • 返信と解決は、すぐに送ります。
  • 送信に失敗したときは、GitHub に途中まで作ったレビューを消し、未送信のコメントを残します。
  • GitHub に自分の下書きのレビュー(pending)が残っていると、送信しません。GitHub の PR 画面で送信するか破棄してください。
  • ファイルの左側(base 側)の行へのコメントと、古くなったコメントでは、Enter はファイルを開くだけで、カーソルは動かしません。

CHANGES のキー操作

キー 動作
j / k 移動(フォルダの行にも止まる。閉じたフォルダの中は飛ばす)
g / G 先頭 / 末尾
h フォルダを閉じる。閉じているフォルダとファイルの行では、親のフォルダへ移る
Enter ファイルを開く。フォルダの行では開閉
l ファイルを開く。フォルダの行では開く
s 分割 / 統合の切替
r 一覧の更新(プルリクエストのときは、上の表のとおり pull することがある)
Space G / Space g 比較元の切替、または閉じる
Space v レビューのメニュー
Tab ファイルツリーへ
Esc エディタへ

マウス

  • CHANGES のフォルダの行をクリックすると、開閉します(開いているとき ▾、閉じているとき ▸)。開閉の状態は、一覧の更新や比較元の切り替えでは戻りません。
  • サイドバーと差分の境界をドラッグすると、サイドバーの幅を変えられます。
  • エクスプローラと CHANGES の境界(CHANGES の見出しの行)をドラッグすると、上下の高さの比率を変えられます。Alt+R のリサイズモードで = を押すと 7:3 に戻ります。
  • 分割表示で左右の境界の │ をドラッグすると、比較元と作業ツリーの幅を変えられます。幅はエディタを終了するまで保たれ、Alt+R のリサイズモードで = を押すと半分ずつに戻ります。統合表示では変わりません。