Git 中級者になるためのコマンド集
[履歴] [最終更新] (2018/11/23 11:30:17)
1
作品
407
技術情報
最近の投稿
ここは
趣味の電子工作を楽しむ人のためのハードウェア情報共有サイト

技術情報や作品の投稿機能、リアルタイム遠隔操作 API をご利用いただけます。
新着作品

履歴にタグを付与する (git tag)

一覧表示

タグだけを一覧表示

$ git tag

ログにタグ情報を付与して表示

$ git log --decorate=full

直近のコミットにタグを付与

コメントあり

$ git tag -a v1.0 -m 'コメント'

コメントなし

$ git tag v1.0

過去のコミットにタグを付与

履歴を調査

$ git log --oneline
9d49dd9 step-1 static phone list
96a9b5b step-0 bootstrap angular app
c6ac3f3 chore(bower): update jquery dependency to ~2.1.1

タグを付与

$ git tag -a v1.0 -m 'コメント' 9d49dd9

タグを削除

$ git tag -d v1.0

タグを指定して情報を表示

$ git show v1.0

リモートレポジトリにタグ情報を送る

タグを送信しない

$ git push origin

特定のタグを送信

$ git push origin v1.0

すべてのタグを送信

$ git push origin --tags

タグを指定してチェックアウト

$ git checkout v1.0
$ git checkout -f v1.0  ←forceオプション(変更などをすべて破棄)

歴史の長いレポジトリを素早くクローンする (git clone --depth)

すべての履歴が必要ではない場合は clone 時に --depth で数値を指定することで取得する履歴の個数を指定できます。例えば直近のコミットの履歴だけでよい場合は以下のようにすると他の履歴を取得しない分だけ素早く clone が完了します。

$ git clone --depth 1 https://github.com/xxxxx/yyyyy

Git のコメントを修正 (git commit --amend)

誤ってコミットしてしまった直前のコメントを修正するための最も簡単な方法は、以下のコマンドを発行することです。

$ git commit -m '修正版コメント' --amend

ちなみに、コミットファイル等に誤りがある場合は以下のようにします。

$ git reset --soft HEAD^

コミット直前に戻ります。

リモートレポジトリを追加 (git remote add)

Git レポジトリは複数のリモートレポジトリを参照できます。例えば、当初あるサーバのリモートレポジトリで開発が進められており、ある時点で別のサーバのリモートレポジトリに開発の主体が移動になった場合、両方のリモートレポジトリを参照して push することで当初のレポジトリも最新の状態に保つことができます。

$ git remote add old_remote_repo https://github.com/harubot/micromouse.git
$ git push old_remote_repo master

特定のファイルの変更履歴を追跡する (git log --follow)

単一ファイルしか対象にできません。基本コマンドは 'git log' に '--follow' を付与するだけです。

$ git log --follow sample.txt

変更内容の詳細を表示するためには '-p' も付与します。

$ git log -p --follow sample.txt

表示個数を制限するためには '-n' を付与します。以下は 10 に制限した場合です。

$ git log -p -10 --follow sample.txt

コミットを相殺するコミットを生成 (git revert)

$ git revert HEAD

または

$ git revert 6ccfd1842744

など。

コミット履歴修正 (git rebase)

まとめようと思ったら、とても丁寧なサイトがありました。忘備録として記載。

ローカルに残存するリモートレポジトリから削除されたブランチを削除 (prune)

$ git fetch --prune

リモートブランチをローカルにチェックアウト

実は checkout するだけです。

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mybranch

$ git checkout mybranch

$ git branch
  master
* mybranch

ブランチの作成について確認

git branch mybranch
git checkout mybranch

上記コマンドは以下のコマンドと同じ意味をもちます。

git checkout -b mybranch

別のブランチからチェックアウト

git show other_branch:somefile.txt
git checkout other_branch -- somefile.txt
git checkout other_branch -- somedir

--other_branchsomedirsomefile.txt が同名の場合に以下のようなエラーになるのを回避するためのセパレータです。名前が異なる場合は必要ではありません。

