Open20

Git CLI Tips

iamtillmansiamtillmans
  1. ブランチを作成する
$ git branch -a    // ブランチの一覧を見る
$ git checkout master    // ブランチを作る元のブランチに切り替える
$ git checkout -b 作成するブランチ名 
  1. 変更したファイルの一覧を確認
$ git status

直前のコミットからの変更があったファイルが表示されます

  • modified:修正したファイル
  • deleted:削除したファイル
  • Untracked files:新規作成したファイル
  1. 変更したファイルのソースコードを確認
$ git diff
$ git diff --name-only    // ファイル名のみの差分を表示する
  1. ステージングエリアにファイルを追加
$ git add [ファイル名]
  1. 変更内容をコミット
$ git commit .    // 変更内容を全てコミット
$ git commit -a -m "任意のコメント"   
#  -a→直前のコミットを変更する最も便利な方法。全く新しいコミットを作成する代わりに、ステージングされた変更を前のコミットと組み合わせることができます。
#  -m→コミットメッセージを追記

オプションの参考

  1. リモートブランチにPUSH
$ git push origin [ブランチ名]
  1. プルリクの作成
$ gh pr create     //  対話形式で行う

プルリクに関して
8. マージ

$ gh pr merge    //  対話形式で行う
  1. プル
$ git pull origin master    //  フォルトブランチの変更内容を取り込む

参考
https://qiita.com/satof7211/items/8566d0263fe17a8f8203

iamtillmansiamtillmans

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

参考:
https://zenn.dev/ryouhei_furugen/scraps/54abb9ef52533f

iamtillmansiamtillmans

gitのローカルのブランチ名を変更したい

$ git branch -m <古いブランチ名> <新しいブランチ名>

今開いているブランチをリネームする場合は以下

$ git branch -m <新しいブランチ名>

※古いブランチ名でPRを作成している場合、新しいプランチ名でpushすると新しいPRが作成されます

iamtillmansiamtillmans

作業を退避する

現在の変更作業を退避するには以下のコマンドを使います。

$ git stash save

退避した作業一覧を確認する

$ git stash list

退避した作業を戻す

$ git stash apply
$ git stash pop

applyは退避一覧から該当の作業を削除しません。
popは戻した作業が退避一覧から削除される。

iamtillmansiamtillmans

コンフリクト解消

# マージ先のブランチに切り替える
$ git checkout develop
 
# マージ先のブランチを最新化する
$ git pull origin develop
 
# マージ元のブランチに切り替える
$ git checkout fix_conflict
 
# マージ元のブランチにマージ先のブランチをマージする
$ git merge develop
 
# コンフリクトが発生しているファイルのみ修正する(commit, push含む)
# コンフリクトが発生していないファイルは取り込まない
iamtillmansiamtillmans

pushしたコミットを取り消す

  1. git logやgit reflogで戻したいコミット履歴を確認
# コミットの履歴を参照
$ git log
# レポジトリ内で行われた全てのコマンドの履歴を参照
$ git reflog
  1. 戻したいコミットに戻す
# (最新の履歴を「0」として)3番目の履歴に「HEADの位置・インデックス・ワーキングツリー」全てを戻す
$ git reset --hard HEAD@{3}

# 前のコミットに「HEADの位置」のみを戻す
$ git reset --soft HEAD^
  1. remoteにpush
# -f (–force)は強制的にpushする
$ git push origin -f hogehoge
iamtillmansiamtillmans

コミットせずに変更を退避する

変更の退避

$ git stash

ワーキングとステージングにある作業を退避することができます。

退避した作業一覧を確認する

$ git stash list

退避した作業を戻す

$ git stash apply stash@{0}

stash@{0} の作業をもとに戻します。

退避した作業を消す

$ git stash drop stash@{0}
iamtillmansiamtillmans

git fetch

取り込みを限定する

リモートリポジトリにあるブランチの最新状態を、それを追跡しているローカルのブランチに反映させます。

# $ git fetch <リモート名> <リモートブランチ名>
$ git fetch origin develop
iamtillmansiamtillmans

git pull

フェッチとマージの組み合わせです。
リモートのブランチを、それを追跡しているローカルのブランチにフェッチし、さらにそのリモート追跡ブランチをカレントブランチにマージします。

# developブランチをチェックアウト
$ git checkout develop

# リモートのdevelopブランチをプルする
$ git pull origin develop
iamtillmansiamtillmans

リモートブランチにチェックアウト

$ git fetch origin <ブランチ名>
$ git checkout <ブランチ名>
iamtillmansiamtillmans

過去のバージョンを再現する

  1. 利用可能な履歴の中から、再現したいバージョンのコミットハッシュを取得する
$ git log 
  1. コミットハッシュを利用して、再現したいバージョンをチェックアウトする
$ git checkout <commit-hash>
iamtillmansiamtillmans

お掃除系コマンド

リポジトリの最適化

リポジトリ内の不要なオブジェクトを削除し、リポジトリのパフォーマンスを最適化します。
gcとはガーベージコレクション(動的に確保したメモリ領域)を指します。

$ git gc

ローズオブジェクトの削除

到達不能なオブジェクト(ローズオブジェクト)を削除します。これにより、不要なオブジェクトがリポジトリ内に残らず、ディスク使用量を削減できます。

$ git prune

リポジトリのメンテナンスやクリーンアップに関する情報を確認するには以下のコマンドです。

$ git help gc
iamtillmansiamtillmans

git reset --hard でコミット前のローカルファイルを削除してしまった

本来の正しいgit操作

  1. 現在の変更作業を退避
$ git stash save
  1. 戻したいコミットに戻す
    $ git reset --hard {対象のコミット}

解決法

  1. Gitのオブジェクトデータベースをスキャンし、--lost-foundオプションで未参照のオブジェクトを回収する
$ git fsck --lost-found
  1. 対象のコミットされなかったidを見る
$ git show {id}
  1. 探している対象のものであれば新しいブランチにコミットとして反映する
$ git checkout -b recovery-branch <commit-hash>
iamtillmansiamtillmans

git diff

  1. 異なるブランチの異なるファイルを比較する
$ git diff br1:foo/bar.txt br2:hoge/fuga.txt