「Androidは電気羊の夢を見るか」を読みたい管理者のブログ

仕事などでの色々な発見を記事にしてます。不定期更新。

git resetとgit revertの違いなど

昨今gitはGUIツールで使う人が多いと思いますが、コマンドレベルまでレイヤーを下げることでかゆい所に手が届いたりするんですね。
たとえば今やってる作業を一時的に保管しておきたいなどgit stashが便利です。これはコミットするほどでもない作業をブランチを変えたいなど止む終えない理由で残しておきたい時なんかに使います。

ところで最近知った機能にgit resetとgit revertの違いなんかがあります。両者は似たような機能なのでGUIツールなんかでは片方しかサポートしてないことがままありますが、この違いを知っとくとGUIツールを使うときなんかに何かといいかもです。

さてgit resetとgit revertの違いですが、両者ともコミットの状態をもとに戻したいという意味では同じです。ただresetが履歴を残さないで変更を巻き戻すのに対して、git reverの方は履歴はそのままで変更を戻すコミットを作成するという違いになります。

だったらgit resetだけあればいいじゃんか、って思うのですが、バージョン管理の性質上そうはいかないのです。
git revertは戻したいコミットも残した上で変更を元に戻したコミットを上に重ねるという意味になります。
なんでこんな回りくどい方法を取っているかというと、リモートリポジトリに変更の履歴が反映されてて他の人がそれを参照してたりすると大変なことになるので、極力コミットログを変更したくない時にrevertを使います。そうすれば今までの履歴に変更を巻き戻したという履歴が加わってそれがコミットされます。

人間の直観的にはresetのほうが正しい動きなんですけどね。

ちなみにGitHubDesktopでrevertを行うと戻したという履歴が残って、VisualStudioのチームエクスプローラーを使うとresetが内部的に呼ばれるため戻したという履歴は残りません。

git小ネタでした。

【改訂新版】Gitポケットリファレンス

【改訂新版】Gitポケットリファレンス

入門git

入門git