この記事の目的
この記事の主な目的は「git reset (ギット リセット)」と「git revert(ギット リバート)」の基本的な使い方と、それぞれの適切な使用シチュエーションを理解してもらうことです。エンジニア初心者や、これからGitを学び始める方を主なターゲットとしていますので、専門的な用語はできるだけ避け、わかりやすい言葉で説明していきます。
Gitの基本概念のおさらい
ここでは、Gitの中心的な概念である「コミット」や「リポジトリ」と「ワークツリー」の関係について、簡単におさらいします。
コミットとは
コミットは、Gitにおける変更履歴の一つの単位として考えることができます。ファイルやディレクトリのある時点でのスナップショットを指し、コミットを行うことでその時点での変更内容や変更した人、変更日時などの情報が記録されます。
コミットID
それぞれのコミットには一意のIDが割り当てられており、これを用いて特定のコミットを参照することができます。
親コミット
前のコミットを指し、変更履歴を辿ることができます。
リポジトリとワークツリーの関係
「リポジトリ」と「ワークツリー」は、Gitの操作を行う上で非常に重要な概念です。
リポジトリ
Gitによって管理されているプロジェクトのデータや変更履歴が保存されている場所を指します。リポジトリには、コミットされたデータやブランチ情報、タグなどが含まれています。
ワークツリー
リポジトリの最新のコミットの内容が展開されているディレクトリを指します。実際にファイルの編集や追加、削除を行う場所です。
リポジトリとワークツリーの間でのデータの移動や同期を行うために、git add
やgit commit
などのコマンドを使用します。ワークツリーでの変更をリポジトリに保存することで、変更履歴を確実に記録することができます。
「git reset」の解説
git resetは、Gitで非常に強力なコマンドの一つとして知られています。このコマンドを使うことで、特定のコミットに戻ったり、ステージングエリアの変更を取り消すことができます。しかし、その強力さゆえに、誤った使い方をすると大きなトラブルを引き起こす可能性もあります。そこで、このセクションではgit resetの正しい使い方と、それぞれのオプションの違いについて解説します。
「git reset」コマンドの基本的な説明
git resetは、主に以下の3つの目的で使用されます。
- ステージングエリアの変更を取り消す
- あるコミットに戻る
- 過去のコミットを完全に削除する
「git reset」主なオプションの解説
git resetにはいくつかのオプションがありますが、ここでは最も一般的に使用される--soft
、--mixed
、--hard
の3つのオプションに焦点を当てて解説します。
オプション | 説明 |
---|---|
--soft | 指定したコミットにHEADを移動させる。ワークツリーとステージングエリアの変更はそのまま保持 |
--mixed | (デフォルトのオプション) 指定したコミットにHEADを移動させ、ステージングエリアの変更を取り消す。ワークツリーの変更はそのまま保持 |
--hard | 指定したコミットにHEADを移動させ、ステージングエリアとワークツリーの両方の変更を取り消す |
「git reset」使用シチュエーションとメリット・デメリット
オプション | 使用シチュエーション | メリット | デメリット |
---|---|---|---|
--soft | 過去のコミットに戻りつつ、その後の変更を新しいコミットとしてまとめ直したい場合に使用 | 変更履歴を綺麗にまとめることができる | 誤操作のリスクがある。 |
--mixed | 過去のコミットに戻りつつ、ワークツリーの変更はそのままにして、再度ステージングしたい場合に使用 | ステージングのミスを修正するのに便利 | 初心者にはやや複雑に感じるかもしれない |
--hard | 過去のコミットに完全に戻りたい場合、または最近のコミットを完全に取り消したい場合に使用 | コミットのミスを完全に修正するのに有効 | 使用する際は慎重に。一度取り消した変更は元に戻せない場合がある |
「git revert」の解説
git revert
は、Gitで行った変更を取り消すためのコマンドですが、git reset
とは異なり、変更を取り消すための新しいコミットを生成する点が特徴です。このセクションでは、git revert
の基本的な使い方やその特性、使用シチュエーションについて詳しく解説します。
「git revert」コマンドの基本的な説明
git revert
コマンドは、特定のコミットの変更を取り消す新しいコミットを作成します。これにより、過去のコミットを取り消すことができる一方で、その取り消し自体の履歴も残るため、変更履歴を維持することができます。
revertが生成する新しいコミットについて
git revert
を実行すると、指定したコミットの変更を取り消す内容を持つ新しいコミットが生成されます。この新しいコミットには、取り消された変更に関する情報や、revert
コマンドを実行したユーザーの情報、日時などが記録されます。
「git revert」使用シチュエーションとメリット・デメリット
項目 | 説明 |
---|---|
使用シチュエーション | 過去の特定のコミットの変更を取り消したいが、その取り消し自体の履歴も残したい場合に使用 |
メリット | 1. 過去の変更を取り消しつつ、変更履歴を維持できる。<br>2. 誤ったコミットを公開した後でも、そのコミットを取り消すことが可能 |
デメリット | 1. 新しいコミットが生成されるため、コミット履歴が増える。<br>2. 大きな変更を取り消す場合、コンフリクトが発生する可能性がある |
コミット内容やコメントを整理する際にも使用されます。squashについてはこちらの記事で詳しく解説しています。
https://envader.plus/article/268
「git reset」と「git revert」の主な使い分け
git reset
とgit revert
はGitで行った変更を取り消すためのコマンドですが、それぞれ異なるシチュエーションでの使用が推奨されています。ここではそれぞれのコマンドが適しているシチュエーションの例と、実務でのベストプラクティスについて解説します。
それぞれのコマンドが適しているシチュエーション
git reset
- ローカルの履歴を修正したい場合: 例えば、コミットメッセージのミスを修正する、または特定の変更を含めたり除外したりする場合等
- リモートにプッシュしていないコミットを取り消したい場合: プッシュする前に間違ったコミットをしてしまった場合等
git revert
- リモートにプッシュしたコミットを安全に取り消したい場合: 他の人と共同で作業しているときや、公開リポジトリでの作業時等
- 取り消し自体の履歴も残したい場合: 何が変更されたのか、どの変更が取り消されたのかの履歴を残しておきたい場合
実務でのベストプラクティス
リモートにプッシュしたコミットはgit resetで取り消さない
他の開発者との履歴の不整合を避けることができます。リモートのコミットを取り消す場合は、git revert
を使用してください。
変更の取り消しは早めに行う
長い時間が経過してから変更を取り消すと、コンフリクトが発生する可能性が高まります。
コマンドの使用前には必ず現在のブランチやステータスを確認する
誤ったブランチやコミットで操作を行わないように注意してください。
実践編: よくあるシチュエーションでの対処法
日常の開発作業中、Gitを使用していると様々なシチュエーションに直面することがあります。ここでは、よくあるシチュエーションとその対処法を具体的に解説します。
間違ったコミットをした場合
対処法
- まだリモートにプッシュしていない場合は、
git reset
を使用して直前のコミットを取り消すことができます。git reset HEAD~1
- リモートにプッシュしてしまった場合は、
git revert
を使用して新しいコミットを生成し、間違ったコミットを取り消します。git revert [コミットのハッシュ]
過去のコミットに戻りたい場合
対処法
- 一時的に過去のコミットを確認したいだけの場合は、以下のコマンドで過去のコミットにチェックアウトできます。
git checkout [コミットのハッシュ]
- 完全に過去のコミットに戻り、それ以降のコミットを取り消したい場合は、
git reset
を使用します。git reset --hard [コミットのハッシュ]
公開リポジトリでの誤操作の修正方法
対処法
- 公開リポジトリで誤ったコミットをプッシュしてしまった場合、
git revert
を使用してそのコミットを取り消すのがベストプラクティスです。git revert [コミットのハッシュ]
- 取り消したいコミットが連続している場合は、範囲を指定して
git revert
を実行することができます。git revert [古いコミットのハッシュ]..[新しいコミットのハッシュ]
これらの方法でGitでの作業中に発生する様々な問題を効果的に解決することができます。適切なコマンドを選択し、安全な操作を心がけましょう。
まとめと次のステップ
本記事ではGitの基本的な操作であるgit reset
とgit revert
の使い方と使い分けについて詳しく解説しました。これらのコマンドは日常の開発作業で発生する様々な問題を解決するための強力なツールです。
Gitはソフトウェア開発における変更履歴の管理やチームでの協力を効率的に行うためのツールです。適切なコマンドの選択と使用方法を理解することで、開発の効率化やチームワークの向上に大きく貢献します。特にエラーや誤操作から迅速に回復する能力は、開発者としての信頼性や生産性を向上させる重要な要素となるため確実にマスターしたい所です。
さらなる学習のためのリソースや参考文献の紹介
Gitの学習は基本的なコマンドの理解から始まりますが、深く探求することでさらなる知識やスキルを獲得できます。以下はGitに関する学習のためのおすすめのリソースや参考文献です。
- Pro Git: Gitの公式ドキュメントで、初心者から上級者までの内容が詳しく解説されています。
- サル先生のGit入門: タスク管理ツールBacklogによるGitの日本語解説です。
- GitHub Learning Lab: 実践的なハンズオン形式でGitやGitHubの操作を学ぶことができるリソースです。
- Git Magic: Gitの内部構造や高度な操作に関する詳細なガイドブックです。
Gitを活用して、効率的かつ安全な開発を行いましょう。「慣れ」も大事ですので自信がつくまでコマンドを練習するといいかもしれません。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2023.03.27
未経験からのインフラエンジニアのロードマップ
今回は未経験の方に向けて、インフラエンジニアのロードマップについて解説します。ぜひ参考にしてください。
- インフラエンジニア
- キャリア・学習法
2024.01.28
Undifferentiated Heavy Liftingとは?重労働から解放されるクラウド時代の新戦略
クラウドコンピューティングの文脈でよく使われるこの用語は、企業や開発者が自社のコアビジネスやイノベーションに集中する代わりに、基本的でありながら重要なインフラストラクチャやシステム管理などの作業に多くの時間とリソースを費やしている状況を指します。
- AWS
- インフラエンジニア
2024.06.17
Googleスプレッドシートでデータを口座ごとに分けて合計金額を表示する方法
この記事では、Googleスプレッドシートを使用してデータを口座ごとに分け、各シートの最後の行に月間および年間の合計金額を表示する方法を説明します。スクリプトを使用して自動化することで、手作業でのミスを防ぎ、効率的に作業を進めることができます。
- プログラミング
- gas