差分モード¶
エディター全体を、変更を見るための 差分モード に切り替えます。 開き方で、何と比べるか(比較元)が決まります。
| キー | 比較元 | 必要なもの |
|---|---|---|
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のリサイズモードで=を押すと半分ずつに戻ります。統合表示では変わりません。