Closed9

Git の便利な小ネタたち

プレーンわにプレーンわに

git add -N / --intent-no-add

https://git-scm.com/docs/git-add/ja#git-add---intent-to-add

commit 前に diff を使って差分を確認しつつ確認できたものを add していく時によく使う
通常 untracked file は diff で差分を表示することが出来ないが、git add -N することで diff で差分を確認できるようになる

仕組みとしては単純で、add -N / --intent-no-add で指定したファイルを空のファイルとして add しているので差分が表示できるようになっている
https://stackoverflow.com/questions/24329051/what-does-git-add-intent-to-add-or-n-do-and-when-should-it-be-used/24347875#24347875

プレーンわにプレーンわに

git add -p / --patch

https://git-scm.com/docs/git-add/ja#git-add--p

一気に修正した後にコミットの粒度を細かくにしたい時によく使う
[y, n, q, a, d, g, /, i, J, k, K, s ,e ?] の選択肢があるがだいたい使うのは [y, n, q, a, s, e] ぐらい

  1. 一気に実装する
  2. git add -p [file] で patch モードへ
  3. コミットしたい単位で y / n を入力して staging していく
    4. 提案された単位より小さい単位で staging したい場合は s で小さくする
    5. s が使えなかったり上手くいかない場合は e で手動選択

プロジェクトによっては粒度を気にせず rebase してまとめたりするので使わないこともある

プレーンわにプレーンわに

git status --porcelain

https://git-scm.com/docs/git-status#Documentation/git-status.txt---porcelainltversiongt
git status で表示される情報を cli などで処理しやすいで出力してくれる
基本的には git status -s / --short と結果が変わらないが、 --porcelain はバージョン指定が出来る(デフォルトは v1)ので、ユーザの環境や git のバージョンに依存せず同じ結果を返せることが特徴
この特徴のおかげで過去に作ったスクリプトが git のバージョンアップ後に動かなくなる問題を防げる

以下のように sed を噛ませつつ goimports に渡したりするのに良く使っている
git status --porcelain | sed s/^...// | xargs goimports -w

プレーンわにプレーンわに

git diff --word-diff

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---word-diffltmodegt

通常行単位で比較する diff を単語単位で比較して出力してくれる
表示オプションとして [color, plain, porcelain] があるが個人的には color か porcelain が使いやすいと思う
メール文面やユーザ向けのお知らせなどを単語単位で diff を取ってチェックする時に便利(GitHub の PR Diff が word-diff 対応してくれると嬉しい)

git 管理していないファイルで git diff を使いたい場合

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt-codegitdiff--no-indexabcode
git 管理をしていないけど git diff で差分を取りたい場合は --no-index オプションを使って比較する
git diff --no-index --word-diff=color a.txt b.txt

おまけ

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---color-wordsltregexgt
--color-words のオプションもあるが、これは --word-diff=color と同じ出力になる
git diff --no-index --color-words a.txt b.txt

プレーンわにプレーンわに

git stash -u / --include-untracked

https://git-scm.com/docs/git-stash#Documentation/git-stash.txt--u
untracked なファイルもまとめて stash する時に使う
untracked を含めたくない場合は --no-include-untracked を使う
逆の --only-untrackedstash show 専用なため untracked のみを stash は出来ない。git add -N と組み合わせたりして解決する

小ネタ

https://git-scm.com/docs/git-stash#Documentation/git-stash.txt-save-p--patch-S--staged-k--no-keep-index-u--include-untracked-a--all-q--quietltmessagegt
stash する際には stash に名前をつけると思うが、順番に気をつけないと構文エラーになる
ok git stash save "hoge" -u
ng git stash -u save "hoge"

プレーンわにプレーンわに

git show --pretty="" --name-only [hash]

https://git-scm.com/docs/git-show#Documentation/git-show.txt---name-only

push 後にフォーマット漏れで CI の Linter に怒られたりした場合に時々使う
フォーマットとは別に修正も入れたいし、かと言って修正とフォーマットを同一コミットにしたくない時に使える
通常 git show [hash] は指定したコミットハッシュの変更内容を表示するが、--name-only のオプションで変更内容ではなく変更されたファイルの情報のみ取り出せる

$ git show --name-only 12345abc
commit 12345abc
Author: i_love_wani <example@example.com>
Date:   Sat Jan 01 00:00:00 2000 +0900

    hoge/piyo を修正

hoge/fuga/main.go
hoge/piyo/main.go

ただ、この状態だとフォーマッター(例えば gofmt)にわたすには Author などの情報が邪魔なので --pretty="" で削る

$ git show --name-only --pretty="" 12345abc
hoge/fuga/main.go
hoge/piyo/main.go

するとファイル名のみを取り出すことが出来るので、後は xargs などを使ってフォーマッターにパスを渡す
git show --name-only --pretty="" 12345abc | xargs gofmt -w

プレーンわにプレーンわに

git -C <path>

https://git-scm.com/docs/git#Documentation/git.txt--Cltpathgt

<path> で指定したディレクトリで git コマンドを実行することが出来る
複数のリポジトリに対してまとめて git 操作を行いたい場合に便利(cd が不要)

指定したディレクトリ配下のリポジトリに対して git pull --rebase を実行するスクリプト

※ fish script です

function pullall
  set branchName 'develop'
  if test (count $argv) -gt 0
    set branchName $argv
  end
  cd ~/hoge/ && find . -type d -depth 1 -exec git -C {} switch $branchName \; -exec git -C {} pull --rebase \;
end

$ pullall feature/hoge という感じで使えます
やっていることは

  1. hoge ディレクトリに移動
  2. hoge ディレクトリ配下を find し、以下の処理を配下のディレクトリに対して実行
  3. git -C {} switch $branchName で指定したブランチをチェックアウト(引数がない場合は develop になる)
  4. git -C {} pull --rebasepull --rebase する
プレーンわにプレーンわに

git stash -k / --keep-index

https://git-scm.com/docs/git-stash#Documentation/git-stash.txt--k
現在 index に追加している差分のみ stash することが出来る
save か push(git stash と同等)のみ使える

コミットしたくないけど逃しておきたい変更(一時的に DB の接続先を変えるとか)がある場合に使える
e.g.

  1. .env ファイルを修正して DB の接続先を変更
  2. この修正は今後も時々使ったりする
  3. git add .env で index に追加
  4. git stash save "tmp db connection" -k
  5. 現在の index の状態はそのままに .env の変更が stash に保存される
プレーンわにプレーンわに

全ての Conversation を Resolve するスクリプト

javascript:(function(){document.querySelectorAll('.ajax-pagination-btn').forEach((b)=>{b.click()}); setTimeout(function(){document.querySelectorAll('[data-disable-with="Resolving conversation…"]').forEach((b)=>{b.click()});}, 5000);})();

ブックマークレットとして使える

このスクラップは2023/10/11にクローズされました