Git基本コマンド

2020/12/24

今回は、Gitの基本コマンドをまとめてみました。

ちなみに、逆引きで調べたい方は以下になります。

 
INDEX

 

設定(git config)


「~/.gitconfig」に書き込まれます。


# ユーザー名登録
$ git config --global user.name "hoge"

# メールアドレス登録
$ git config --global user.email "hoge@hogehoge.com"

 

設定ファイルについて
ファイル 対象 確認コマンド
/etc/gitconfig 全ユーザ git config --system -l
~/.gitconfig 特定ユーザ git config --global -l
~/.git/config 特定リポジトリ git config --local -l

 

ローカルリポジトリの作成(git init)


ローカルホストにリポジトリ用のファイルが「既にある」場合は git initコマンドを使います。
ローカルホストにリポジトリ用のファイルが「まだない」場合は git cloneコマンドを使います。


$ cd リポジトリ名

# リポジトリを作成
# .gitディレクトリが作成される
# .gitディレクトリを削除すればgit管理を辞めることができる
$ git init

# ローカルホストでREADME.mdファイルを作成し、リモートリポジトリを更新
$ echo "# リポジトリ名" >> README.md
$ git add README.md
$ git commit -m "first commit"

# リモートリポジトリのアドレスをoriginという名前に紐づける
$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git

# ローカルリポジトリを、先ほど作成したリモートリポジトリへプッシュする
$ git push -u origin master

 

リモートリポジトリからプロジェクトをコピー(git clone)


#----------------------------
# master を clone する(SSL)
#----------------------------
$ git clone git@github.com:ユーザ名/リポジトリ名.git
$ git clone git@bitbucket.org:ユーザ名/リポジトリ名.git

# git clone でディレクトリを作らない
$ git clone git@bitbucket.org:ユーザ名/リポジトリ名.git ./

#----------------------------
# master を clone する(HTTPS)
#----------------------------
$ git clone https://github.com/ユーザ名/リポジトリ名.git

# git clone でディレクトリを作らない
$ git clone https://github.com/ユーザ名/リポジトリ名.git ./

#----------------------------
# 特定ブランチを clone する
#----------------------------
$ git clone -b ブランチ名 git@github.com:ユーザ名/リポジトリ名.git
$ git clone -b ブランチ名 https://github.com/ユーザ名/リポジトリ名.git

### 実例
# リモートリポジトリ(laravel_app4)をローカルリポジトリ(laravel_app)としてクローン
$ git clone https://github.com/honjou/laravel_app4.git laravel_app

#----------------------------
# サブモジュールを含んだプロジェクトを一発でクローン
#----------------------------
git clone --recursive https://github.com/honjou/laravel_app4

 

実例(サブモジュールを含んだプロジェクトをクローン)


 

ファイル更新までの基本手順


# ファイルを追加
$ git add [ファイル名]
$ git add index.html //実例
$ git add *.html //すべてのhtmlファイル
$ git add --all //変更されたファイル全部

# ファイルをコミット
$ git commit -m "任意のコメント"
$ git commit -m "fix for #1" //実例
$ git commit -a -m "fix for #2" //-aオプションは変更を自動検出 

# masterを更新
$ git push origin master

 

ブランチの操作(git branch)


#-------------------------
# 確認
#-------------------------
# 自分が今いるブランチを確認
$ git branch --contains

# ローカルのブランチの確認
$ git branch
# リモートブランチの一覧を確認
$ git branch --remote
# リモートブランチの一覧を確認
$ git branch -r

# リモートとローカルのブランチの一覧
$ git branch -a

#-------------------------
# 作成
#-------------------------
# ブランチの作成
$ git branch ブランチ名
# ブランチの作成(実例)
$ git branch staging


#-------------------------
# 削除
#-------------------------
# ブランチの削除
$ git branch -d ブランチ名
# ブランチの削除(強制)
$ git branch -D ブランチ名
# リモートブランチを削除
$ git push --delete origin ブランチ名
# リモートブランチを削除(実例)
$ git push --delete origin staging


