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で指定できるフィールド:
フィールド | 意味 |
---|---|
refname | The name of the ref (the part after $GIT_DIR/). |
refname:short | branch, tagなど明らかな名前がついているものはこれで参照できる |
objecttype | blob, 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-]decorate | ref nameの表示有無を設定 |
--decorate-refs={tags,heads,remotes} | %D, %dで表示するものを制御する |
書式については Git - git-log Documentation#PRETTY-FORMATS辺りに詳しく書かれている。
一部の例:
書式 | 内容 |
---|---|
%H | コミットハッシュ |
%h | コミットハッシュ(短縮版) |
%s | 件名 |
%D | ref name |
%d | ref name |
%cd | コミット日時 |
%ct | コミット日時(Unixタイムスタンプ) |
%cI | コミット日時(ISO 8601形式) |
%cs | コミット日(YYYY-MM-DD) |
参考:
- Git - リビジョンの選択
- git logのオプションあれこれ - 煙と消えるその前に
- git log をいい感じに alias して色付きで見やすくしておく - Qiita
- git logのフォーマットを指定する - Qiita
git log --pretty=format
で tagを表示する方法 - Qiita- gitで特定commitの日付を取得する - $shibayu36->blog;
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
参考:
- これで完璧! git remoteでリポジトリを【追加,削除,確認,変更】 | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
- 「git remote update」と「git fetch」と「git pull」の違いは何ですか?
revert
git revert <SHA1>
## マージコミットの取消し
git revert -m 1 <SHA1>
参考:
- https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt
- gitのmerge-commitをrevertする - 車輪を再発明 / koba04の日記
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変更
.gitmodules
の向き先を新urlに変更git submodule sync
で反映.git/config
に変更が反映される
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 <リモート> :<タグ名>
参考: