はじめに
Gitコマンドを中心とした自分用コマンドリファレンスです。
ご参考までに。
基礎知識
エリア
作業エリア(いわゆるローカル作業中のもの)
↓
ステージングエリア(コミット待ちのエリア、作業エリアで完了したものを一度あげる場所)
↓
コミット履歴(コミット済みのもの)
HEAD
現在、自分が参照しているブランチ/コミットのポインタ。
常に最新のコミットを参照しているわけではなく、任意の履歴を参照することもできる。
この状態は頭を切り離した状態(HEAD detached)となる。
SHA1 ID
コミットごとに付与される一意のID。
このIDを指定することで、各種操作が可能となる。
ブランチ名やタグ名、"HEAD"などの指定で置き換えることもできる。
クリーンマージ
ブランチをマージする際に、競合がなく自動的にマージできるもの。
ファストフォワード(fast-forward)として扱われる。
Windows Git GUI セットアップ
Gitコマンド
導入操作編
# 使い方の確認
git # ヘルプを表示
git help # ヘルプを表示
git help -a #全コマンドリスト
git help [コマンド名] #指定コマンド名の使い方
git [コマンド名] --help #指定コマンド名の使い方
# Gitのバージョン確認
git --version
# ファイルリストの表示
git ls-files
# ファイルの詳細確認 [Q]で中止
git blame [ファイル名]
git blame README.md #例
git blame [ブランチ名] [ファイル名]
git blame master README.md #例
# コミット履歴 [Q]で中止
git log --oneline #履歴を1行ずつ表示
git log --shortstat --oneline #上記に加え、短いステータスを表示
設定編
# ユーザー情報設定
git config --global user.name "Your Name"
git config --global user.email "hoge@hoge"
# ユーザー情報確認
git config --global user.name
git config --global user.email
git config --list # 全設定を表示
# 設定の削除方法
git config --global --unset [Key名]
共通操作編(Gitに限らず)
# CurrentDirectoryの確認
pwd
# ファイルリスト表示
ls
# ディレクトリ作成
mkdir [ディレクトリ名]
# ディレクトリ移動
cd [ディレクトリ名]
# ファイル/ディレクトリ削除
rm -r [ディレクトリ名]
# 履歴の表示
history
リポジトリ作成、登録
# リポジトリ作成
git init
# ステータス確認、リポジトリの状態を見る
git status
# ファイルをリポジトリに追加
git add [ファイル名]
# コミットする
git commit -m "メッセージ"
# コミット情報を確認する
git log
git log --stat #コミットを構成しているファイルを見る
# ファイル追加とコミットを同時に行う
# 対象となるのは、既にGitが認識済み(add済み)のファイルに限られる
git commit -a -m "メッセージ"
# ディレクトリ単位でadd(作業エリア→ステージングエリア)する
git add --dry-run . # 実行時のシミュレーション
git add .
# ファイルを確認する
git ls-tree HEAD
Git GUI 関連
# git GUI 起動
git gui
git citool
# git log viewer 起動
gitk
リポジトリ比較
# 作業エリアとステージングエリアの差分比較
git diff
# ステージングエリアとコミット履歴の差分比較
git diff --staged
ファイルの削除
# 作業エリアで削除したファイルを、ステージングエリアから削除する
# 作業エリアにファイルが残っていたとしても、以下のコマンド実行により作業エリアからも削除される
git rm [ファイル名]
ファイル名の変更
エクスプローラでファイル名を直接変更すると、以下の2つの操作として扱われる。
- 旧ファイル名のファイル削除
- 新ファイル名のファイル追加
# Gitにファイル名変更として認識させる、
# 合わせて作業エリアのファイル名も変更される
git mv [old_file_name] [new_file_name]
ファイル内の一部のみリポジトリに反映したい場合
- Git GUI の Unstaged Changes でファイル選択
- 差分表示の反映したい行で右クリック
- Stage Line For Commit を選択
- Staged Changes に選択した選択した部分だけ反映される
※git add -p の後 e を選択することで、viエディタによるマニュアル操作も可能だが、難しいので割愛。
ファイルを元に戻す
# ステージングエリアの変更を削除(unstagedにする)
git reset [file_name]
# コミット履歴のファイルを作業エリアに反映する
# コミット済みファイルで作業エリアのファイルを上書きする
git checkout -- [file_name]
履歴を確認する
# 親子関係を確認する
git log --parents
# 親子関係を確認する(短縮表示)
git log --parents --abbrev-commit
# 直近のログ1件だけを表示する
git log -1
# GUIで確認する
gitk
# その他のコマンド
git log --oneline # 簡略表示
git log --patch # パッチビュー
git log --stat # コミットファイルの変化
git log --patch-with-stat # 上記2つを結合したもの
git log --oneline [file_name] # ファイル指定
コミット時のコメントを変更する
# 直近のコミットのコメントを修正する
git commit --amend
ブランチ関連
# SHA1 ID 参照
git rev-parse HEAD
git rev-parse master
git log --oneline
# ブランチの先端のSHA1参照
git branch -v
# チェックアウト(ファイル取得、HEAD切り替え)
git checkout [SHA1_ID]
git checkout [tag_name]
# HEADをmasterに戻す
git checkout master
# 変更を破棄してmasterに戻す
git checkout -f master
# ブランチを確認する
git branch
# 全ブランチを確認する
git branch --all
# ブランチを確認する(ツリー表示あり)
git log --graph --decorate --pretty=oneline --all --abbrev-commit
# ブランチを作る
git branch [new_branch_name]
# ブランチの途中(SHA1_ID指定)から新たなブランチを作る
git branch [new_branch_name] [SHA1_ID]
# ブランチを作って即座にチェックアウトする
git checkout -b [new_branch_name] [start_branch_name]
# ブランチを削除する
git branch -d [branch_name] #削除時のSHA1_IDが表示される
# 削除したブランチを復旧させる
git checkout -b [new_branch_name] [SHA1_ID of deleted branch]
# ブランチを切り替えた記録を参照する
git reflog
ブランチ切り替え時に作業エリアを退避させる
# 作業エリアの作業中ファイルをスタッシュに退避(コミット)させる
# WIP : Work In Progress
git stash
# スタッシュのリストを見る
git stash list
# スタッシュを作業エリアに戻す(ポップする)
git stash pop
スタッシュのポップを異なるブランチでポップするとどうなる?
マージされてしまうので、操作は注意が必要。
gitkでブランチ参照
View > New view > All(local)branches ...check
ブランチをマージする
# ブランチ間の差分を確認する
git diff [base_branch_name]...[branch_name]
# ステータスと名前の差分だけを表示する
# ステータス A:added, C:copied, D:deleted, M:modified, R:renamed
git diff --name-status [base_branch_name]...[branch_name]
# マージする
# マージ後に残したいブランチ(親ブランチ)をチェックアウトしてから実行
git merge [merged_branch_name]
# マージを中止する(もとに戻す)
git merge --abort
タグ関連
# タグをつける
git tag [tag_name] -m "comment" [SHA1_ID]
# タグの内容を表示する
git show [tag_name]
# タグを削除する
git tag -d [tag_name]
クローン
# リポジトリを複製(クローン)する
git clone [original_branch] [cloned_branch]
# クローンしていない他のブランチを取得する
git checkout [original_branch2]
git checkout -b [original_branch2]remotes/origin/[original_branch2] #こちらと同義
ベアリポジトリ
- 作業エリアを持たないリポジトリ。
- clone, push, pull が基本操作となる。
# ベアリポジトリの作成
git clone --bare [original_repository] [cloned_bare_repository]
リモート関連
# リモートリポジトリの確認
git remote #リモートの名前だけの確認
git remote -v show #リモートの確認
git remote -v show [remote_name] #対象リモートの詳細確認
# リモートの名前変更(origin -> new_name)
git remote rename origin [new_name]
# 追跡リポジトリの追加
git remote add [new_remote_name] [repository_path]
# リモートリポジトリの調査
git ls-remote
git ls-remote [remote_name]
# リモートの追跡先(参照先)にプッシュする
git push [remote_name] [pushed_branch_name]
####
#### ブランチ操作
####
# 作業エリアで作った新しいブランチをプッシュする
git push --set-upstream [remote_name] [new_branche_name]
# ブランチを削除し、リモートに反映する
git branch -d [branch_name]
git push [remote_name] :[branche_name]
####
#### タグ操作
####
# タグをプッシュする
git push [remote_name] [tag_name]
# タグを削除する
git push [remote_name] :[tag_name]
【ユースケース】コミット履歴(リモートリポジトリ)との差分比較
# 作業エリアの最新(HEAD)とリモートリポジトリを比較する
git diff HEAD..orgin/master
diffについてはこちらを見たほうが早い。
■忘れやすい人のための git diff チートシート
https://qiita.com/shibukk/items/8c9362a5bd399b9c56be
リモートからのマージ
# プルする:フェッチとマージが実行される
git pull
# プルする:fast-forwardに限定する(競合がある場合にオートマージしない)
git pull --ff-only
# これをデフォルト設定にしたい場合
git config pull.ff only
# フェッチする
git fetch
# FETCH_HEADを確認する
# fetch結果(FETCH_HAED)とローカル作業エリア(HEAD)に差分がある場合、異なるSHA1_IDが表示される
git rev-parse FETCH_HEAD
git rev-parse origin/master
git diff HEAD..FETCH_HEAD
# マージする
git merge FETCH_HEAD
git pull の危険性
pullはfetchとmergeを同時に行うため、初心者は混乱しやすい。
何が変更されているかを確認しながら進めるには、fetchとmergeを利用した方がよい。
# まずはリモートの変更を取り込む(フェッチする)
git fetch
# ローカル作業エリア(HEAD)とフェッチ結果(FETCH_HEAD)の差分を確認する
git diff HEAD FETCH_HEAD
# マージを行う
git merge FETCH_HEAD
【ユースケース】git pullでコンフリクトが発生した場合
# 以下のメッセージが出たら
error: Your local changes to the following files would be overwritten by merge:
[directory/file]
Please, commit your changes or stash them before you can merge.
## スタッシュ(変更分を退避)してからプルして、スタッシュをポップ(元に戻す)する##
# スタッシュ
git stash
# スタッシュのリストを確認
git stash list
# プルする
git pull
# スタッシュを作業エリアに戻す(ポップする)
git stash pop
# スタッシュリストがなくなっていることを確認
git stash list
log関連
rebase
# rebaseしたいブランチ上で以下のコマンド
git rebase [target_branch_name]
git rebase master
rebase後に元の状態に戻す
# HEADの履歴を追う
git reflog
# もとの状態に戻す
# HEAD@{4}に戻したい場合
git reset --hard HEAD@{4}
rebaseにより履歴をマージする
guiでは面倒なのでSourceTreeなどを使った方がよよさそう。
https://qiita.com/ryounagaoka/items/7c129e98a7f81c507a61
config関連
# helpを見る
git config --help
構成の優先順位
- local < global < system
- localはリポジトリ固有の構成。
- globalはユーザー設定と同等。
- systemはユーザーをまたいだスコープとなる。
configの確認
# 構成レベルごとの確認
git config --local --list
git config --global --list
git config --system --list
# 出力例
branch.master.remote=github
## branch : セクション
## master : サブセクション(なし、あるいは複数ありの場合もある)
## remote : キー