#-------------------------
# 移動
#-------------------------
# ブランチの移動
$ git checkout ブランチ名
# ブランチの移動(実例)
$ git checkout staging
# リモートブランチへチェックアウト
$ git checkout -b branch_name origin/branch_name


#-------------------------
# その他
#-------------------------
# ローカルでリモートのブランチを更新
$ git remote update -p

# リモートのブランチをローカルに反映
$ git checkout -b ローカルのブランチ名 ローカルに反映したいリモートのブランチ名
# リモートのブランチをローカルに反映(実例)
$ git checkout -b dev origin/dev

# 現在のブランチ名の変更
$ git branch -m ブランチ名

# ブランチ数を数える
$ git branch --remote | wc -l

 

ファイルを併合(git merge)



### developブランチをmasterブランチにマージ ###

# 1. masterブランチに移動
$ git checkout master

# 2. 差分を併合
$ git merge develop

# マージを取り消す(コンフリクトが発生して戻したい)
$ git merge --abort

 

ファイルを併合(git rebase)


# 新しい派生元に1つずつcheryy-pickしているイメージ
# 時系列に統合する場合はgit merge
# featureブランチにて
$ git rebase develop

###### rebaseの途中でコンフリクトしたら ######
# 「続ける」場合
# コンフリクトを解決し、対象のファイルをadd
# コミットする代わりに実行する感覚
$ git rebase --continue

# 「止める」場合
# rebaseを行う前の状態に戻す
# 途中まで行っていたrebaseが全て無かったことになる
$ git rebase --abort 

 

プッシュされているコミットの打ち消し(git revert)


# commit ID とは git log を叩くと出力されるハッシュ値
# 1回リバートするたびに自動的にコミットされる
$ git revert [commit ID]

# コミットせずにリバートする
# 複数のコミットを戻して、1つのコミットとしてプッシュする場合に便利
$ git revert [commit ID] -n

# コミットメッセージを編集しない
# "This reverts commit [commit ID]"というメッセージが設定される
$ git revert --no-edit [commit ID]

 

変更を一時的に避難(git stash)


# スタッシュの実行
# saveは省略することも可
$ git stash save

# メッセージをつけてスタッシュ
$ git stash save "2020-03-27"

# スタッシュしたリストを表示
$ git stash list

# スタッシュのリスト + 変更内容確認
# 終了は"q"
$ git stash -p

# 変更したファイル一覧を確認
$ git stash show [stash名]
# 実例
$ git stash show stash@{0}

# 避難させていたファイルの復活
$ git stash apply [stash名]
# 実例
$ git stash apply stash@{0}

# 削除
$ git stash drop [消したいstash名]
# 実例
$ git stash drop stash@{0}

# 復活 + 削除
$ git stash pop stash@{0}

 

addやcommitのやり直し(git reset)


# インデックスを現在のHEADの状態にする
# HEADとは「現在のブランチの先頭コミット」
$ git reset [commit id]

# インデックスから全てのファイルをアンステージ
$ git reset HEAD

# インデックスからファイルをアンステージする
$ git reset HEAD ファイル名

# インデックス、ワーキングツリーのデータを削除
# HEAD^:直前のコミットを意味する
# --hard コミットを取り消した上でワークディレクトリの内容も書き換える
$ git reset --hard HEARD^

# --soft ワークディレクトリの内容はそのままでコミットだけ取り消し
$ git reset --soft HEAD^

# 指定したコミットIDのコミットまで戻す
$ git reset --hard [commit id]
# 上記の実例
$ git reset --hard 3dc88f8

# 直前のリセットを取り消す
# ただしコミットしたデータだけでインデックス&ワーキングツリーのデータは戻らない
$ git reset --hard ORIG_HEAD

まだコミットしてないのに git reset してしまうと、変更は取り戻せなくなるので注意!

 

リモートリポジトリに変更を書き込む(git push)


# リモートリポジトリに変更を書き込む
$ git push 【リモートリポジトリのアドレス】 【ブランチ名】
# 実例
$ git push origin master

# 引数をすべて省略して、上流ブランチへプッシュ
# もし、上流ブランチの設定値がない場合は、デフォルトで「origin」がPush先のレポジトリになる
$ git push

