Git CLI Tips
- ブランチを作成する
$ git branch -a // ブランチの一覧を見る
$ git checkout master // ブランチを作る元のブランチに切り替える
$ git checkout -b 作成するブランチ名
- 変更したファイルの一覧を確認
$ git status
直前のコミットからの変更があったファイルが表示されます
- modified:修正したファイル
- deleted:削除したファイル
- Untracked files:新規作成したファイル
- 変更したファイルのソースコードを確認
$ git diff
$ git diff --name-only // ファイル名のみの差分を表示する
- ステージングエリアにファイルを追加
$ git add [ファイル名]
- 変更内容をコミット
$ git commit . // 変更内容を全てコミット
$ git commit -a -m "任意のコメント"
# -a→直前のコミットを変更する最も便利な方法。全く新しいコミットを作成する代わりに、ステージングされた変更を前のコミットと組み合わせることができます。
# -m→コミットメッセージを追記
- リモートブランチにPUSH
$ git push origin [ブランチ名]
- プルリクの作成
$ gh pr create // 対話形式で行う
プルリクに関して
8. マージ
$ gh pr merge // 対話形式で行う
- プル
$ git pull origin master // フォルトブランチの変更内容を取り込む
参考
rebase
# developをプルリク先のブランチとする
$ git branch
develop
* feature/test
# developブランチの最新コミットをローカルに取得
$ git fetch
# feature/test作成時の分岐点をdevelopに移動(再定義)
$ git rebase develop
# origin/feature/testブランチに反映
$ git push -f origin feature/test
rebase時のコンフリクト対処
コンフリクトを解消した後、以下のコマンドを入力
# 変更内容をインデックスに
$ git add .
$ git rebase --continue
問題なければ、コミットメッセージの確認をvim上で行い、完了となります。
pull request用に過去のcommitを1つにまとめる
前提としてローカル上の作業とコミットが完了しています。
# 作業ブランチを元にプルリク用のブランチを作成・移動
$ git checkout -b feature/test
# プルリクのマージ先の最新コミットをローカルに取得
$ git fetch
# 作業ブランチのfork元からの差分を1 commitにまとめる
$ git rebase -i origin/develop
以下のような表示が画面に出る。
pick cce19c9 通信用のクラスの実装とテストの追加
pick 70b3379 メソッド名のタイポ修正
# Rebase cce19c9..aebf22c onto b8e5722
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# まとめたいコミットの左側にpick(何もしないという意味)
pick cce19c9 通信用のクラスの実装とテストの追加
# 省略したいコミットの左側にsquashを入力
squash 70b3379 メソッド名のタイポ修正
そうすると、コミットが1つにまとめられる。
編集が終わったら、:wqで保存して次へ進む。
以下のような画面になるので、commitメッセージを編集する画面になる。
# #はコメントアウト
# This is a combination of 2 commits.
# The first commit's message is:
通信用のクラスの実装とテストの追加
# This is the 2nd commit message:
メソッド名のタイポ修正
# Please enter the commit message for your changes. Lines starting
通信用のクラスの実装とテストの追加
# Please enter the commit message for your changes. Lines starting
編集終わったら、ノーマルモードに戻し(escを押下)、
:wqで保存してvim終了。
developブランチへのプルリクエストをブラウザ上で作成し、完了!
# 作業ブランチのリモートにpush
$ git push origin feature/test
参考:
git addの取り消し
$ git reset
rebaseの取り消し
CONFLICT 発生時など
$ git rebase --abort
gitのローカルのブランチ名を変更したい
$ git branch -m <古いブランチ名> <新しいブランチ名>
今開いているブランチをリネームする場合は以下
$ git branch -m <新しいブランチ名>
※古いブランチ名でPRを作成している場合、新しいプランチ名でpushすると新しいPRが作成されます
作業を退避する
現在の変更作業を退避するには以下のコマンドを使います。
$ git stash save
退避した作業一覧を確認する
$ git stash list
退避した作業を戻す
$ git stash apply
$ git stash pop
applyは退避一覧から該当の作業を削除しません。
popは戻した作業が退避一覧から削除される。
空コミットを行う
$ git commit --allow-empty -m "空コミット"
diff(ファイル名のみ)
$ git diff 比較ブランチ名 --name-only
コンフリクト解消
# マージ先のブランチに切り替える
$ git checkout develop
# マージ先のブランチを最新化する
$ git pull origin develop
# マージ元のブランチに切り替える
$ git checkout fix_conflict
# マージ元のブランチにマージ先のブランチをマージする
$ git merge develop
# コンフリクトが発生しているファイルのみ修正する(commit, push含む)
# コンフリクトが発生していないファイルは取り込まない
pushしたコミットを取り消す
- git logやgit reflogで戻したいコミット履歴を確認
# コミットの履歴を参照
$ git log
# レポジトリ内で行われた全てのコマンドの履歴を参照
$ git reflog
- 戻したいコミットに戻す
# (最新の履歴を「0」として)3番目の履歴に「HEADの位置・インデックス・ワーキングツリー」全てを戻す
$ git reset --hard HEAD@{3}
# 前のコミットに「HEADの位置」のみを戻す
$ git reset --soft HEAD^
- remoteにpush
# -f (–force)は強制的にpushする
$ git push origin -f hogehoge
コミットせずに変更を退避する
変更の退避
$ git stash
ワーキングとステージングにある作業を退避することができます。
退避した作業一覧を確認する
$ git stash list
退避した作業を戻す
$ git stash apply stash@{0}
stash@{0} の作業をもとに戻します。
退避した作業を消す
$ git stash drop stash@{0}
git fetch
取り込みを限定する
リモートリポジトリにあるブランチの最新状態を、それを追跡しているローカルのブランチに反映させます。
# $ git fetch <リモート名> <リモートブランチ名>
$ git fetch origin develop
git pull
フェッチとマージの組み合わせです。
リモートのブランチを、それを追跡しているローカルのブランチにフェッチし、さらにそのリモート追跡ブランチをカレントブランチにマージします。
# developブランチをチェックアウト
$ git checkout develop
# リモートのdevelopブランチをプルする
$ git pull origin develop
リモートブランチにチェックアウト
$ git fetch origin <ブランチ名>
$ git checkout <ブランチ名>
過去のバージョンを再現する
- 利用可能な履歴の中から、再現したいバージョンのコミットハッシュを取得する
$ git log
- コミットハッシュを利用して、再現したいバージョンをチェックアウトする
$ git checkout <commit-hash>
お掃除系コマンド
リポジトリの最適化
リポジトリ内の不要なオブジェクトを削除し、リポジトリのパフォーマンスを最適化します。
gc
とはガーベージコレクション(動的に確保したメモリ領域)を指します。
$ git gc
ローズオブジェクトの削除
到達不能なオブジェクト(ローズオブジェクト)を削除します。これにより、不要なオブジェクトがリポジトリ内に残らず、ディスク使用量を削減できます。
$ git prune
リポジトリのメンテナンスやクリーンアップに関する情報を確認するには以下のコマンドです。
$ git help gc
GitHubのWebでコンフリクトを直す方法
git reset --hard でコミット前のローカルファイルを削除してしまった
本来の正しいgit操作
- 現在の変更作業を退避
$ git stash save
- 戻したいコミットに戻す
$ git reset --hard {対象のコミット}
解決法
- Gitのオブジェクトデータベースをスキャンし、--lost-foundオプションで未参照のオブジェクトを回収する
$ git fsck --lost-found
- 対象のコミットされなかったidを見る
$ git show {id}
- 探している対象のものであれば新しいブランチにコミットとして反映する
$ git checkout -b recovery-branch <commit-hash>
git commit時のチェック処理を無効化
$ git commit --no-verify
ログの確認
- コミット履歴の閲覧
$ git log --graph // アスキーグラフで表示
$ git log -p -2 // 直近の2エントリのみ表示
- コミットの変更内容確認
$ git show <commit id>
参考記事
git diff
- 異なるブランチの異なるファイルを比較する
$ git diff br1:foo/bar.txt br2:hoge/fuga.txt