Open16

実際に使っている git のコマンドをまとめる

yuyu

普段は Sourcetree で git を操作しています。
コマンドの勉強のために調べて実際に使ったコマンドはここにメモしていきます。

yuyu

作業前

リモートリポジトリの情報を取り込む

git fetch

リモートリポジトリの修正を取り込む

git pull
yuyu

ブランチ

ローカルのブランチを確認

git branch

リモートブランチを確認

git branch -r

ローカルブランチを削除

git branch -d [ブランチ名]

リモートブランチを削除

git push --delete origin [ブランチ名]

ブランチを作成してチェックアウト

git checkout -b [ブランチ名]
yuyu

作業後の流れ

修正を追加する

git add .

追加する修正を選択しながら追加する

git add -p

前回のコミットとの差分を確認する

git status

差分を確認する

git diff --cached

コミット

git commit -m "コミットメッセージ"

今いるブランチの変更をリモートリポジトリに反映

git push origin HEAD

マージしたいブランチに移動

git checkout [ブランチ名]

ブランチ同士を比較

git diff [ブランチ名] [ブランチ名]

ブランチをマージ

git merge [ブランチ名]
yuyu

ブランチ同士の差分を比較し、ファイル名だけのリストを表示

git diff [ブランチ名] --name-only
yuyu

一時的に特定のファイルの変更追跡を止める

一時的な不具合などで一部の処理を変更したがコミットはしたくないときに便利。
Docker でなぜかうまく動かない処理があったときに一部だけコメントアウトするために使った。
戻し忘れに注意。

git update-index --skip-worktree [ファイルパス]

変更追跡を止めていたファイルの追跡を戻す

git update-index --no-skip-worktree [ファイルパス]

追跡をスキップしていたファイルリストを表示

git ls-files -v . でカレントディレクトリのファイルを列挙する。その際に接頭語に S がついているものがスキップ対象なので、それだけを絞り込んで表示する。
他の接頭語もあるのでドキュメントを参照

git ls-files -v . | grep ^S
yuyu

コミットログの検索

作業者で絞り込み

git log --committer=[ユーザー名]

コミットコメントを検索

git log --grep=[検索文字列]
# or
git log -S "キーワード" --oneline

コミットIDで情報を検索

git show [コミットID]

複数のリポジトリを一気に検索する

ざっくりこんな感じで動きました。

#!/bin/bash

logs_file="log.txt" # 結果の書き出し先ファイル
files="./work/*"    # 検索したいリポジトリが入っているディレクトリ
grep_text="バグ"     # 検索したい文字

for filepath in $files; do
  cd $filepath
  result=$(git log --oneline --decorate --graph --branches --tags --remotes --all --grep=$grep_text)
  if [ -n "$result" ]; then
    echo "${filepath} \n ${result} \n\n" >> $logs_file
  fi
done
yuyu

コンフリクトが起きたときの対応

Sourcetreeではぽちぽちやっているだけだったので改めて

メッセージはこんな感じ

CONFLICT (content): Merge conflict in [ファイル名]
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトを解消する

エディターとかを使ってコンフリクトは解消させる.
VSCodeとかでいつもやってる

修正を追加してコミット

ここもいつもと変わらず.
コミットメッセージはいつも自動生成のやつでやっちゃってたけど書き直して書いちゃった方が良さそう

git add .
git commit -m 'コンフリクトを解消'

これだけ。簡単

コンフリクトが多すぎて解決しきれない時は

ブランチの状態が古い可能性があるので、一旦中止して状態を最新にしたりして試してみると良い
以下のコマンドでマージを中止できる

git merge --abort
yuyu

一時的に変更を待避したいとき

スタッシュに変更を待避

git stash -u

メッセージと共にスタッシュに変更を待避

git stash save "メッセージ"

スタッシュのリストを表示

git stash list

↓こんな感じのが出る

stash@{0}: WIP on ブランチ名: 0cb8c8f Merge branch 'ブランチ名' into ブランチ名
stash@{1}: WIP on ブランチ名: 0cb8c8f Merge branch 'ブランチ名' into ブランチ名

スタッシュを反映

git stash apply stash@{0}

スタッシュを削除

git stash drop stash@{0}

スタッシュを反映しつつ削除

git stash pop stash@{0}
yuyu

よく使うコマンドのエイリアス

zshのohmyzshでgitのプラグインがあるのでそのエイリアスのメモ

情報を更新

git fetchのエイリアス

gf

ブランチをpull

git pullのエイリアス

ggl

ブランチを切る

git checkout -bのエイリアス

gcb [ブランチ名]

修正を追加

git add .のエイリアス

ga .

ファイルの差分ステータス確認

git status -sb のエイリアス( -sb は表示をコンパクトにしてブランチ名を表示する )

gsb

差分を確認

git diff --cached のエイリアス

gdca

メッセージ付きでコミット

git commit -mのエイリアス

gcmsg "メッセージ"

修正をプッシュ

git push origin HEADのエイリアス

ggp

ブランチを移動

git checkoutのエイリアス

gco [ブランチ名]

ブランチの差分を確認

git diffのエイリアス

gd [ブランチ名] [ブランチ名]

ブランチをマージ

git mergeのエイリアス

gm [ブランチ名]

ブランチの削除

git branch -dのエイリアス

gbd [ブランチ名]

ステージングに追加した修正を取り消す

git reset のエイリアス

grh
grhh # git reset --head

削除されたリモートブランチをローカルに反映

git fetch --all --prune のエイリアス

gfa
yuyu

削除されたリモートブンランチの状況をローカルに反映

削除自体は GitHub とかからでもOK

git fetch --prune
yuyu

ブランチの変更を戻す

変更があったファイルを今のブランチの状態に戻す

git checkout .

これだけだと新規ファイルが消えないので以下のコマンドで消す

git clean -df 

↓ もしかして ohmyzsh のプラグインで読み込んでいるエイリアスのこれが使える?(手付かずの状態に戻せるっぽい?)

gpristine # git reset --hard && git clean -dffx
yuyu

マージを取り消す

プッシュする前ならこれでOK

git reset --hard <コミット番号>
yuyu

ログを見やすくする

gl で動くように .zshrc に以下を書く

alias gl="git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"