あまり使わないけど,たまに使おうとすると忘れてる Git コマンド集

no extension

git 各コマンドに関する覚え書き。 思い出したら追記予定。

Submodule の作成から削除まで

Submodule の作成

Repository に別の repository sub_repo.git を submodule として subdir に追加する場合は以下のコマンドを実行する。

$ git submodule add sub_repo.git subdir

Submodule の初期化

Submodule を含む repository を clone してきた場合は

$ git clone repo.git
$ cd repo/subdir
$ git submodule init
$ git submodule update

または

$ git clone --recursive repo.git

で初期化できる。 これ以降, remote 側から fetch/maerge した際に submodule の参照ポイントが変更されていた場合は

$ git submodule update --init --recursive

で初期化できる1

Submodule の更新

Submodule の remote 側の変更を pull する場合は以下のコマンドを実行する。

$ git submodule update --remote subdir

Fetch したデータを merge する場合は --merge オプションを, rebase する場合は --rebase オプションを付ける2

Submodule の削除

Repository から submodule を削除する場合は以下のコマンドで削除できる。

$ git submodule deinit subdir
$ git rm subdir

Remote Repository の接続設定

Remote Repository への URI を変更する

Remote repository (通常は origin)の接続先 URI を変更するには以下のコマンドを実行する。

$ git remote set-url origin new_repo.git

Remote Repository との接続を追加する

新たに remote repository との接続を追加する場合には以下のコマンドを実行する。

$ git remote add upstream up_repo.git

ここでは追加した remote repository に upstream と名前をつけている。 たとえば fork した repository で作業する際に fork 元の repository の変更も取り込みたい場合などに有効である。

Remote Repository との接続を削除する

Remote repository との接続を削除する場合には以下のコマンドを実行する。

$ git remote rm upstream

Repository の分離

Repository の特定のディレクトリ subdir を commit tree を維持したまま分離したいときの手順。

まず元の repository org_repo.git を clone する。

$ git clone org_repo.git

Clone 元の bare repository がない場合にはローカルの repository を丸ごとどっかにコピーすればよい(commit 済みであること)。

で, clone した repository 内に入って git filter-branch コマンドを実行する。

$ cd org_repo
$ git filter-branch --subdirectory-filter subdir HEAD
Rewrite **************************************** (999/999)
Ref 'refs/heads/master' was rewritten

このとき subdir 以下のファイル・ディレクトリが repository のトップ・ディレクトリに移動するので注意が必要である。 また,オリジナルの commit tree が refs/original/refs/heads/master として残っているので以下のコマンドで削除する。

$ git update-ref -d refs/original/refs/heads/master

作成した repository はそのまま使うなり新しい bare repository に push するなりすればいい。

$ git remote set-url origin new_repo.git
$ git push -u origin master

元の repository に push しようとすると怒られる3

Remote Repository の branch を削除する

GitHub とかで余計な branch を作っちゃって削除したい時。 ローカルの clone から以下の引数で push すればいいようだ。

$ git push origin :wrong-branch

commit の取り消し(しかもリモートに push しちゃった)

まず commit を完全になかったことにするには以下のコマンドを実行する。

$ git reset --hard xxxxxxx

xxxxxxx は commit ID (ハッシュ)で,取り消すコミットの直前のものを指定する。 これを push すればいいのだが,単に push しただけではエラーになるので

$ git push -f

として強制的に push する。 これで貴方の歴史はなかったことになりました(笑) チームで管理している場合はご注意を。

commit ログの収集

タグの v0.6.0 から v0.7.0 の間の commit ログを収集する。

$ git log "--pretty=format:- %s %h" v0.6.0..v0.7.0
- Merge pull request #3 from spiegel-im-spiegel/signal-subpackage 01a70c3
- Update Document 3fe7b80
- Add signal subpackage cfff012

Merge のログは不要な場合。

$ git log "--pretty=format:- %s %h" v0.6.0..v0.7.0 | grep -v Merge
- Update Document 3fe7b80
- Add signal subpackage cfff012

Git に関するブックマーク

ついでなので,ローカルで溜め込んでいた git に関するブックマークを挙げておく。

GitHub

Git-flow and GitHub-flow


  1. --recursive オプションなしで cloneした 直後は git update では初期化できないので注意。 ↩︎

  2. Rebase は歴史の改変なので取り扱いに注意。 ↩︎

  3. -f オプションを付けて強制的に push することは可能。ただしこれは(rebase と同じで)歴史の改変になるため取り扱いに注意。 ↩︎