いつもgitコマンドを忘れてしまうので、備忘録を残しました。
「git commit」、「git push」などのgitを使う上で基本的なコマンドをまとめています。
もし間違っていたらごめんなさい。ご指摘してくれると助かります。
※コマンドの見方
{ }:必須の入力項目
[ ]:任意の入力項目
|:選択項目
目次
gitの大まかな流れ
gitは分散型バージョン管理システムであり、サーバ以外にもローカルPCにもデータベースがあるイメージです。
gitの大まかな構成として、以下の4フェーズがあります。
- ワーキングディレクトリ(ワーキングツリー)
- コンテンツ(ファイルやフォルダなど)の変更/削除/新規追加などの作業をするためのエリア
- インデックス(ステージングエリア)
- ワーキングディレクトリで変更/削除/新規追加したコンテンツをローカルリポジトリに保存したい時に、対象コンテンツを保持しておくエリア
- ここにあるコンテンツを直接変更することは基本やらない
- ローカルリポジトリ
- 自分の作業エリアにあるデータベース
- みんなに見えないローカルな環境で、コンテンツの変更履歴を管理することができる
- リモートリポジトリ
- みんなの作業エリアにあるデータベース
- 他の人に見てもらったり、みんなでコンテンツの変更履歴を管理することができる
上記のフェーズの間はコマンドによってやりとりします。
作業状況を確認するコマンド(status,diff,log)
変更ファイルの一覧を確認(git status)
// 変更ファイル一覧を確認
git status [ディレクトリ] [-s | -sb]
git status [ディレクトリ] [-s | -sb]
- [ディレクトリ]:指定すれば、特定ディレクトリ配下のみを確認できる
- [-s]:簡易フォーマットで確認できる
- [-sb]:ブランチ名付きで簡易フォーマットで確認できる
実行結果については以下の通り。
- [Changes not staged for commit:]は変更したけどadd/rmしていないファイル(ステージングエリアに移動していないファイル)
- [Changes to be committed:]はコミット対象として追加されているファイル(ステージングエリアに移動されているファイル)
- コミットすると、[Changes to be committed:]からなくなる
- 変更内容によってファイルが分類される
- [modified:] 修正したファイル
- [deleted:] 削除したファイル
- [Untracked files:] 新規作成したファイル
変更ファイルの差分点を確認(git diff)
git addする前に変更点を確認
// git addする前に変更点を確認
git diff
git diff
- ステージングエリアに追加する前のファイルの差分点を確認できる
- 新規追加したファイルは表示されないので注意
- より詳細はこちらを参照
git addした後に変更点を確認
// git addした後に変更点を確認
git diff --cached
git diff --cached
- ステージングエリアに追加したファイルの差分点を確認できる
- git addしていれば、新規追加したファイルであっても表示される
git commitした後に変更点を確認
// git commitした後に変更点を確認
git diff HEAD^ HEAD
git diff HEAD^ HEAD
- 直前のコミットについて差分点を確認できる
git pushする前にリモートリポジトリとの変更点を確認
// git pushする前にリモートリポジトリとの変更点を確認
git diff {origin/ブランチ名}..HEAD
git diff {origin/ブランチ名}..HEAD
- {origin/ブランチ名}:リモート追跡ブランチ名がoriginではない場合は、変更する
git pullする前にリモートリポジトリとの変更点を確認
// git pullする前にリモートリポジトリとの変更点を確認
git diff HEAD..{origin/ブランチ名}
git diff HEAD..{origin/ブランチ名}
- {origin/ブランチ名}:リモート追跡ブランチ名がoriginではない場合は、変更する
コミットしたログを確認(git log)
// コミットしたログを確認
git log [--author={ユーザ名}] [--grep={グレップ文字列}] [ファイル名]
git log [--author={ユーザ名}] [--grep={グレップ文字列}] [ファイル名]
- [--author={ユーザ名}]:ユーザ名を指定してログを表示
- [--grep={グレップ文字列}]:特定文字列を検索してログを表示
- [ファイル名]:ファイル名を指定してログを表示
- より詳細はこちらを参照
ワーキングディレクトリ⇒リモートリポジトリへの基本の流れ(add,commit,push)
(2020/1/11 更新)
git pushの矢印が間違っていたので修正しました。git pushコマンドはローカルブランチの変更をリモートブランチに反映させるコマンドのため、git pushの矢印はローカルブランチから出ます。リモード追跡ブランチはgit push実行時に自動更新されるみたいです。
yoさん、ご指摘ありがとうございました。
ステージングエリアにファイルを追加(git add/rm)
特定ファイルをステージングエリアに追加する
// 特定ファイルをステージングエリアに追加する
git add {ファイル1} [{ファイル2} ・・・]
git add {ファイル1} [{ファイル2} ・・・]
- {ファイル1}を指定してgit addできる。
- {ファイル1}を指定しないと怒られる。
特定ファイルを削除して、ステージングエリアに追加する
// 特定ファイルを削除して、ステージングエリアに追加する
git rm {ファイル1} [{ファイル2} ・・・]
git rm {ファイル1} [{ファイル2} ・・・]
- これを実行することで、[Changes to be committed:]に[deleted:]ファイルとして追加される
- {ファイル1}を指定しないと怒られる。
一括でステージングエリアに追加する
// 一括でステージングエリアに追加する
git add [-A | -u | .]
git add [-A | -u | .]
- [-A]:新規作成/変更/削除されたファイルすべて追加
- [-u]:変更/削除されたファイルを追加。新規作成は対象外
- [.]:新規作成/変更されたファイルを追加。削除は対象外
ローカルリポジトリにコミットする(git commit)
特定ファイルに対してコミットを実行する
// 特定ファイルに対してコミットを実行する
git commit [-m "{コミットメッセージ}"] {ファイル名}
git commit [-m "{コミットメッセージ}"] {ファイル名}
- [-m "{コミットメッセージ}"]:コミットメッセージを指定してコミットできる
- もし、[-m]指定しなかったら、エディタが開いてコメント入力をできる
- {ファイル名}:コミットするファイルを指定できる
- 事前にステージングエリアに追加(git add)していなくても、git commitを実施するだけでコミットできる
現在のディレクトリのみコミットを実行する
// 現在のディレクトリのみコミットを実行する
git commit .
git commit .
- 現在ディレクトリ配下のファイルをコミットできる
変更したファイルをすべてコミットを実行する
// 変更したファイルをすべてコミットを実行する
git commit -a
git commit -a
- 新規ファイルは事前にaddコマンドで追加しておく必要あり
- 変更/削除ファイルはgit addしなくても自動でコミットしてくれる
リモートリポジトリにプッシュする(git push)
// リモートリポジトリにプッシュする
git push origin {ブランチ名}
git push origin {ブランチ名}
- origin:リモート追跡ブランチ名がoriginではない場合は、変更する
- {ブランチ名}:ローカルリポジトリ名を指定することで、リモートリポジトリで同名のブランチにプッシュする
- リモート追跡ブランチは自動更新される
リモートリポジトリ⇒ワーキングリポジトリへの基本の流れ(pull,fetch)
リモートリポジトリからプルする(git pull)
// リモートリポジトリからプルする
git pull origin [ブランチ名]
git pull origin [ブランチ名]
- origin:リモート追跡ブランチ名がoriginではない場合は、変更する
- [ブランチ名]:リモートリポジトリ名を指定することで、ローカルリポジトリで同名のブランチにプルする
- [ブランチ名]を省略するとリモートリポジトリ内のすべてのブランチが対象となる(.git/configのデフォルトの動作でり、設定値によって返ることもできるみたい)
リモートリポジトリからフェッチする(git fetch)
fetchを実行すると、リモートブランチからローカルリポジトリ内のリモート追跡ブランチを情報を更新します。チェックアウトしているローカルブランチやワーキングディレクトリには更新をしません。
リモートリポジトリの内容をgit logやgit diffコマンドで確認するときに使用されます。
// リモートリポジトリからフェッチする
git fetch origin [ブランチ名]
git fetch origin [ブランチ名]
- origin:リモート追跡ブランチ名がoriginではない場合は、変更する
- [ブランチ名]:リモートリポジトリ名を指定することで、ローカルリポジトリで同名のブランチにfetchする
- [ブランチ名]を省略するとリモートリポジトリ内のすべてのブランチが対象となる(.git/configのデフォルトの動作でり、設定値によって返ることもできるみたい)
git fetchした内容をローカルブランチに反映
// git fetchした内容をローカルブランチに反映
git merge FETCH_HEAD
// もしくはこちらでも良いみたい
git merge origin/{ブランチ名}
git merge FETCH_HEAD
// もしくはこちらでも良いみたい
git merge origin/{ブランチ名}
- fetchしたリモートブランチのHEADはFETCH_HEADに格納されているみたい。
- origin:リモート追跡ブランチ名がoriginではない場合は、変更する
ブランチ関連のコマンド(branch,checkout)
ブランチを確認する(git branch)
// ブランチを確認
git branch
git branch
- ブランチ一覧が表示される
- 「*」がついているのが、現在チェックアウト中のブランチを示す
ブランチを切る(git branch)
// ブランチを切る
git branch {ブランチ名}
git branch {ブランチ名}
- 新規のブランチを追加します
ブランチをチェックアウト(git checkout)
// ブランチをチェックアウト
git checkout {ブランチ名}
git checkout {ブランチ名}
- 指定したブランチにチェックアウトする
- ワーキングディレクトリやインデックスはチャックアウトしたブランチの内容に更新される
ブランチをマージする
ブランチをマージするときはマージ対象のブランチに移動したうえでマージを実行する。
// マージ対象のブランチにチェックアウト
git checkout {マージ対象のブランチ}
// マージ元のブランチを指定してマージ
git merge {マージ元のブランチ}
// リモートリポジトリを更新
git push origin {マージ対象のブランチ}
git checkout {マージ対象のブランチ}
// マージ元のブランチを指定してマージ
git merge {マージ元のブランチ}
// リモートリポジトリを更新
git push origin {マージ対象のブランチ}
- <マージ元のブランチ> => <マージ対象のブランチ>へマージする
関連情報
参考
- 忘れやすい人のための git diff チートシート | Qiita
- git diff関連のコマンドがまとめられている。
- git log よく使うオプションまとめ | Qiita
- git log関連のコマンドがまとめられている。
- まずはGitの仕組みを理解することから | Qiita
- gitの仕組みからコマンドについてまとめられている。参考になる。
以上!
コメント
はじめまして。分かりやすい説明と図をありがとうございます。
Git勉強中で、通りすがりですが気になったので質問させてください。
図中のpushの矢印がリモート追跡ブランチから始まっていますが、正しくはローカルブランチではないでしょうか?
yo さん
コメントありがとうございます。
ご指摘いただいている通りpushの矢印はローカルブランチからでるようですので、修正しました。
参考:https://qiita.com/shinya_nakashima/items/fab635a3c04858d65c47