S-JIS[2014-11-02] 変更履歴

Gitコミット

Gitのコミットコマンドのメモ。


概要

ファイルの変更(修正)・削除を確定させることを「コミットする」と言う。
また、Gitにおいて「コミット」という名詞は、ひとかたまりの変更削除されたファイル群を指す。

Gitではステージングという考え方がある。
変更したり削除したファイルを「ステージ」と呼ばれる場所に入れ、それを1つの「コミット」として変更を確定させる。
つまり、1つの「コミット」には複数のファイルの変更が含まれる。


ステージング

git add」によって、変更されたファイルあるいは新規作成されたファイルをステージに移す。

$ git add ファイル名1 ファイル名2…
$ git add ディレクトリー名		…ディレクトリー配下の全ファイル・ディレクトリー
$ git add .			…カレントディレクトリー配下の全ファイル・ディレクトリー

git rm」によって、ファイルを削除する。(削除されたことをステージングする)

$ git rm ファイル名1 ファイル名2…
$ git rm -r ディレクトリー名

どのファイルがステージングされているかは、「git status」で確認できる。

$ git status

「git reset」を使って、ステージに入っているファイルをステージから外せる。(git add前の状態に戻せる)

$ git reset HEAD ファイル名1 ファイル名2…

コミット

ステージングされた(ステージに移された)ファイルをコミットする(確定する)には「git commit」を使う。

$ git commit

引数を何も付けないと、その環境のデフォルトのエディター(viとか)が開く。
そこでコミットコメントを入力して保存するとコミットされる。

viの場合、「:wq」でコミットを実行、「:q!」でコミットをキャンセルできる。


「-m」オプションを付けるとコミットコメントを指定できるので、エディターは開かない。

$ git commit -m'コミットコメント'

コミットの変更

「--amend」オプションを使うと、直前(最新)のコミットのコメントを変更したり、コミットにファイルを加えたりすることが出来る。

$ git commit --amend

これで、デフォルトのエディターが開く。
直前の コミットのコメントが入力されているので、書き換えて保存すればコミットコメントを変更できる。


git addやgit rmによってステージに新たにファイルを追加してから「commit --amend」すると、直前のコミット内容に新たなファイルを加えることが出来る。
(コミットしたけどファイルを1つ忘れてた>< というような場合に便利)

$ git add 〜
$ git rm 〜
$ git commit --amend

ただし、既に別リポジトリーにpush済みの場合は、なるべくamendはしない方がよい。
amendはコミットの履歴を書き換えるものなので、他の人がpush済みのものを取得していたら、不整合になってしまう為。

既にpushされているコミットをamendしてから再度pushしようとするとエラーになる。

$ git push
$ git commit --amend
$ git push
To git@github.com:hishidama/sandbox.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:hishidama/sandbox.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

この場合、「-f」オプションを付けて強制的にpushすればプッシュ自体は出来る。

$ git push -f

ただ、他の場所(リポジトリー)でpullするときにエラーになってしまう(可能性が高い)ので、なるべく「push -f」はすべきではない。
(amend前のコミットをpullしていなければ、「push -f」後にpullしてもエラーにはならない)


過去のコミットの修正


コミットの取り消し

直前(最新)のコミットをコミット前の状態(変更したファイルがステージ上に入っている状態)に戻すことが出来る。

$ git reset HEAD^

コミットの削除

直前(最新)のコミットを削除する(完全に無かったことにする)ことが出来る。

$ git log			…現在のコミット履歴を確認
$ git reset --hard HEAD^
$ git log			…最新のコミットが1つ無くなっているはず

Git目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま