絵文字でわかるGit🍣 マージとリベースの違い・リセットとリバートの違い
公開日:
:
マンガでわかるGit
こんにちは。絵を描くWebデザイナーの湊川あいです。
絵文字 / Emoji Advent Calendar 2016 10日目を担当します。
はじめに
普段は マンガでわかるGit というものを描いていますが、今回は「絵文字」を使ってGitを解説したいと思います。
そもそもの発端
こうなってるところを
B🍚 C🐟
l
A🌾リベースすると、こう!
C'🍣 rebase
l
B🍚
l
A🌾#マンガでわかるGit ならぬ #絵文字でわかるGit— マンガでわかるWebデザイン+Git (@webdesignManga) September 17, 2016
以前、深夜テンションで #絵文字でわかるGit というものを少しつぶやいたところ、想像以上に反応がありましたので、今回改めて解説記事を書いてみます。
本記事の対象
- Git初心者の方
- Git初心者に、どう教えたら伝わりがいいか悩んでいる先輩方
Gitとは
バージョン管理システムです。
「バージョン管理システムって何?」という方向けには、こちらのマンガで解説しています。
Gitの基本
ご飯を例にしましょう。
このように、Gitは、作業工程のキリのいいところでスナップショットを撮っておくことができます。
このスナップショットひとつひとつをコミットと呼びます。
コミットについて詳しくはこちら:マンガでわかるGit 第4話「コミットしてみよう」
コミットしておくことで
「ミスった!」という時にも
変更を加える前の状態に復元することができます。
Gitの特徴
Gitのコミットは、単に差分だけを記録しているわけではなく、 瞬間瞬間の、全ファイルのスナップショット を記録しています。
よって、今の作業ディレクトリの状態がどうあろうと、コミットさえしていれば、基本的には、過去のファイルをそっくりそのまま再現できます。
ここがSubversionやCVSと大きく異なる点ですね。
ここからの記法
Gitでは「一番新しい履歴ほど上に表示される」というのがよくある書き表し方です。
今後は下記のように書き表します。
ブランチ
さて、Gitは複数人で同時並行で作業するときに真価を発揮します。
たとえば、AさんとBさんでお寿司を作りたいとします。
- お米
- 魚
せっかく2人いるので、時間短縮のために、それぞれ同時並行で作ることにしましょう。
上の図だけで、ブランチというものがなんとなくわかった方もいるかもしれませんが、ここでマンガでわかるGitでお馴染みの、初心者わかばちゃんにもう少し突っ込んでもらいましょう。
ブランチって何!?
・・・Gitの公式サイトを見てみましょう。
Git におけるブランチとは、(中略)単にコミットを指す軽量なポインタに過ぎません。
なるほどわからん!ポインタって何!?
・・・ポインタとは、簡単に言うと「👈今ココ!」です。
ほほ〜。新しいコミットが積み上げられると「今ココ!」が移動していくんだね。
チェックアウト
今自分がいるブランチは「*」を付けて表します。
この状態から
sakanaブランチへチェックアウトしてみます。
$ git checkout sakana
すると
kome ブランチから sakanaブランチへ移動できました!
チェックアウトすると、任意のコミットへ自分を移動させることができるのです。
チェックアウトについてはマンガでわかるGit 5話で詳しく解説しているので、そちらをざっと読んでもらうと理解しやすいと思います。
マージ
さて、お米と魚を合体させてお寿司を作りたいとします。
以下の3つのコミットだけで説明します。
絵文字の隣にくっついている1文字のアルファベットは、それぞれのコミットを表す連番のIDだと思ってください。
(コミットIDは、本来はもっと長い文字列ですが、この解説では便宜上アルファベット1文字で表します)
まずはkomeブランチにチェックアウトして
$ git checkout kome
sakanaブランチをマージします。
$ git merge sakana
すると
komeブランチに、sakanaブランチの変更分が取り込まれ、2つのブランチが統合されたコミットDができました!
リベース
さて、お米と魚を合体させるのは、リベースでも行えます。
マージとリベースの違いは何でしょう?
実際に、リベースして確認してみましょう。
まずsakanaブランチにチェックアウトします。
$ git checkout sakana
komeブランチにリベースしましょう。
$ git rebase kome
すると
何が起きたのでしょう?
マージした時と見比べてみましょう。
- マージの場合、過去のコミットは改変されずに、マージするためだけの新しいコミットDが作成される
-
リベースの場合、sakanaブランチのコミットが改変されて 履歴が一直線になる
リベースとは 「re+base」
つまり ブランチの付け根を植え替える と考えるとわかりやすいでしょう。
マージしてもリベースしても、得られる結果🍣は一緒だけど、生成される履歴の形が異なるんだね。
インタラクティブモードのリベース
$ git rebase -i (ブランチ名)
rebaseにオプション(-i)をつけると、インタラクティブモードのリベースができます。
このコマンドを使うと、必要なコミットだけを取捨選択できたり、コミットの順番を入れ替えられたり、コミットを統合できたりします。
pushする前に、同じような内容のコミットをひとつにまとめるときなんかに使えますね。
リセット
ここからは「Gitの履歴を元に戻す方法」を解説します。
一口に「元に戻す」と言っても、Gitには色々な戻し方があります。以下の例を見てみましょう。
稲穂🌾を調理して、白ご飯🍚にするつもりが、おせんべい🍘にしてしまいました。
コミットを戻したいときはどうしたらいいのでしょう?
resetでコミットBの時点まで戻してみましょう。
$git reset --hard B
すると
このように、コミットCがなくなり、全ての更新がなかったことになります。
resetのオプション(–softや–hard)の詳細については、fnobiさんのこちらの記事がわかりやすくてオススメです→ git resetは結局何を戻すのか
※resetが使えるのは、リモートリポジトリへpushする前に限ります
リバート
自分のパソコン上だけなら、さっきの「リセット」でうまくいきました。
でも、先ほどのような履歴を上書きする方法は、他の人と共同で使っているリモートリポジトリには使えません。
変更を巻き戻して他の人と共有するためには、「リバート」を使う必要があります。
この状態から
コミットCをrevertします。
$git revert C
すると
コミットCを打ち消す内容のコミットC’が作られました!
リセットとリバートの違い
それぞれ直訳すると
- リセット(reset)= 置き直す・再び置く
- リバート(revert)= 元の状態に立ち戻る
つまり
- リセットの場合、過去のコミットそのものを消す (コミットを置き直すために古いコミットを消す)
- リバートの場合、過去のコミットはそのままで、それを打ち消す内容の新たなコミットが作られる(その結果、ファイルの内容は元に戻る🌾)
リセットはコミット自体を消してしまうので、たとえば他の人と一緒に使っているリモートリポジトリに記録されているコミットを消してしまうと、リポジトリ間で差異が発生し、エラーになります。
リバートなら、過去のコミットはそのまま、新しいコミットが上に積み重なるだけなので、リモートリポジトリにpushしてもエラーにはなりません。
チェリーピック
Gitには様々なコマンドがありますが、最後にひとつ、かわいいコマンドを紹介しましょう。
その名もチェリーピック🍒です。kawaii。
チェリーピックを使うと、「好きなコミットを選んで収穫する」ことができます。
cherry-pickは英語の慣用句で、「熟れているサクランボだけを選んで収穫する」ことから「いいとこ取り」という意味で使われているっぽいです。
季節柄、クリスマスツリーで例えてみましょう。
指輪に加工する前の宝石💎を、ツリーに取り込みたいとします。(どんだけ豪華なツリーだよって感じですが)
ここでcherry-pickです!
$git cherry-pick C
すると
おめでとうございます!
宝石を取り込み、クリスマスツリーが飾り付けられました🎄✨
名前はかわいいチェリーピックですが、多用せざるを得ない場合は、ブランチの切り方を考え直した方が良いでしょう。「どうしてもこのコミットだけを取り込みたい!」というときだけ使いましょう。
おわりに
皆さんが初めてGitに出会ったタイミングはいつ・どんなときでしょう。
「家で」「会社で」「勉強会で」「友達に教わって」……色々あると思います。
Gitに初めて出会ったときは、知らない言葉だらけで、混乱してしまうかもしれません。かつて、私もそうでした。
でも、ひとつひとつ概念を理解していけば、Gitは怖くありません。
この記事が「Gitって感覚的で、おもしろいものなんだ!」と思うきっかけになれば嬉しいです。
Gitコマンドのクイズ
Gitコマンドの選択式クイズがCodeIQさんで出題されています。出題者はてぃーびーさん@tbpgrです📺✨
2〜3分でサクッと答えられます。
ぜひチャレンジしてみてくださいね〜。
おまけの1コママンガ付き Gitクイズ
マンガでわかるGit書籍化決定
Web上で連載しているマンガでわかるGitの書籍化が決定しました。
出版社はC&R研究所さんです。
只今、書籍用の原稿を書き貯めています。
書籍版の内容は、ガッツリ増し増しになりますのでご期待ください(頑張ります)!
発売中の本
「わかばちゃんと学ぶ Webサイト制作の基本」
8割以上が書籍限定の内容となっております。
HTML5・CSS3のコーディングだけでなく、Webサイトの企画・運用(SEO・アクセス解析)についても解説しています。
アマゾンで冒頭を試し読みできます
Next
次は ナユさん@nayucolony の「絵文字で学ぶ継承とリファクタリング🍎」です!楽しみ!!
湊川 あい
最新記事 by 湊川 あい (全て見る)
- 絵文字でわかるGit🍣 マージとリベースの違い・リセットとリバートの違い - 2016/12/10
- PHP勉強会@東京に登壇します 2016.11.30 - 2016/11/30
- マネーフォワードmeetup vol.7に登壇しました (エンジニア×個の力をForward) - 2016/11/29
関連記事
-
-
フロー情報をストック情報へ。マンガでわかるGit 連載一覧をTogetterにまとめて分かったこと
絵を描くWebデザイナーの湊川(みなとがわ)あいです。 先日、CodeIQ MAGAZINEさ
-
-
マンガでわかるGit 第一話「Gitってなあに?」
次回以降の流れは?(2016/04/11 0
-
-
CodeIQ Magazineにて、マンガでわかるGitの連載が始まりました
こんにちは、Webデザイナーの湊川あいです。 最近やっと一段落ついたので、改めて怒濤の3ヶ月をまと