fatal: ambiguous argument 'xxx': both revision and filename
Use '--' to separate paths from revisions, like this:

push が完了していないコミットを確認

git log origin/master..master

特定の対象ファイルを git 管理対象から除外

例えば MavenGradle といったビルドツールを用いているにも関わらず、Eclipse 等の特定の開発環境に依存した設定ファイルが git 管理対象に追加されている場合、管理対象ファイルを見直すことが理想ですが、以下のコマンドで一時的に除外および除外の解除を設定できることを知っておくとよいです。

git update-index --skip-worktree .classpath
git update-index --no-skip-worktree .classpath

除外されているファイル一覧

$ git ls-files -v | grep ^S
S .classpath

Git 管理されていないファイルやディレクトリを削除 (git clean)

git clean -ffdi

他のレポジトリをサブディレクトリとして利用 (git submodule)

git submodule を利用して、他レポジトリを参照するレポジトリを作成します。

新規作成

レポジトリの作成

mkdir myrepo
cd myrepo/
git init
touch sample.txt
git add .
git commit -m 'init'

サブモジュールの追加

git submodule add https://github.com/twbs/bootstrap
git add .
git commit -m 'add submodule'

以下のようになります。

$ git log -p -1
commit 6436aacb7e476cad4450b7527c471e4f5bf99b2d
Author: username <username@example.com>
Date:   Wed May 23 19:29:53 2018 +0900

    add submodule

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..d9fccea
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "bootstrap"]
+   path = bootstrap
+   url = https://github.com/twbs/bootstrap
diff --git a/bootstrap b/bootstrap
new file mode 160000
index 0000000..31cf1fd
--- /dev/null
+++ b/bootstrap
@@ -0,0 +1 @@
+Subproject commit 31cf1fdd8da52a9b769d0a6c321f933040e62461

submodule が設定されたレポジトリの clone

clone しただけでは submodule までは clone されません。

$ cd ../
$ mkdir myrepo2
$ cd myrepo2/
$ git clone ../myrepo .
$ ls bootstrap/ | wc -l
0
$ cat .git/config | grep submodule | wc -l
0

submodule を clone するためには以下のようにします。

