Gitコマンドについてまとめ(備忘録)


はじめに

いままでSourceTreeに頼ってgitコマンドについて
おろそかになっていたので自分のためにもまとめます。コマンドを通して、Gitの仕組みも改めて冷静に見ていきたい。
備忘録シリーズその4?(数えてない)

そもそもGitとは?な場合↓が個人的に一番わかりやすいと思います。
サルでもわかるGit入門https://backlog.com/ja/git-tutorial/intro/01/

複数人で同じファイルの差分を共有・管理するための仕組みのことですね。

いきなりですが、下記に良く使う(はず)のコマンドをまとめていきます。

確認用コマンド

①全体の変更を確認する

$ git status

変更点の現在の状態を見る。addしたファイル、commitしたファイル、conflictしたファイルなどが確認できる。

②特定のディレクトリ・ファイルの変更を確認する

$ git status [ディレクトリパス or ファイルパス]

ディレクトリを指定すると、その箇所の変更点のみ確認できる。
指定しないと全管理対象の変更点が確認できる。

○変更の履歴を見る

$ git log [オプション]

作業ブランチの履歴を見ることができる。

オプション 説明
--oneline ハッシュ値+commitメッセージの1行目を見ることができる
--graph ブランチの分岐を確認できる。(GitLabのNetworkのようなものでツリーを把握する際に良い)
-p コミットの変更点を見ることができる
-p[ファイルパス] そのファイルの変更点を見ることができる
--author=[ユーザー名] 指定したユーザーのcommitメッセージを見ることができる
--grep [検索文字列] 検索文字列に合致するコミットのみ表示できる
--name-only 変更したファイル名のみ表示(-pと併用した場合、こちらが優先)

○トピックブランチに対する変更内容を見る

master ブランチに対して、トピックブランチに関してどのようなcommitがあったかを確認する

git log master..[トピックブランチ名]

○変更点をadd(追加)する

$ git add [ファイルパス]

設定方法 説明
-u [削除済ファイルのパス] ファイルの削除履歴をaddする
インデックスにファイルを登録する。ディレクトリ指定可能。

○変更点をcommit(確定)する

$ git commit [オプション]
オプション 説明
-m "commitメッセージ" 1行のコミットメッセージを付けてcommitができる
--allow-empty 空commitの作成(-mと併用できる)

○変更点をpush(通知)する

$ git push origin [ローカルブランチ名]:[リモートブランチ名]

○差分を抽出する

$ git diff [オプション] ([設定値])
設定方法 説明
オプションなし 全体の差分を抽出する
--name-only 差分があるファイル名のみ抽出する
[ディレクトリパス] 特定のディレクトリの差分を抽出する
[ファイルパス] 特定のファイルの差分を抽出する
[old_commit][new_commit] commit同士の差分を抽出する

○修正者を確認する

git blame [ファイル名]

○指定したcommitの変更点を見る

$ git show [commitのハッシュ値]

○変更点を一旦退避させる

作業している最中に別ブランチをMergeするなどの操作が必要なときに使います。

$ git stash [オプション] ([設定値])

本来はgit stash saveだが、saveは省略できる。

設定方法 説明
save "コメント" コメント付きで一旦退避できる
list 現在退避させている変更点の一覧を表示
pop 退避させた変更点を再度適用する
clear 退避させている変更点を全て削除する
drop 1つずつ削除。何も指定しなければ最新のもの、dropの後に引数を指定すれば特定のものを削除可能)

ブランチ操作編

○ブランチの作成・削除

$ git branch [オプション] [ブランチ名1] ([設定値])
設定方法 説明
プションなし 新規ブランチの作成
-d [ブランチ名1] ブランチの削除
-D [ブランチ名1] ブランチの強制削除
-m [ブランチ名1][ブランチ名2] ブランチ名1からブランチ名2へ名前を変更
-l [ブランチ名1][commitのハッシュ値] 特定commitでブランチを切る
-vv 全ブランチのHEADを確認する

○作業ブランチの変更(チェックアウト)

$ git checkout[オプション] [ブランチ名]   
オプション 説明
-b 指定したブランチ名でブランチを作成し、チェックアウトする

○[cf]ブランチを切るとどうなるか

特定のワークツリーからブランチを切ると、新しいブランチのHEADは切ったワークツリーのHEADと同じ状態になる。

branchA:HEAD 1
branchB:HEAD 2
branchC:HEAD 3
branchAで新しくブランチを切ったとき
branchA:HEAD 1
branchB:HEAD 2
branchC:HEAD 3
branchD:HEAD 1

#履歴操作編

間違った操作をしてしまったり、変更を取り消す必要がある際などに良く使うコマンド。

○「HEAD^」についてHEAD^はワークツリーの最初のcommit。

「^」を増やすと次のcommitになる。以降、「HEAD^」と記載した箇所は「^」を増やせば次のcommitを指定できる。

○addを取り消す

$ git reset HEAD [ファイル名]

○commitを取り消す

$ git reset [オプション] HEAD^
オプション 説明
--soft commitのみ取り消し、ファイルの変更は残す
--hard commitもファイルの変更も全て取り消す

○commitメッセージを修正する

直前のcommitメッセージを直す場合は下記のようになる。

$ git commit --amend

直前でない場合、git rebase -i を参考のこと。

○commitを打ち消す

あるcommitを打ち消す。commit履歴は残したままその変更をなかったことにできる。

$ git revert [commitCのhash値]

commitメッセージはRevert [指定したcommitのcommitメッセージ]になる。

○commitした中の1ファイルだけ取り消す

複数ファイルでcommitしたが、1ファイルだけ戻したいときに使う。

$ git checkout [commitのハッシュ値] ファイルパス

○pushしたcommitを取り消す

$ git push -f origin HEAD^:[ブランチ名]

○commitを別ブランチのHEADに移動する

commitを移動先ブランチへ移動し、下記コマンドを使う。conflictしやすいので注意する。

○git rebase -i でcommitメッセージの修正やcommitの統合を行う

$ git rebase -i [ハッシュ値 or HEAD^]

①commitメッセージの修正
変更したいcommitメッセージの左横にあるコマンドを「reword」にして保存
新しいcommitメッセージを書いて保存
②commitをまとめる
まとめたいcommitメッセージの左横にあるコマンドを「squash」にして保存
pick [ハッシュ値] commitA
squash [ハッシュ値] commitB

○git reflogを使って過去の履歴に戻る

$ git reflog

上記コマンドを打つと、下記のようなログが出る。

[ハッシュ値] HEAD@{0}: 処理: 処理の詳細
[ハッシュ値] HEAD@{1}: 処理: 処理の詳細
[ハッシュ値] HEAD@{2}: 処理: 処理の詳細


git reset --hard を使用し、HEADの位置をずらす。

git reset --hard HEAD@{X}
ちなみに ブランチに関わらずHEADが指定したものになるっぽいので注意。

#Git設定編

○リポジトリの作成をする

①Gitリポジトリをカレントディレクトリに作成する
$ git init
②Gitリポジトリを特定のディレクトリに作成する
$ git init [ディレクトリパス]
③ベアリポジトリ 2 を作成する
$ git init --bare [ディレクトリパス]

○ユーザー情報を設定する

$ git config --global user.name "あなたの名前"
$ git config --global user.email "あなたのメールアドレス"
最低限上記の内容は設定しないとエラーになる。
他にも下記のようなものがある。

○Gitの出力をカラーリングする

$ git config --global color.ui auto

○Gitのエイリアスを設定する

$ git config --global alias.co checkout

○日本語のファイル名を表示できるようにする

$ git config --local core.quotepath false

○エディタをvimにする

git config --global core.editor 'vim -c "set fenc=utf-8"'

○Gitの設定を確認する

$ git config --global --list

※--globalを設定していない場合は--globalは不要です。

○gitの設定ファイルについて

グローバルは~/.gitconfig 、リポジトリ毎は.git/configに保存されている。
コマンドを打つと保存される。

【便利な設定】git logを見やすくする
参考サイト
https://blog.toshimaru.net/git-log-graph/

○ブランチの設定をする

.git/configを設定する。
これにより、originを省略することも可能。

【設定コマンド】push/pull時の origin master を省略する
下記コマンドを打つと.git/configに設定が追記される。
設定後はgit pull git pushでOKとなる。

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

よく使う設定はconfigに書いて常に有効にしておくと良さそう。

○リモートリポジトリの参照を確認

$ git remote -v

設定されている全てのリモートリポジトリが確認できる。

○リモートリポジトリの参照を追加

$ git remote add [任意の名前] [Gitリポジトリ]

○リモートリポジトリの参照を削除

$ git remote rm [任意の名前]

○.gitignore

Gitの管理外ファイルを設定する。
リポジトリ下に配置。

Git対象ファイル操作編

○Git管理対象ファイルのファイル名を変更

git mv [変更前ファイル名] [変更後ファイル名]
新規ファイルではなく、変更ファイルとして扱われる。

リポジトリ取得編

○リポジトリをcloneする

git clone [リポジトリのURL] ([cloneしたいディレクトリ名])

ディレクトリ指定でcloneすることも可能。

rebaseとmerge編

○rebase

git rebase [取り込みたいブランチ名]

AブランチにBブランチを取り込みたい場合はAブランチに移動してから。

git checkout A
git rebase B

rebaseの特徴
履歴を付け替える。
rebaseすると取り込み側のcommitIDが変わるのでリモートにpushする側のブランチではrebaseしない方がよい。

○merge

git merge [取り込みたいブランチ名]

AブランチにBブランチを取り込みたい場合はAブランチに移動してから。

git checkout A
git merge B

mergeの特徴
履歴を合流させる
commitIDはそのまま

Fast-Forword:MergeCommitを作らない(履歴が分岐していない)
Non Fast-Forword:MergeCommitを作る(履歴が分岐している)

merge or rebaseを間違った直後に取り消したいとき

git reset --hard ORIG_HEAD

[cf] pull
pull = fetch + merge
pull --rebase = fetch + rebase

参考:
サルでもわかるGit入門
gitコマンドを体系的に覚えよう
gitコマンドの基本的な使い方
美しき git log --graph のエイリアス
pimping out git log