# 強制的にプッシュ
$ git push -f origin master

### はじめてのプッシュ
# ローカルでstagingブランチを作成した場合、プッシュ時に上流ブランチとして認識させる
# -u オプション → ローカルのstagingブランチを上流ブランチとして設定
# 次回からは git push のみでOK
$ git push -u origin staging
# こっちでも可
$ git push --set-upstream origin staging

# 指定したブランチをリモートリポジトリから削除
$ git push [remote repository] :[branch]
# 実例
$ git push origin :foo

 

管理状態を確認(git status)


# 前回のコミットと比較してどのファイルが変更されたかを表示
$ git status

# 短い書式で表示
$ git status --short
# 上記のエイリアス
$ git status -s

 

git status

 

git status --short

 

表示 説明
M_ git add されているけどまだ git commit されていないファイルの一覧
_M 編集・変更・削除されているけど、まだ git add されていないファイルの一覧
?? Git管理されていない、かつ .gitignore で管理除外対象にもされていないものの一覧

 

不要になったローカルリポジトリの削除(rm -rf)


# ワークツリーとインデックスからファイルを削除
$ git rm ファイル名

# インデックスのファイルを削除
$ git rm --cached ファイル名

# ディレクトリを消去
# -r はディレクトリ -f 警告メッセージなし
$ rm -rf ディレクトリ名

 

実例


 

リモートリポジトリのデータ取得(git fetch)


### リモートの差分を確認してマージ

# ローカルリポジトリの中には「master」「origin/master」の2つの情報が置かれている
# 以下のコマンドで「origin/master」が最新
$ git fetch

# ブランチ指定
$ git fetch origin staging

# 現在のローカルの最新版(HEAD)とfetchで取得したリポジトリの最新版(HEAD)を比較する
$ git diff HEAD origin/master

# ファイル名のみ表示する
$ git diff HEAD origin/master --name-only

# 以下のコマンドでローカルにある「master」が最新になる
$ git merge origin/master

### 他のブランチにも取り込む
$ git checkout staging
$ git merge master

 

リモートリポジトリの変更を取り込む(git pull)


# リモートリポジトリの変更を取り込む
# git fetch + git merge = git pull
$ git pull [remote repository PATH] [branch]
# 実例
$ git pull origin master

####### ローカルのmasterを、強制的にリモートのmasterに合わせる ######
# 1)リモートの最新を取ってきておいて
$ git fetch origin master

# 2)ローカルのmasterを、リモート追跡のmasterに強制的に合わせる
$ git reset --hard origin/master

 

コンフリクトの解消(git checkout)

git pull コマンドを打ってコンフリクトが発生した場合の処理です。


# 現在のブランチが正しい場合
$ git checkout --ours ファイル名

# マージ先のブランチが正しい場合
$ git checkout --theirs ファイル名

 

このあと、コンフリクトを解消したファイルをコミット → プッシュします。

 

実演

 

特定のコミットまで戻す(git reset --hard コミットID)

git log でコミットIDを調べて、git reset --hard します。


# 戻す対象のコミットIDを調べる
$ git log -5 --oneline

# 特定のコミットIDまで戻る
$ git reset --hard コミットID

 

実演

 

リモートリポジトリの操作(git remote)


# 名前とリモートリポジトリを関連付けする(リモートリポジトリの追加)
$ git remote add [username] [remote repository PATH]

# 上記の実例
$ git remote add origin http://xxxxxx.xxx/xxxx

# リモートリポジトリを一覧表示
# -v オプションでURLなど詳細表示
$ git remote -v

# URLを変更
$ git remote set-url origin [変更先のURL]

# 上記の実例
$ git remote set-url origin https://xxxx@bitbucket.org/xxxx/xxx.com.git

 

別のブランチのコミットを現在のブランチにコピー(cherry-pick)

使い方

# developブランチにチェックアウト
$ git checkkout develop

# コミット履歴を確認
$ git log -5 --oneline

# stagingブランチにチェックアウト
$ git checkout staging

# developブランチの特定のコミットをコピー
$ git cherry-pick [commit id]

 

