git ワークフロー

実際のプロジェクトを git で運用する時のよくある流れをまとめました。

前準備

git push コマンドのデフォルトの挙動を変更する

git push コマンドのデフォルトの挙動では、引数を指定しないとローカルにある全てのブランチを push してしまいます。そのため、リモートとローカルに同名のブランチがある場合、リモートブランチを同名のローカルブランチで意図せず上書きしてしまう危険があります。

そこで、引数なしの git push を実行した時は、現在編集中のブランチのみ push するようにします。

$ git config  --global push.default current

新しいブランチを作成して作業する

以下の流れを行う時のコマンドです。

  1. mojamoja リポジトリに新しいブランチを作成する
  2. 変更をリモートに push する
  3. 変更点を master ブランチにマージする
  4. 変更したバージョンをタグにする
# mojamoja リポジトリをローカルに clone する
$ git clone git@bitbucket.org:1000k/mojamoja
$ cd mojamoja

# 現在ローカルにあるブランチを確認する
$ git branch -l

# 作業用ブランチ (例として 'feature-branch' という名前) を作成する
$ git branch feature-branch

# 作業用ブランチに切り替える
$ git checkout feature-branch

# 編集
$ vim ...
$ vim ...

# 変更のあったファイルを確認する
$ git status

# 変更したファイルを全てコミット対象に入れる
# 個別に登録したい場合は "git add {ファイルパス}"
$ git add -A

$ git commit -m "Foo クラスを作成。"

# 変更したファイルをリモートにプッシュする
$ git push

# master ブランチにマージする
$ git checkout master
$ git merge feature-branch
$ git push

# 既存のタグを確認
$ git tag -l

# ローカルにタグを作成する
$ git tag 0.0.1 -m "First tag"

# リモートに push する
$ git push --tags

# 使わなくなったローカルブランチを削除する
$ git branch -d feature-branch

# 使わなくなったリモートブランチを削除する
# ブランチ名の前に ":" を付け忘れると動かないので注意
$ git push origin :feature-branch

ローカルをリモートの状態に合わせる

異なるマシンから同じリモートブランチに変更を加えると、それぞれのマシン間で差異が出てしまいます。以下の手順で、ローカルのブランチをリモートにあるブランチと同期させることが可能です。

# リモートの最新のデータを取得する
$ git fetch origin master

# ローカルのバージョンの向き先を最新に変える
$ git reset --hard FETCH_HEAD

# ローカルの管理外ファイルを消す
$ git clean -df

これでリモートとローカルでファイルの中身が同一になりました。

リモートブランチをローカルで編集する

リモートにのみ 0.2.0 ブランチがあり、ローカルにはまだ無い場合、以下のコマンドでローカルにコピーすることができます。

# ローカルにあるブランチの一覧を確認する
$ git branch -r

# ローカルの 0.2.0 ブランチにリモートの 0.2.0 をチェックアウトする
$ git checkout -b 0.2.0 origin/0.2.0

間違ったコミットを取り消す

2つの考え方があるので注意。

ここは git の内部構造を理解していないと飲み込めないかもしれません。

いつやるの?Git入門 が簡潔に内部構造を説明しているので、目を通すことをオススメします。

commit -amend

後から前回のコミットに追加して変更をするやり方です。

# わざと間違ったコミットをする
$ git commit -m "Failure commit"

# これまでのコミットの一覧を確認する
$ git log

# さっきコミットし忘れたファイルをステージングする
$ git add foo.php

# 先ほどコミットした部分と合わせて新たなコミットを行う
git commit --amend -m "Successful commit"

これにより、1回目の間違ったコミットは無効化され、2回目のコミットが利用されます。

git reset

前回のコミットそのものを取り消す (無かったことにする) コマンドです。

コミットしたファイルを残すか消すかで、オプションの値を変える必要があります。

コミットだけを取り消して、変更したファイルはそのままで、1つ手前の状態に戻すには、--soft オプションを付けます。

git reset --soft HEAD^

コミットを取り消し、ワークディレクトリの中身も1つ前の状態に置き換える (= 変更も全て元に戻る) には、--hard オプションを付けます。

git reset --hard HEAD^

参考