⚙️
git のコマンド小技集
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 の CI を動かすために空コミットを Push したりするときに使います。
$ git commit --allow-empty -m "kick ci"
Discussion