目次
Git
インストール
Debian系
sudo apt install git
MacOSX
Xcodeをインストールし、コマンドラインツールをインストールするとgitもインストールされる
xcode-select --install
またはbrewで
brew install git
基本的な使い方
gitリポジトリを作成
mkdir my_project cd my_project git init
変更したファイルをコミット時の状態に戻す
git restore <path/to/target>
ステージ(コミット対象)に追加
git add <path/to/target>
ステージに追加したファイルをステージから外す
git restore --staged <path/to/target>
ステージに追加したファイルをコミット
git commit
変更したファイルをステージに上げずに直接コミット(新規ファイルは直接コミットできない)
git commit -a
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
と書ける。
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 ./変更したファイル
とする。
コミットのやり直し
コミットのやり直しは自分の手元のリポジトリのみにすべきで、みんなが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 -- ファイル名
ステージに上げられたファイルの差分を表示
$ git diff --staged $ 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
特定のファイルを過去の時点に戻す
`restore -s`を使う
指定したファイルをコミット`aaaa`の変更前に戻す
git restore -s aaaa^ 戻したいファイルのパス
git rmされたファイルを復元するときも同様。
bareリポジトリの同期
bareリポジトリのoriginに強制的に同期させる(origin側のrebaseに追従させる)
git fetch -f origin 'refs/heads/*:refs/heads/*'
イベントフック
pushの前にコードフォーマットチェックし、ダメな場合はpushを中止する
テンプレがあるのでコピー
cp .git/hook/pre-push.sample .git/hook/pre-push
.git/hook/pre-pushを以下のように変更
#!/bin/sh remote="$1" url="$2" z40=0000000000000000000000000000000000000000 while read local_ref local_sha remote_ref remote_sha do if [ "$local_sha" = $z40 ] then # Handle delete : else if [ "$remote_sha" = $z40 ] then # New branch, examine all commits range="$local_sha" else # Update to existing branch, examine new commits range="$remote_sha..$local_sha" fi # Check for WIP commit commit=`git rev-list -n 1 --grep '^WIP' "$range"` if [ -n "$commit" ] then echo >&2 "Found WIP commit in $local_ref, not pushing" exit 1 fi ## scalaの例、ここを追加! sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck status=$? if [ $status -ne 0 ]; then exit $status fi fi done exit 0