S-JIS[2014-11-02] 変更履歴
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つ無くなっているはず