gitコマンド

当面、このページはリファレンス的に各サブコマンドの解説など記す。
ユースケースについてはGit#How-toを参照。

参考資料

apply

## git diffコマンドで作ったpatchを適用する
git apply file.patch

参考:

archive

NOTE:

  • tar を使わないとファイルに実行ビットがついてしまうようだ。

参考:

branch

https://git-scm.com/docs/git-branch

# ローカルのbranchを表示
git branch
## マージ済みのbranchを表示
git branch --merged
## 出力フォーマット指定
git branch --format="<FORMAT>"
## 追跡branchも含めて表示
git branch -vv

# 今のbranchを元に新しいbranchを作る
git branch <newbranch>

# 既存のbranchを元に新しいbranchを作る
git branch <oldbranch> <newbranch>

# 追跡ブランチを設定
git branch -u|--set-upstream-to origin/<branch>

--format オプションで指定できるフォーマットについてはgit-for-each-refを見よ。

参考:

checkout

## topicブランチを作成
git checkout -b topic

## remoteブランチからローカルブランチを作成
git checkout -b foo origin/foo

## 空ブランチを作る
git checkout --orphan empty

参考:

cherry-pick

別ブランチで開発中の機能などをコミット単位で取り込むときに使う。

git cherry-pick <SHA1>
## マージコミットのcherry-pick
git cherry-pick -m 1 <SHA1>

参考:

clone

https://git-scm.com/docs/git-clone

## 深さ1の shallow clone
git clone --depth 1 <URL>

## ブランチ指定
git clone --branch BRANCH URL

commit

https://git-scm.com/docs/git-commit

# 変更・削除したファイルを全てコミットする
git commit --[a]ll
# 変更点を表示してコミット
git commit -v
# 空コミット
git commit --allow-empty
# コミットメッセージを変更
git commit --amend

config

https://git-scm.com/docs/git-config

# 特定のキーの値を取得
git config [--get] <key>
## 例
git config [--get] remote.origin.url

diff

https://git-scm.com/docs/git-diff

# スペース等の差分を無視
git diff -w
# ファイル名のみ表示
git diff --name-only

# 差分があるときに失敗
git diff --exit-code
## 何も出力しない
git diff --quiet

参考:

fetch

https://git-scm.com/docs/git-fetch

git fetch [Options...]
## remote で削除された branch について、local のトラッキングブランチも消す
git fetch -p|--prune
Option機能
-f, --forceローカルブランチやタグの更新が拒否されるのを防ぐ
--tagsリモートのタグを取得

for-each-ref

https://git-scm.com/docs/git-for-each-ref

local branch, remote branchのHEAD, tagの情報を表示。

# A simple example showing the use of shell eval on the output, demonstrating the use of --shell.
# List the prefixes of all heads:

#!/bin/sh

git for-each-ref --shell --format="ref=%(refname)" refs/heads | \
while read entry; do
  eval "$entry"
  echo `dirname $ref`
done

FORMATで指定できるフィールド:

フィールド意味
refnameThe name of the ref (the part after $GIT_DIR/).
refname:shortbranch, tagなど明らかな名前がついているものはこれで参照できる
objecttypeblob, tree, commit, tag
objectsize
objectname

log

https://git-scm.com/docs/git-log

## 過去のコミットから対象文字列を含むコミットを検索
git log -S 文字列

## 1行で表示
git log --pretty=oneline
git log --oneline --graph --decorate

## フォーマット指定
git log --format="%H"     # full commit hash のみ
git log --format="%h %s"  # short hash + title
Option機能
--[no-]decorateref nameの表示有無を設定
--decorate-refs={tags,heads,remotes}%D, %dで表示するものを制御する

書式については Git - git-log Documentation#PRETTY-FORMATS辺りに詳しく書かれている。

一部の例:

書式内容
%Hコミットハッシュ
%hコミットハッシュ(短縮版)
%s件名
%Dref name
%dref name
%cdコミット日時
%ctコミット日時(Unixタイムスタンプ)
%cIコミット日時(ISO 8601形式)
%csコミット日(YYYY-MM-DD)

参考:

pull

https://git-scm.com/docs/git-pull

