login

Git Tips (jp)

Top / Git

Japanese / English

Gitの使い方の覚え書き。特に操作を間違えた場合のコマンドが分かりづらかったので。

基本用語

クローン
リモートレポジトリ→ローカルレポジトリ
ステージング
ワーキングツリー→インデックス
コミット
インデックス→ローカルレポジトリ
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 diff --staged file-name-1 [file-name-2 ...]

全ファイルを表示

git diff --staged

ステージングを取り消し

  • インデックスから削除するだけで、ワーキングディレクトリには何も影響を与えない(ステージング前の状態に戻るだけ)。

指定したファイルのみ取り消し

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 diff HEAD^ file-name-1 [file-name-2 ...]

全ファイルを表示

git diff HEAD^

直前コミットの取り消し

ワーキングツリー・インデックスの内容をそのままに、コミットを取り消す(普通はこちら)

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

状況の確認

現在のブランチ・ワークツリーへの変更・ステージングされたファイルなどを表示

git status

ワークツリーへの変更・ステージングされたファイルを短縮表示

git status -s

コミット前の一時保存

現在の変更を一時的に保存(ワーキングツリー・インデックスの内容を一時的に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 stash drop stash@{i}
  • stash@{i} は git stash list で確認

全て削除

git stash clear

ブランチ

現在のブランチを元に新しいブランチを作成

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 config -l

リモートレポジトリのurlを変更する

git remote set-url origin 新レポジトリ

リリース

レポジトリの内容をアーカイブにする

git archive (commit|tag-name) --output=zip-filename
  • 公開用のzipファイルを作成する際に便利。

履歴

特定のファイルの変更履歴を表示する

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

参考文献・web