$ git submodule init
Submodule 'bootstrap' (https://github.com/twbs/bootstrap) registered for path 'bootstrap'
$ cat .git/config | grep submodule -A2
[submodule "bootstrap"]
    url = https://github.com/twbs/bootstrap
$ ls bootstrap/ | wc -l
0
$ git submodule update
$ ls bootstrap/ | wc -l
26

そうではなく、最初から submodule も含めて clone するためには以下のようにします。

git clone --recurse-submodules ../myrepo .

clone 済みのレポジトリにおける submodule を更新

git submodule update

submodule も submodule を持っている場合は以下のようにして再帰的に更新できます。

git submodule update --recursive
(または git submodule foreach --recursive 'git submodule update' )

submodule 毎に何らかのコマンドを実行

git submodule foreach 'git diff'

再帰的に submodule の submodule でも実行したい場合

git submodule foreach --recursive 'git diff'

submodule の merge コンフリクトを解消

master を xxxx ブランチにマージしようとしてコンフリクトが発生したとします。master で利用している submodule のバージョンを利用したい場合は以下のようにします。

git reset origin/master -- mysubmodule
git submodule update --recursive

Git LFS

サイズの大きいファイルを、差分を除いてバージョン管理するための Git 拡張 Large File Storage (LFS) を利用できます。

インストール

apt レポジトリの追加は以下のようにします。rpm や deb パッケージが提供されています。

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash

git-lfs をインストールします。

sudo apt install git-lfs
dpkg -l | grep git-lfs
man git-lfs

コンフィグファイルを追加します。

git lfs install
cat ~/.gitconfig
[filter "lfs"]
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
        process = git-lfs filter-process
        required = true

使用例

git init
dd if=/dev/zero of=./largefile.bin bs=1M count=2048

以下のようにトラッキングします。

git lfs track largefile.bin
cat .gitattributes
largefile.bin filter=lfs diff=lfs merge=lfs -text

通常の git 操作でコミットします。.gitattributes もコミット対象に含めます。

git add .
git lfs status
git commit -m 'git lfs commit'
git lfs ls-files
a7c744c13c * largefile.bin

不具合の原因となったコミットを調査 (git blame / git show)

不具合のあるファイルの各行を最後に更新したコミットを調査します。

git blame file_to_be_blamed.txt

コミットが特定できたら、その詳細を表示します。

git show abcdabcd

merge 時のコンフリクトを強制的に解消 (ours/theirs)

現在チェックアウトしているブランチ (ours) に、別のブランチ (theirs) を merge しようとしてコンフリクトが発生した場合は、以下のコマンドで強制的に片方の内容を採用できます。

git checkout --ours conflicted.txt
git checkout --theirs conflicted.txt
git add conflicted.txt

ローカルブランチの状態は変更せずに、リモートの状態を取得 (fetch)

git fetch origin

マージコミットでも差分を確認 (git log -m)

git log --name-status -m
git log --name-status -m --graph

全ブランチに対して履歴を調査 (git log --all)

git fetch origin
git log --all -- path/to/file

ブランチ名も表示

git log --all --decorate -- path/to/file
git log --all --decorate=full -- path/to/file

更に履歴の分岐をグラフ化して表示

git log --all --decorate=full --graph -- path/to/file

特定のコミットを含むブランチ一覧を取得

git branch --contains=HEAD
git branch --contains=xxxxxxxx

ブランチのコミット一覧を取得 (git rev-list)

git rev-list origin/master

特定のコミットを別ブランチからコピーして取り込む (git cherry-pick)

git cherry-pick xxxxxxxxxxxxxxxxxxxx

バイナリファイルを除外して grep (git grep -I)

git grep -I xxxx

GitLab/GitHub 等を利用せずにディレクトリに push する

push 先の作成

mkdir /tmp/sample.git
cd /tmp/sample.git/
git --bare init --shared

レポジトリの準備

mkdir ~/Desktop/sample
cd ~/Desktop/sample
git init
touch README.md
git add .
git commit -m 'init'

上記 push 先を参照 (以下のいずれか)

git remote add origin1 ssh://`whoami`@127.0.0.1/tmp/sample.git
git remote add origin2 /tmp/sample.git

push の実行

git push origin1 master
git push origin2 master

Untracked ディレクトリおよびファイルの削除 (git clean)

削除対象の確認 (dry-run)

git clean -nd

削除の実行

git clean -fd

Git コミットログの二行目は空にする

二行目は空にすることで git log --oneline などにおける表示が期待通りのものとなります。

$ git log
commit 62d8f0875edfcf3c7cd055c001056c2f50405015
Author: xxxx
Date:   Wed Nov 14 18:24:24 2018 +0900

    line1

    line3

commit b877f609024785a1b21bf5a5cf11bda87e2d576e
Author: xxxx
Date:   Wed Nov 14 18:24:06 2018 +0900

    line1
    line2
    line3

$ git log --oneline
62d8f08 line1
b877f60 line1 line2 line3

ハッシュを一行で取得 (rev-parse)

git rev-parse HEAD
336xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

サブモジュールに対して cd せずに実行

git -C mysubmodule rev-parse HEAD
関連ページ
    概要 Git を用いたプロジェクト開発を複数人で行う場合、サーバーでレポジトリ管理を行えると便利です。何らかの事情で GitHub や Bitbucket を利用できない場合は、サーバーを構築して GitLab をインストールします。ここでは特に CentOS 6 の場合についてインストール手順をまとめます。 コマンドを実行するサーバーの用意
    概要 ロボットアプリケーションの開発環境の一つ OpenRAVE (Open Robotics Automation Virtual Environment) の環境を構築するための手順を記載します。ここでは特に Debian9 を利用します。 インストール 依存パッケージ ビルドツール関連 sudo apt install git build-essential cmake