ユーザ用ツール

サイト用ツール


git

Git

Gitは、フリーでオープンソースのバージョンコントロールシステム。Linuxのカーネル開発のためにLinus Torvaldsによって開発された。

インストール

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
git.txt · 最終更新: 2022/07/13 12:08 by nullpon