タグだけを一覧表示
$ 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オプション(変更などをすべて破棄)
すべての履歴が必要ではない場合は clone 時に --depth で数値を指定することで取得する履歴の個数を指定できます。例えば直近のコミットの履歴だけでよい場合は以下のようにすると他の履歴を取得しない分だけ素早く clone が完了します。
$ git clone --depth 1 https://github.com/xxxxx/yyyyy
誤ってコミットしてしまった直前のコメントを修正するための最も簡単な方法は、以下のコマンドを発行することです。
$ git commit -m '修正版コメント' --amend
ちなみに、コミットファイル等に誤りがある場合は以下のようにします。
$ git reset --soft HEAD^
コミット直前に戻ります。
Git レポジトリは複数のリモートレポジトリを参照できます。例えば、当初あるサーバのリモートレポジトリで開発が進められており、ある時点で別のサーバのリモートレポジトリに開発の主体が移動になった場合、両方のリモートレポジトリを参照して push することで当初のレポジトリも最新の状態に保つことができます。
git remote add old_remote_repo https://github.com/harubot/micromouse.git
git push old_remote_repo master
fork されたレポジトリの feature/fcl-distance
ブランチを local で利用する場合
git remote add marlinstrub https://github.com/marlinstrub/openrave.git
git fetch marlinstrub
git checkout marlinstrub/feature/fcl-distance
単一ファイルしか対象にできません。基本コマンドは '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 HEAD
または
$ git revert 6ccfd1842744
など。
まとめようと思ったら、とても丁寧なサイトがありました。忘備録として記載。
$ 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_branch
と somedir
や somefile.txt
が同名の場合に以下のようなエラーになるのを回避するためのセパレータです。名前が異なる場合は必要ではありません。
fatal: ambiguous argument 'xxx': both revision and filename
Use '--' to separate paths from revisions, like this:
git log origin/master..master
例えば Maven や Gradle といったビルドツールを用いているにも関わらず、Eclipse 等の特定の開発環境に依存した設定ファイルが git 管理対象に追加されている場合、管理対象ファイルを見直すことが理想ですが、以下のコマンドで一時的に除外および除外の解除を設定できることを知っておくとよいです。
git update-index --skip-worktree .classpath
git update-index --no-skip-worktree .classpath
除外されているファイル一覧
$ git ls-files -v | grep ^S
S .classpath
git clean -ffdi
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
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 update --init --recursive
そうではなく、最初から submodule も含めて clone するためには以下のようにします。
git clone --recurse-submodules ../myrepo .
git submodule update
submodule も submodule を持っている場合は以下のようにして再帰的に更新できます。
git submodule update --recursive
(または git submodule foreach --recursive 'git submodule update' )
git submodule foreach 'git diff'
再帰的に submodule の submodule でも実行したい場合
git submodule foreach --recursive 'git diff'
master を xxxx ブランチにマージしようとしてコンフリクトが発生したとします。master で利用している submodule のバージョンを利用したい場合は以下のようにします。
git reset origin/master -- mysubmodule
git submodule update --recursive
.gitmodules
を編集します。
vim .gitmodules
.git/config
に変更内容を反映させるためには sync が必要です。
git submodule sync
cat .git/config
サイズの大きいファイルを、差分を除いてバージョン管理するための 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 file_to_be_blamed.txt
コミットが特定できたら、その詳細を表示します。
git show abcdabcd
現在チェックアウトしているブランチ (ours) に、別のブランチ (theirs) を merge しようとしてコンフリクトが発生した場合は、以下のコマンドで強制的に片方の内容を採用できます。
git checkout --ours conflicted.txt
git checkout --theirs conflicted.txt
git add conflicted.txt
git fetch origin
git log --name-status -m
git log --name-status -m --graph
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