# リファレンスには書いてないが、fetch時に--pruneしてくれるらしい
git pull --prune
Option効果
--depth=N取得する履歴数を制限する。shallowリポジトリの場合、履歴数を指定した数に増減させる
-r, --rebase[=VALUE]VALUE には false, true, merges, preserve, interactiveのいずれかを指定可能

関連項目:

参考:

rebase

https://git-scm.com/docs/git-rebase

# (現在のブランチの)Nコミット前に遡って編集
git rebase -i HEAD~N

# 特定のコミットを除くそれ以降の履歴を編集
git rebase -i <after-this-commit>

# 1st コミットから編集
git rebase -i --root

NOTE:

  • masterにtopicブランチをマージした後で git rebase -i HEAD~N とやると、topicブランチの履歴は数に数えられないので注意

参考:

remote

https://git-scm.com/docs/git-remote

リモートリポジトリの管理。

# リモートリポジトリ一覧
git remote
git remote -v

# リモートリポジトリ追加
git remote add <リポジトリ名> <URL>

# リモートリポジトリ削除
git remote rm <リポジトリ名>

# URL変更
git remote set-url <リポジトリ名> <URL>

# リポジトリ名変更
git remote rename <リポジトリ名> <新しいリポジトリ名>

# remote groupに属するブランチをfetchする
git remote update

参考:

revert

git revert <SHA1>
## マージコミットの取消し
git revert -m 1 <SHA1>

参考:

rev-list

https://git-scm.com/docs/git-rev-list

コミットオブジェクトを新しいものから順に表示する。

Examples:

# masterにないコミットを表示
git rev-list master...HEAD

# upstreamとの間にあるコミットを検出
git rev-list HEAD...HEAD@{upstream}
Option機能
–countコミットの数を表示

show-ref

https://git-scm.com/docs/git-show-ref

Examples:

$ git show-ref
ccdda98f76466a7fe19a7ed1b99f4dbc0f9aff2d refs/heads/master
ccdda98f76466a7fe19a7ed1b99f4dbc0f9aff2d refs/remotes/origin/HEAD
58f3ac4dc2e1b893bbacb09fa300244dc95ab3e5 refs/remotes/origin/gh-pages
ccdda98f76466a7fe19a7ed1b99f4dbc0f9aff2d refs/remotes/origin/master

$ git show-ref --tags --abbrev
4eb72e6 refs/tags/v0.1.0
f0edeb9 refs/tags/v0.2.0
e711338 refs/tags/v0.3.0

status

https://git-scm.com/docs/git-status

# 出力を短くする
git status -s|--short

参考:

submodule

https://git-scm.com/docs/git-submodule

なんだかんだで割りと使っている。

# submodule追加
git submodule add <git-url> <local-path>

# 全submodule更新
git submodule foreach git pull origin master

sumobuleの削除 => https://github.com/progrhyme/git-wraps/blob/master/bin/git-submodule-delete

参考:

向き先url変更

  1. .gitmodules の向き先を新urlに変更
  2. git submodule sync で反映
    • .git/config に変更が反映される
  3. git submodule update とかで更新

参考:

symbolic-ref

https://git-scm.com/docs/git-symbolic-ref

symbolic refの読み取り、変更、削除コマンド。

Examples:

$ git symbolic-ref HEAD
refs/heads/master

$ git symbolic-ref --short HEAD
master

# デフォルトブランチの取得
$ git symbolic-ref --short refs/remotes/origin/HEAD
origin/master

$ git checkout v1.0 # switch to tag = 'detached HEAD'
$ git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref
Option機能
-q, --quietエラー時にメッセージ出力しない

tag

https://git-scm.com/docs/git-tag

SYNOPSIS:

# 作成
git tag <タグ名>
## 注釈付き
git tag -a <タグ名> -m <メッセージ>

# 表示
git show <タグ名>
## 一覧
git tag
## 指定されたオブジェクトのタグのみ表示
git tag --points-at <object>

# 削除
git tag -d <タグ名>

# リモートに反映
git push <リモート> <タグ名>
git push --tags

# 削除反映
git push <リモート> :<タグ名>

参考: