文書の過去の版を表示しています。
目次
Git
Gitは、フリーでオープンソースのバージョンコントロールシステム。Linuxのカーネル開発のためにLinus Torvaldsによって開発された。現在のRailsなど有名なプロダクトの開発もGitを使って行われており、人気が高まっている。
インストール
Debian系
sudo aptitude install git-core
MacOSX
Xcodeをインストールし、コマンドラインツールをインストールするとgitもインストールされる
xcode-select --install
またはbrewで
brew install git
個人でバージョン管理
GitはSVNのようにサーバ上のリポジトリを必要としない。ワーキングディレクトリがGitのリポジトリになる。
cd my_project git init
コミット対象(ステージ)に追加
git add ファイルorディレクトリのパス
ステージに追加したファイルをステージから外す
git reset HEAD ファイルorディレクトリのパス
コミット
git commit
変更されたファイルを全部対象にしてコミット(新しく作成したファイルは対象にならないので個別にadd)
git commit -a
最後にコミットしたバージョンに戻す(svnのrevert)
git checkout ファイルorディレクトリのパス
config
現在のリポジトリの設定を見る
git config -l
コミッタ名の変更
コミッタ名とメールアドレスを設定(これがデフォルト値になる)
git config --global user.name nullpon git config --global user.email nullpon@example.com
今いるリポジトリでデフォルト設定を上書きしたい場合
git config user.name nullpon git config user.email nullpon@example.com
リモートリポジトリを追加する
クローンした場合は自動的にクローン元がoriginという名前でリモートリポジトリとして登録されている。
githubを登録(ローカルで先に開発を始め、後からgithubのリポジトリを作った場合)
$ git remote add origin https://github.com/paulownia/test
SSHサーバを登録(SSHサーバは公開鍵認証にすべき)
$ git remote add origin ssh://repo.paulownia.jp/git/test $ git remote add origin ssh://nullpon@repo.paulownia.jp:2222/git/test
SSHのconfigに別名でHostを登録していれば…
Host repo User nullpon HostName repo.paulownia.jp Port 2222 IdentityFile ~/.ssh/id_rsa PubkeyAuthentication yes
$ git remote add origin repo:/git/test
と書ける。
リポジトリの公開
サーバ上に公開リポジトリを設置する。
サーバ上の /var/git/repo/hoge.git というディレクトリ(ディレクトリ名は必ず 〜.git という名前にすること)で
$ git --bare init
hoge.gitが公開ディレクトリとなる。bareリポジトリはワーキングディレクトリとして使えない。
現在作業中のリポジトリからbareリポジトリを作成する場合は、以下のようにクローンを作成。
$ git --bare clone project project.git
作成したbareリポジトリをサーバに設置し、以下のコマンドを実行
$ git update-server-info
Webサーバ上の公開リポジトリからcloneやpullできる。
$ git clone http://paulownia.jp/repo/hoge.git
pushしたいならssh経由でクローンするのが楽。
$ git clone ssh://nullpon@paulownia.jp/var/git/repo/hoge.git
pushされた内容はpushしただけではbareリポジトリに反映されない。pushする度にupdate-server-infoする必要がある。これをpush時に自動で実行するにはhoge.git/hooksにある post-update.sample をpost-updateにリネームして実行権限を付加する。 post-update.sample はシェルスクリプトで update-server-info のコマンドが書いてある。
push
bareリポジトリをクローンする
$ git clone ssh://nullpon@paulownia.jp/var/git/repo/hoge.git
ローカルのリポジトリにコミット
$ git add lib/hoge.rb $ git commit
ローカルのコミットをリモートのリポジトリに送信(push)するには
$ git push ssh://nullpon@paulownia.jp/var/git/repo/hoge.git master:master $ git push (pushするリモートリポジトリ) (自分のブランチ):(push先のブランチ)
リポジトリのURLは clone したときにoriginという名前が付いているので、originと書くことができる。
$ git push origin master:master
ローカルブランチとリモートブランチの名前が同じならば省略できる
$ git push origin master
リモートの変更を取り込む
リモートリポジトリoriginのmasterのコミットを、ローカルにチェックアウト中のブランチに取り込む
$ git pull origin master
これは以下の作業と同じ
$ git fetch origin master $ git merge FETCH_HEAD
リモートのブランチをローカルに作成
普通にcloneするとmasterブランチしかコピーされない。ブランチも取得したい場合はローカルに同じ名前のブランチを作り、そこにリモートのブランチをマージするという手順で作成する
まずリモートのブランチを確認
$ git branch -r origin/HEAD -> origin/master origin/master origin/hogehoge
普通にチェックアウトするとリモートからブランチを取得してチェックアウトされる。
$ git checkout hogehoge
上記のコマンドでだめな時は
$ git checkout -b hogehoge origin/hogehoge
または、ブランチ名を完全に指定してfetchし、checkout
$ git fetch origin hogehoge:hogehoge $ git checkout hogehoge
ブランチ
ブランチ一覧を見る
git branch
リモートブランチ一覧
git branch -r
originで削除されているリモートブランチを掃除する
git remote prune origin
今のブランチにマージ済みのブランチ一覧
git branch --merged
ブランチ切り替え
git switch ブランチ名
新しいブランチを作成して切り替え
git switch -c ブランチ名
ブランチの削除
git branch -d ブランチ名 (--mergedでリストされないブランチは削除されない) git branch -D ブランチ名 (--mergedでリストされないブランチも強制削除)
ブランチの名前変更
git branch -m hoge fuga
マージの仕方(ブランチhogeをmasterにマージ)
git switch master git diff hoge (差分の確認) git merge hoge git merge --no-commit hoge(コミットせずに作業領域にマージする) git merge --squash hoge(ブランチの変更を1つのコミットとしてマージする)
checkoutサブコマンドはローカルの変更を取り消してリポジトリの最新バージョンに戻す(svnのrevertに相当する)機能もある。仮にブランチ名と同じファイルがあるとブランチ変更が優先される。その場合でファイルを戻したい時は
git checkout -- 変更したファイル git checkout ./変更したファイル
とする。
SSHでリモートリポジトリにアクセス
インストール時にOpenSSHを使うか、TortoisePLinkを使うか聞かれる。既にTortoiseSVNを使っているかTortoiseGitを使うならばTortoisePLinkを使うとよい。
TortoisePLinkを選択した場合は、Puttyをインストールしておき、あらかじめセッションの設定を保存しておく。例えばmyhomeserverという名前でPuttyのセッションを保存し、Git Bashで
$ git clone ssh://myhomeserver/path/to/repo.git
でクローンできる。SSHログインユーザの指定、公開鍵、ポートの設定などはPuttyセッションで指定すると良い。
コミットのやり直し
コミットのやり直しは自分の手元のリポジトリのみにすべきで、みんながpull、pushするために作成したリポジトリで行うべきではない。
コミット漏れファイルを追加
addし忘れて、コミット対象からファイルが漏れていた場合、
$ git add 忘れたファイル $ git commit --amend
入れ忘れたファイルがHEADのリビジョンに追加される。
コミット取消し
最後のコミットを取り消す。ワーキングツリーはそのまま
$ git reset --soft HEAD^
最後のコミットを取り消し、ワーキングツリーも戻したコミットの状態にする。
$ git reset --hard HEAD^
コマンドの意味は「コミットを取り消す」ではなく「HEAD^ (=1つ前のコミット) にリセットする」という意味。HEAD^ はHEADの1つ前、HEAD^^は2つ前という意味である。また HEAD~2 も2つ前を示す。したがって、以下のコマンドで2つ前のコミットがリポジトリの最新バージョンとなる(ラスト2つのコミットを取り消す)
$ git reset --soft HEAD^^ $ git reset --soft HEAD~2
差分の確認(git diff)
$ git diff オプション コミット名1 コミット名2 -- ファイル名
コミット名の指定方法は、 HEAD^^ HEAD~2 のようなHEADからの相対指定、またはハッシュ値による絶対指定のいずれか。
- コミット名2 を省略すると、コミット名1とワーキングツリーの比較
- コミット名1 と コミット名2 の両方を省略すると、HEADとワーキングツリーの比較
例
$ git diff $ git diff -- ファイル名 $ git diff ファイル名 # ファイル名と自明の場合は -- 無しでも良い $ git diff コミット名1 $ git diff コミット名1 -- ファイル名 $ git diff コミット名1 -- ファイル名 $ git diff コミット名1 コミット名2 -- ファイル名
ワーキングツリーではなくインデックスと比較する場合はcachedオプションを付ける。
$ git diff --cached
スペース・タブの変更を無視してdiff結果を出す
$ git diff -b
差分の前後のみでなく、ファイル全体を表示
$ git diff -W
変更のあるファイル名のみ表示する場合は、name-onlyオプションを付ける
$ git diff --name-only
statを表示
$ git diff --stat
コミットログの確認
$ git log
5つ前までのログ
$ git log -5 $ git log -n 5
差分も表示
$ git log -p
変更されたファイル名と変更された行数などを表示
$ git log --stat
変更されたファイル名を表示
$ git log --name-status
指定ファイルのログを表示、ファイル名が他の意味を持ってしまう場合は – を使ってファイルであることを示す
$ git log filename $ git log -- filename
ユーザでフィルタリング(正規表現使用可能)
$ git log --author=nullpon $ git log --committer=nullpon
コミットを並び替える
$ git rebase -i HEAD~3
こんな画面が出てくる、
pick xxxxxxxx コミット1 pick xxxxxxxx コミット2 pick xxxxxxxx コミット3
コミット1が古い方。
pick xxxxxxxx コミット1 pick xxxxxxxx コミット3 pick xxxxxxxx コミット2
コミット2と3を入れ替えて保存。
複数のコミットをまとめる
たとえば3つ前までのコミットを1つにまとめる(まとめる、というよりも新しいコミットを古いコミットに含めるというのが正しい)
$ git rebase -i HEAD~3
こんな画面が出てくる
pick xxxxxxxx コミット1 pick xxxxxxxx コミット2 pick xxxxxxxx コミット3
コミット1が古い方。
pick xxxxxxxx コミット1 s xxxxxxxx コミット2 s xxxxxxxx コミット3
コメント修正画面が出てくるので、適当にコメントを直して保存するとまとまる。止めたいときはコメント全部消して終了し、git rebase –abort
ブランチ作る場所間違った
hotfix/aaa からブランチを作るべきなのに master から作ってコミットしまった…
git rebase --onto hotfix/aaa master