アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

Git 図解でわかるコミットのIDと修正(amend)

f:id:otoyo0122:20200812194559p:plain:w300

Gitが初めての人にとって、Gitにおけるコミットを理解するのは少し難しいです。

コミットを理解すれば、Pushしたときになぜエラーが起こるのかわかるようになります。

このエントリでは図を多用しながら、Gitにおける「コミット」と「コミットの修正」について説明します。

コミット固有のID

f:id:otoyo0122:20190714112441p:plain:w600
コミットには固有のIDがある

コミットは、なんらかの変更(差分)のひとまとまりです。

コミットには固有のIDが自動で割り振られます。

この固有のIDは、40桁のランダムな英数字で、そのパターンは世界中の砂つぶの数よりも多いと言われています。

Gitはこの固有のIDによってコミットが同じかどうかを識別します。

f:id:otoyo0122:20201008124439p:plain:w600
固有のIDでコミットを見分けている

このコミット固有のIDのことを「コミットID」と呼びます。

コミットIDは、ブランチをローカルからリモートにPushしても変わることはありません。

コミットIDは変わるケースがある

コミットIDは変わるケースがあります。

先ほど、コミットIDはコミットごとに固有のものと説明しました。

というのも、コミットし直したり、コミットの順番を並べ替えたりするとコミットIDが変わる(=別コミットになる)からです。

f:id:otoyo0122:20190714113102p:plain:w600
コミットIDは変わるパターンがある

PushしたコミットのIDを変えてしまうとどうなる?

Gitは、コミットを固有のコミットIDによって見分けていると言いました。

すでにリモートにあるコミットを、ローカルで変更し、再度リモートにPushするとどうなるでしょうか?

f:id:otoyo0122:20201008124507p:plain:w600
PushしたコミットのIDを変えるとエラーになる

リモートではcccの次はdddになっているのに、ローカルではcccの次はddd'になっています。

これでは辻褄が合いません。

このときerror: failed to push some refsというエラーになってしまいます。

Gitを使うにあたって大事なことは、「一度PushしたコミットのIDを変えない」ということです。

慣れないうちは、修正の際にコミットを修正するのではなく、修正を新しいコミットとして追加しましょう。

コミットの修正は、コミットを整理してレビューしやすくできる強力な機能ですが、Gitに慣れるまでは使わなくても良いでしょう。

Gitを使うときは、リモートとローカルの差を頭に入れておき、辻褄を合わせるように意識するということが大切です。

以上です。

このエントリでは図を多用しながら、Gitにおける「コミット」と「コミットの修正」について説明しました。

Gitのブランチとコミットについて図解で復習する

Gitのブランチとコミットについて図解で復習したい方は、下記の記事が参考になりそうです。

alpacat.hatenablog.com