コンフリクトが発生したら

依存関係があるファイルがあった場合、コンフリクトが発生します。

とりあえず、取り消すコマンドはオプションで --abort を打ちます。


# cherry-pickをやめる
$ git cherry-pick --abort

 
実演だとこんな感じ。

 

コミットログの確認(git log)


# コミットログを参照
$ git log

# コミットログの先頭7桁のコミットIDを表示
# "q" で終了
$ git log --oneline

# 個人的によく使うコマンド
$ git log -5 --oneline

# 特定のファイルの変更履歴を確認
$ git log -p path/to/file.txt

# gitで未プッシュのコミットを確認する(masterの場合)
$ git log origin/master..master

 

差異を表示(git diff)


# git pull する前にリモートとの変更点を見る
# git pull をする前にローカルの最新コミットとpull先のリモートリポジトリとの変更点が見たいときはこのコマンドで見れる
$ git diff HEAD..origin/master

# git push する前にリモートとの変更点を見る
$ git diff リモート名/ブランチ名..HEAD

# git add した後に変更点を見る
# git add した後にインデックスと最新のコミットとの変更点を見たいときは --cached を付けます
$git diff --cached

# 今回コミットした変更点を見る
# cherry-pick したときに、どんなファイルが更新されたかを調べたいときもこれで見れる
$ git diff HEAD^

# コミット間の差異を表示
$ git diff [commit id 1] [commit id 2]

# ブランチ間の差分を見たい
$ git diff [ブランチ名A] [ブランチ名B]

# ブランチ間の差分を見たい(使用例)
$ git diff master develop

# ブランチ間の差分を見たい + ファイル名だけ見る
$ git diff master develop --name-only

# ある1ファイルの変更点を見る
# git add する前に、ある変更したファイルに対しての変更点が見たい場合
# git が引数をファイルを推測できる場合は -- は省略可
$ git diff -- 対象のファイルパス

# 特定のファイルを別のブランチと比較したい場合はこんな感じになります。
$ git diff ブランチA..ブランチB -- 対象のファイルパス

# 別ファイル同士を比較する
# -- の後は常にパス
$ git diff -- ファイルパスA ファイルパスB

# ファイル名だけ見る
# 変更点を表示するときに、変更があったファイルのパスだけを表示してくれます。
$ git diff --name-only

 

ブランチの変更・Add前の変更の取り消し・コンフリクト対応(git checkout)


# ブランチを変更する
$ git checkout ブランチ名

# 特定のファイルの変更を取り消す
# add も commit もしていないファイルが対象
$ git checkout ファイル名

# コミットされた過去のファイルを復元する
$ git checkout コミットID ファイル名

# マージでコンフリクトしたときに情報を指定してファイル内容を採用
$ git checkout --ours ファイル名

# マージでコンフリクトしたときに下方を指定してファイル内容を採用
$ git checkout --theirs ファイル名

 

サブモジュール(git submodule)

「外部のリポジトリを現在のプロジェクトに追加」するためのコマンドです。


# サブモジュールの参照
# 現在のサブモジュールを確認
$ git submodule

# サブモジュールの追加
$ git submodule 外部リポジトリのパス
# 実例 Laradockをサブモジュール
$ git submodule add https://github.com/laradock/laradock.git

 

コミットの詳細を見る(git show)

コミットの詳細を見るコマンドです。


# HEADの差分を見る
$ git show

# 他のコミットを見る
$ git show コミットID

 
また、いろいろ発見したら随時追加していきます。

とりあえず、以上です。

 

【改訂新版】Gitポケットリファレンス

Gitの初歩的なことは一通り勉強していて、さらにもっとGitを使いこなしたいと思っている人におススメの本です。中身は基本的にリファレンスです。ただ、コマンドレベルの説明だけではなく、「使い方」や「エラーと対処法」など実用レベルで記述されています。普段のルーチン作業だけでは、すぐに細かいコマンドとか忘れがちになります。何かあったときのための備えとして、または辞書としてお手元に置いておくのもありかと思います。

Amazonで詳細を見る

オススメ

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-環境構築