Git Tips (jp)
Gitの使い方の覚え書き。特に操作を間違えた場合のコマンドが分かりづらかったので。
- 基本用語
- レポジトリの作成
- クローン
- ステージング・コミット
- ステージング
- ステージングした内容を表示
- ステージングを取り消し
- コミット
- 直前にコミットした内容を表示
- 直前コミットの取り消し
- 直前コミットのメッセージだけを変更
- 特定のファイルを最新のコミットに戻す
- 全てのファイルを最新のコミットに戻す
- ファイルの移動
- ファイルの移動の取り消し(コミット前)
- ファイルの削除
- ファイルの削除の取り消し(コミット後)
- ファイルを管理対象から外す(削除はしない)
- 状況の確認
- コミット前の一時保存
- ブランチ
- 現在のブランチを元に新しいブランチを作成
- ブランチのチェックアウト(別のブランチへ切り替える)
- リモートブランチとローカルブランチの連携
- 連携している存在しないリモートブランチを削除
- ローカルレポジトリで作成したブランチをリモートレポジトリにも反映させる
- リモートレポジトリに反映したコミットを取り消す
- ブランチを削除
- 指定したコミットが含まれるブランチを表示
- Tips: 意図とは異なるブランチで編集作業を行ってしまった場合
- マージ
- 現在のブランチへ別ブランチをマージ
- 内容を確認してからマージ
- 特定のコミットのみマージ
- 別ブランチの特定のファイルを現在のブランチへ取り込む
- 別ブランチのコミットを現在のブランチへ取り込む
- コンフリクトの解消
- タグ
- レポジトリ
- リリース
- 履歴
- gitweb
- SourceTree
- 参考文献・web
基本用語
- クローン
- リモートレポジトリ→ローカルレポジトリ
- ステージング
- ワーキングツリー→インデックス
- コミット
- インデックス→ローカルレポジトリ
- origin
- リモートにあるリポジトリのご本尊(多くの場合)
レポジトリの作成
リモートレポジトリ
git init --bare --shared
-
複数人で共有するレポジトリをサーバに作成する例
mkdir test.git cd test.git git init --bare --shared
クローン
クローン
git clone remote-repos [dir-name]
- 作成されるディレクトリ名は dir-name で指定できるが後で変更も可能。
ブランチやタグを指定してクローン
git clone -b branch-name remote-repos [dir-name] git clone -b tag-name remote-repos [dir-name]
ステージング・コミット
ステージング
指定したファイルのみステージング
git add file-name-1 [file-name-2 ...]
全ファイルをステージング
git add .
部分的にステージング
git add -p ...
-
Hunkと呼ばれる単位でステージングするかどうかを指定できる。デバッグに重宝するかも。
- y: ステージングする
- n: ステージングしない
- s: 更に細かいHunkに分ける
ステージングした内容を表示
ステージングを取り消し
- インデックスから削除するだけで、ワーキングディレクトリには何も影響を与えない(ステージング前の状態に戻るだけ)。
指定したファイルのみ取り消し
git reset file-name-1 [file-name-2 ...]
全ファイルを取り消し
git reset .
メモ
- git reset は git reset --mixed HEAD の省略形。
コミット
git commit -m "commit-message"
- コマンドで commit-message を指定しない場合、環境変数 EDITOR で指定されたエディタが起動してメッセージ入力が促される。
直前にコミットした内容を表示
直前コミットの取り消し
ワーキングツリー・インデックスの内容をそのままに、コミットを取り消す(普通はこちら)
git reset --soft HEAD^
コミットを取り消し、ワーキングツリー・インデックスの変更も元に戻す。
git reset --hard HEAD^
- ワーキングツリーへの変更も無かったことになるので要注意!
直前コミットのメッセージだけを変更
git commit --amend -m "commit-message"
特定のファイルを最新のコミットに戻す
git checkout file-name1 [file-name-2 ...]
-
以下と同義
git checkout HEAD file-name1 [file-name-2 ...]
- それまでの変更内容は失われるので注意。
全てのファイルを最新のコミットに戻す
git checkout -f
- それまでの変更内容は全て失われるので注意。
ファイルの移動
git mv old-filename new-filename
- この後、コミットする必要あり
- "git mv" = "mv" + "git add" + "git rm"
ファイルの移動の取り消し(コミット前)
git reset new-filename mv new-filename old-filename
ファイルの削除
git rm filename
ファイルの削除の取り消し(コミット後)
git reset [commit] filename git checkout [commit] filename
ファイルを管理対象から外す(削除はしない)
git rm --cached filename
状況の確認
コミット前の一時保存
現在の変更を一時的に保存(ワーキングツリー・インデックスの内容を一時的にHEADに戻す)
git stash save name
- 今までの変更は一時的になかったことになる。作業途中で別の割り込み作業が入った場合などに便利。
- ちなみに "stash" は隠すという意味。
一時保存されたリストを表示
git stash list
一時保存された内容を表示
git stash show
一時保存された内容を戻す
最後に一時保存した内容を戻す
git stash pop
指定した内容を戻す
git stash pop stash@{i}
- stash@{i} は git stash list で確認
メモ
- 場合によってはコンフリクトが発生する。
一時保存された内容を削除する
ブランチ
現在のブランチを元に新しいブランチを作成
git branch branch-name
- 続いて新しいブランチで作業する場合はチェックアウトを忘れずに。
ブランチのチェックアウト(別のブランチへ切り替える)
git checkout branch-name
メモ
-
変更をコミットせずにブランチを切り替えた場合、ワーキングツリーとインデックスはそのまま維持される。但しチェックアウト先のブランチの内容と衝突が起きる場合はチェックアウトできない。
- 対処方法の例:コミットしてしまう、checkout で --merge オプションをつける、git stash する。
リモートブランチとローカルブランチの連携
git branch branch-name remote-branch-name
- はじめてリモートリポジトリをcloneしてブランチを切り替える際に必要。
-
例
git branch develop origin/develop
連携している存在しないリモートブランチを削除
git remote prune origin
ローカルレポジトリで作成したブランチをリモートレポジトリにも反映させる
git push origin branch-name
リモートレポジトリに反映したコミットを取り消す
-
完全に取り消すわけではなく、指定されたコミットを打ち消す。
git revert commit push origin branch-name
ブランチを削除
ローカルブランチを削除
-
マージ済みのブランチを削除
git branch -d branch-name
-
マージの有無にかかわらずブランチを強制削除
git branch -D branch-name
連携しているリモートブランチを削除
git push origin :branch-name
指定したコミットが含まれるブランチを表示
git branch --contains commit
Tips: 意図とは異なるブランチで編集作業を行ってしまった場合
-
対処法1(うまくいかない場合もある)
git checkout exact-branch-name
-
対処法2
git stach git checkout exact-branch-name git stash pop
マージ
現在のブランチへ別ブランチをマージ
git merge branch-name
内容を確認してからマージ
git merge --no-commit --no-ff branch-name git status (このままマージする場合) git commit -m "message" (マージを取りやめる場合) git reset --hard HEAD
特定のコミットのみマージ
git cherry-pick commit
別ブランチの特定のファイルを現在のブランチへ取り込む
git checkout branch-name file-name
別ブランチのコミットを現在のブランチへ取り込む
git fetch
git cherry-pick commit
コンフリクトの解消
コンフリクトが起きたファイルは以下のように書き換えられる。
<<<<<<< HEAD ... (元々の内容) ... ======= ... (マージしようとしている内容) ... >>>>>>> abcdefg
この範囲を修正(e.g. コンフリクトの記号と前半 or 後半を削除)した後、
git add git commit
すればよい。
タグ
タグをつける
git tag tag-name
タグを取り消し(push前)
git tag -d tag-name
タグをリモートレポジトリに反映
git push origin tag-name
リモートレポジトリに反映したタグを取り消し
git push origin :refs/tags/tag-name
指定したコミットが含まれるタグを表示
git tag -l --contains commit
タグをチェックアウト(ブランチを作成)
git checkout -b tag-name refs/tags/tag-name
レポジトリ
リリース
履歴
特定のファイルの変更履歴を表示する
git log -p file-name
行毎に変更履歴を表示する
git blame file-name
- 誰がいつコミットしたか表示されます。
指定したコミットまでワーキングツリーを戻す
git reset --hard commit
コミット同士を比較する
git diff commit1 [commit2] [file-name] git diff tag1 tag2 [file-name]
- commit2を省略すると、現在の状態から見た比較
特定のコミットによる変更を表示する
git diff commit^..commit
変更履歴に統計情報を付加する
git log --stat ... git diff --stat ...
- ファイル毎の変更行数が表示される
gitweb
gitweb は CGI のみで動く簡易的なレポジトリ閲覧ツール。default で git に付属している。
インストール
-
ディレクトリは自分の環境に合わせて。
cp -r /usr/local/share/gitweb /home/hogehoge/public_html/git
-
gitweb.cgi を編集
our $projectroot = "/home/hogehoge/git"; ←総なめしたいディレクトリ our $projects_list_group_categories = 1; ←グループ管理したい場合
Descriptionの設定
- 各gitレポジトリ以下の description に記述。
グループ名の設定
-
各git レポジトリで、
git config gitweb.category "グループ名"
SourceTree
ターミナルのssh鍵登録
- GUIとは別管理。
-
C:\Users\${user}\.ssh\config
Host github.com User git Port 22 Hostname github.com IdentityFile C:/・・・/id_rsa
- 詳しくはこちら:http://relx.jp/blog/?p=883