⚙️

git のコマンド小技集

2021/12/25に公開

rebase

例)develop ブランチを feature/xxxxxxx ブランチ にリベースする時

# 目的のブランチにチェックアウト
$ git checkout feature/xxxxxxx

# rebase
$ git rebase origin/develop

# コンフリクトしなければここで終了

# コンフリクトしたら以下の手順

##############################################

# コンフリクトの解消

# 修正が完了したら add
$ git add --all

# 再 rebase
$ git rebase --continue

# force push
$ git push --force-with-lease origin HEAD

##############################################

# rebase に前に戻りたい場合
$ git rebase --abort

特定の文字列の入ったソースの修正を探す

$ git log -G"検索ワード"

自動コミットしない cherry-pick

-n をつけると自動コミットしないので、コミットメッセージなどを変えたりするときに便利です。

$ git cherry-pick -n <対象のコミット番号>

リモートの hogehoge ブランチをクローンしながらチェックアウトする

$ git checkout -b hogehoge origin/hogehoge

あとから .gitignore した hogehoge.txt ファイルをリモートリポジトリから削除する

$ git rm --cached hogehoge.txt

ローカルの hogehoge ブランチをリモートの hogehoge ブランチで強制上書きする

$ git fetch origin hogehoge
$ git reset --hard origin/hogehoge

これでも可

$ git checkout hogehoge
$ git reset --hard HEAD

正直これをするぐらいなら、ローカルブランチを削除してもう一度クローンすればいいと思います。 そういう観点ではなく、チェックアウトできなくて困ったときにするコマンドとして使えます。

リモートの hogehoge.txt ファイルを残したままコミット時にローカルの変更を無視する

# 無視するようにする
$ git update-index --skip-worktree hogehoge.txt

# 確認
$ git ls-files -v | grep ^S

# 解除する場合
$ git update-index --no-skip-worktree hogehoge.txt

チーム開発での --skip-worktree での運用は事故が起きやすいので、可能であればこの運用は避けることをお勧めします。

削除したファイルを探す

$ git log --diff-filter=D --summary <削除したファイルがあったパス>

あとから追加された .gitignore の設定を反映させて対象のファイルを削除する

$ git rm --cached `git ls-files --full-name -i --exclude-from=.gitignore`

【参考】
あとからまとめて.gitignoreする方法

develop ブランチにマージされたローカルブランチを削除する(master ブランチ除く)

$ git branch --merged develop | grep -vE '^\*|master$|develop$' | xargs -I % git branch -d %

参考:マージ済みのローカルブランチを全て削除

誤って push した1つのコミットをなかったことにする

# 該当のブランチに移動

# ローカルを元にもどす
$ git reset --hard HEAD^

# 強制上書き
$ git push --force-with-lease origin HEAD

stash をすべて消去する

$ git stash clear

レポジトリを複製する方法

$ cd 複製したいレポジトリのディレクトリ名
$ git worktree add ../複製される新たなディレクトリ名 適当なブランチ名(feature/hogehogeなど)

これをやると .gitignore の設定がうまいことされていれば、旧バージョンのライブラリをインストールしたリポジトリの状態を残しておくことができます。

バージョンを遡って検証するために毎回ライブラリをインストールしなおさないといけない、というときにこのコマンドでレポジトリを複製しておくとめちゃくちゃ便利です。

別ディレクトリを作って git clone すればほぼ同じことが実現できますが、このコマンドで複数すれば stash なども維持することができるので、私はこちらをお勧めします。

参考:git worktreeを使ってみる

空コミットする方法

たとえば git の CI を動かすために空コミットを Push したりするときに使います。

$ git commit --allow-empty -m "kick ci"
GitHubで編集を提案

Discussion