LoginSignup
31
29

More than 5 years have passed since last update.

【git】コミット書き換えまとめ

Last updated at Posted at 2016-09-22

難易度 : ☆

■ amend - 直前のコミットを修正する

amendオプションを指定してコミットを行うと、
同じブランチの直前のコミットに対して内容を追加やコメントの修正をすることができます。

[主な利用シーン]
-直前のコミット漏れしたファイルを後から追加する
-直前のコミットコメントを修正する

[コマンド]

$ git add sample.txt
$ git commit --amend

参考:http://www.backlog.jp/git-guide/stepup/stepup6_1.html

■ revert - 過去のコミットを打ち消す

"revert"では、
指定したコミットの内容を打ち消すコミットを作り出すことができます。
"rebase -i"や"reset"でコミットを削除することもできますが、
そのコミットが既に公開済みであった場合は勝手に削除できません。
このような場合には、"revert"で内容を打ち消すコミットを作り出すことができます。

[主な利用シーン]
-過去に公開したコミットを安全に打ち消す

[コマンド]

$ git revert HEAD

参考:http://www.backlog.jp/git-guide/stepup/stepup6_2.html

難易度 : ☆☆

■ reset - コミットを捨てる

resetでは、
要らなくなったコミットを捨てることができます。
実行時に影響範囲によって異なるモードを指定することで、
インデックスやワークツリーの内容も戻すかどうか指定できます。

モード名 HEADの位置 インデックス ワークツリー
soft 変更する 変更しない 変更しない
mixed 変更する 変更する 変更しない
hard 変更する 変更する 変更する

HEADの位置 : branchが現在指すポインターの場所
インデックス : コミットした内容を保存する場所
ワークツリー : ローカルのリポジトリ

[主な利用シーン]
-変更したインデックスの状態を元に戻す(mixed)
-最近のコミットを完全に無かったことにする(hard)
-コミットだけを無かったことにする(soft)

[コマンド]

git reset --hard HEAD~~

--hard HEAD~~の"~"で1つ前のコミットを削除。
上記の場合は2つ前までのコミットを削除。

[+α]
reset前のコミットはORIG_HEADという名前で参照することができます。
間違えてresetしたなどの場合は、ORIG_HEADにresetするとreset前の状態に戻すことができます。

$ git reset --hard ORIG_HEAD

参考:http://www.backlog.jp/git-guide/stepup/stepup6_3.html

■ cherry-pick - コミットを抜き取る

cherry-pickでは、
別のブランチから指定したコミットをコピーして、現在のブランチに取り込む事ができます。

[主な利用シーン]
-ブランチを間違えて追加したコミットを正しい場所に移す
-別ブランチのコミットを現在のブランチにも追加する

[コマンド]

$ git cherry-pick 99daed2

99daed2コミット識別番号。取り込みたいコミットを指定して取り込む。

参考:http://www.backlog.jp/git-guide/stepup/stepup6_4.html

■ squash - ブランチ上のコミットを一つにまとめてマージする

少し特殊なmergeとして、squashオプションを紹介します。

このオプションを指定してブランチをマージすると、そのブランチのコミット全てをまとめたコミットが追加されます。

[主な利用シーン]
-トピックブランチ中のコミットを一つにまとめて統合ブランチに
統合する。

[コマンド]

$ git merge --squash issue1

issue1はブランチ名。issue1ブランチ上のすべてのコミットを一つにまとめたものが、マージするブランチにマージされる。

参考:http://www.backlog.jp/git-guide/stepup/stepup6_6.html

難易度 : ☆☆☆

■ rebase - コミットの履歴を書き換える

rebaseにiオプションを指定すると、コミットの書き換え、入れ替え、削除、統合を行うことができます。

[主な利用シーン]
-pushする前にコミットコメントをきれいに書きなおす
-意味的に同じ内容のコミットをわかりやすいように一つにまとめる
-コミット漏れしたファイルを後から追加する

[コマンド]

$ git rebase -i HEAD~~

-i HEAD~~の"~"で1つ前のコミットを対象にする。

"git rebase -i HEAD~~"をすると以下が出現。

pick 9a54fd4 commitの説明を追加↲ // 2つ前のコミット
pick 0d4a808 pullの説明を追加↲   // 1つ前のコミット
# Commands:↲
# p, pick = use commit↲
# r, reword = use commit, but edit the commit message↲
# e, edit = use commit, but stop for amending↲
# s, squash = use commit, but meld into previous commit↲
# f, fixup = like "squash", but discard this commit's log message↲
# x, exec = run command (the rest of the line) using shell↲

pick 0d4a808 pullの説明を追加
picksquashに変更し保存、終了。
すると、まとめた後のコミットに設定するコミットメッセージを編集するためのエディタが表示されるので、編集して保存・終了します。
これで1つ前のコミットを2つ前のコミットにまとめることができます。

※コミットを修正したい場合は過去のコミットを指定して、editとする。

[+α]
■競合時
ほかのコミットで競合が発生することがあります。
その時は、競合箇所を修正してからaddrebase --continueを実行してください。
このとき、コミットは必要ないので実行しないでください。
もし、途中でrebaseの作業を中止したくなった場合はrebaseに--abortオプションを指定して実行すると、これまでのrebaseでの作業をなかった事にして中止できます。

■戻す時
rebase前のコミットはORIG_HEADという名前で残っています。
もし、rebaseした後で元に戻したくなった場合は

git reset --hard ORIG_HEAD 

でrebase前の状態に戻せます。

参考:http://www.backlog.jp/git-guide/stepup/stepup6_5.html

31
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
29