(最終更新日:2023年7月)
✔このような方へ向けて書かれた記事となります
「git pushをしたけど、取り消したい」
「git pushの取り消し方法を理解したい」
「git pushの取り消しの実行例を見てみたい」
✔当記事を通じてお伝えすること
- git pushの取り消しの基本知識
- git pushの取り消しの具体的な方法とその適用
- git pushの取り消しの実際の例
当記事では、git pushの取り消しの基本的な要点から、さらに詳しい操作方法まで、具体例を交えてわかりやすく解説します。
ぜひ最後までぜひお付き合いください。
入門編:Gitとは?
まずは、Gitについての基本を見ていきましょう。
Gitは現代のソフトウェア開発に欠かせないツールであり、その理解は開発プロジェクトの成功に直結します。
この章では、以下の内容について説明します。
- Gitの概要とその重要性
- Git操作の基本概念
- GitにおけるPushとは?
- Gitの基本用語
Gitの概要とその重要性
Gitはバージョン管理システムのひとつで、特に分散型バージョン管理システム(DVCS)として広く利用されています。
これにより、複数の開発者がひとつのプロジェクトに取り組むことが可能になり、個々の作業を管理、調整可能。
その重要性は、作業の効率化、バグのトレースと修正、そして変更履歴の管理といった点に現れています。
Git操作の基本概念
Gitを操作するためにはいくつかの基本概念を理解する必要があります。
最も基本的なものは「コミット」です。
コミットは、作業ディレクトリのある状態を記録したもので、一連のコミットはプロジェクトの進行状況を時系列で追うことを可能にします。
そのほかにも、以下のようなプロジェクトの管理や協力者とのコード共有を助ける概念があります。
- 「ブランチ」
- 「マージ」
- 「プル」
- 「プッシュ」
GitにおけるPushとは?
Gitにおける”Push”とは、あなたがローカルのリポジトリでおこなったコミットをリモートリポジトリにアップロードする操作のこと。
Pushをおこなうことで、あなたがおこなった変更をほかの人と共有したり、バックアップ保存したりが可能になります。
一般的なGitのワークフローは以下のとおり。
- リモートリポジトリからローカルリポジトリにクローンを作る
- ローカルリポジトリで作業をおこなう
- 作業が一段落ついたらその変更をコミットする
- これらのコミットをリモートリポジトリに反映させるために”Push”する
Pushは以下のようなコマンドでおこないます。
git push origin master
origin
:リモートリポジトリの名前(一般的にはオリジナルのリポジトリを指します)master
:アップロードするブランチ名
Gitの基本用語
以下の用語について知っておく必要があります。
うえの文書が理解できない方は、用語を確認しながらもう一度読み返しましょう。
用語 | 説明 | 例 |
---|---|---|
レポジトリ | プロジェクトの全ての履歴とファイルを保存するデータベース | GitHubにあるリモートレポジトリや、ローカルで作成したレポジトリ |
クローン | リモートレポジトリのコピーをローカルに作成する操作 | git clone https://github.com/example/repo.git |
コミット | ファイルの変更をレポジトリに記録する操作 | git commit -m "Fix a bug" |
マージ | 異なるブランチの変更を統合する操作 | git merge feature-branch |
プル | リモートレポジトリの変更を取得してローカルに統合する操作 | git pull origin main |
フェッチ | リモートレポジトリの変更を取得する操作 | git fetch origin |
ブランチ | プロジェクトの異なるバージョンを作成するためのもの | git branch feature-branch |
HEAD | 現在チェックアウトされているコミットを指すポインタ | |
作業ツリー | プロジェクトのファイルを管理・編集するディレクトリ |
なぜ「git push」を取り消す必要があるのか?
次に、「git push」の取り消しについて考えてみましょう。
これにはさまざまな理由があり、不必要なコミットを公開リポジトリに送信した場合や、間違ったブランチにpushしてしまった場合などが考えられます。
- 典型的な「git push」の誤操作事例
- 「git push」取り消しのタイミング
典型的な「git push」の誤操作事例
「git push」の誤操作は、開発者にとってはよくある問題です。
例えば、作業が完了していないにも関わらずpushしてしまった場合や、意図せず秘密の情報(APIキーなど)を含むファイルをpushしてしまった場合などがあります。
# 未完成の作業をコミットし、pushしてしまった例
$ git commit -m "Add unfinished work"
$ git push origin main
# 秘密情報を含むファイルをpushしてしまった例
$ git add secrets.txt
$ git commit -m "Add secrets"
$ git push origin main
「git push」取り消しのタイミング
「git push」の取り消しは、上記のような誤操作が発覚した時にすぐにおこなうべきです。
秘密情報を公にしてしまった場合などがその一例といえるでしょう。
ほかの人が間違ったコミットを取り込まないようにするためにも、早めの対応が求められます。
また、取り消しには時間がかかる場合があり、作業の進行に影響を与える可能性もあるため、必要以上に頻繁にpushすることを避けることも重要です。
「git push」取り消しの手順
「git push」の取り消し方法について解説していきます。
「git push」の取り消しは主に以下の2つの方法があります。
- 手順1:git resetによる方法
- 手順2:git revertによる方法
手順1:git resetによる方法
「git reset」はGitのコミットを取り消すためのコマンドのひとつ。
指定したコミットまでHEADと作業ツリーを戻します。
ここでは以下のようにコマンドを使用します。
$ git reset --hard HEAD~1
$ git push -f origin main
これにより、最後のコミットが取り消され、その状態を強制的にリモートリポジトリにpushします。
ただし以下の注意点を確認のうえ、使用してください。
- git resetの注意点1
- git resetの注意点2
- git resetの注意点3
git resetの注意点1
「git reset –hard」は非常に強力なコマンドです。
取り消したコミットは元に戻すことができません。
したがって、このコマンドを使用する前に、取り消すコミットが本当に必要ないものであることを確認してください。
git resetの注意点2
このコマンドは、作業ツリーの変更も破棄します。
未コミットの変更がある場合、それらも全て消去されることを知っておきましょう。
未コミットの変更がある場合は、先にこれをコミットするか、git stash
で退避させておくことが重要です。
git resetの注意点3
git push -f
強制的にpushすると、ほかの開発者が行ったコミットも上書きされてしまう可能性があります。
そのため、共同開発の環境ではこの操作は慎重におこないましょう。
手順2:git revertによる方法
もうひとつの方法である「git revert」について、以下の情報をお伝えします。
- git revertとは
- git revertの注意点
git revertとは
新たなコミットを作成して取り消すコミットの変更を打ち消す方法です。
ここでは以下のようにコマンドを使用します。
$ git revert HEAD
$ git push origin main
これにより、最後のコミットを打ち消す新しいコミットが作成され、その状態をリモートリポジトリにpushします。
git revertの注意点
「git revert」は新しいコミットを作成するため、その操作自体が履歴に残ります。
複数のコミットを一度に取り消す際には、その分だけ新たなコミットが作成され、履歴が複雑になる可能性があるのです。
これらを避けるためには、取り消すコミットを適切に選択し、必要に応じてsquashなどの操作をおこなうことが重要です。
git resetのオプションについて
git reset
コマンドは主に以下の3オプションとともに使用されます。
それぞれのオプションの動作を理解することで、より柔軟かつ適切なコミット操作が可能になるでしょう。
- –soft
- –mixed
- –hard
--softオプション
–softオプションは、指定したコミットまでHEADだけが移動するもの。
このオプションを用いると、コミットを取り消しつつも、そのコミットの変更をステージングエリアに保持できます。
$ git reset --soft HEAD~1
--mixedオプション
–mixedオプションを使うと、指定したコミットまでHEADとインデックスが移動します。
このオプションはデフォルトのオプションです。
コミットを取り消し、その変更をワーキングディレクトリに保持します。
$ git reset --mixed HEAD~1
--hardオプション
–hardオプションは、指定したコミットまでHEAD、インデックス、ワーキングディレクトリが全て移動します。
このオプションを用いると、コミットの取り消しとともに、そのコミットの変更も全て破棄できます。
$ git reset --hard HEAD~1
これらのオプションをうまく活用することで、コミットの取り消しや変更の管理をより効率的におこなえます。
ただしとくに--hard
オプションは非常に強力なため、その使用は注意が必要です。
直前の「git reset」操作を取り消す方法
git reset
を誤って実行してしまった場合、その操作を取り消す方法が必要です。
ここでは、その取り消し方について説明します。
- git resetの取り消し手順
- 取り消しの注意点
git resetの取り消し手順
git reset
操作を取り消すためのひとつの方法は、git reflog
コマンドを使用する方法です。
git reflog
は、HEADが指していた履歴をすべて記録するもの。
過去の状態に戻ることが可能になるのです。
以下の例を見てみましょう。
git reset –hard HEAD~1を誤って実行
次のようにgit reflog
コマンドを実行すると、HEADの移動履歴を確認できます。
$ git reflog
出力される内容は次のようになります。
1e7d5ea (HEAD -> master) HEAD@{0}: reset: moving to HEAD~1
2d9263f HEAD@{1}: commit: Add new feature
...
これらの出力から、HEAD@{1}
の時点ではまだ新しい特性をコミットしていたことがわかります。
その状態に戻るには、次のコマンドを実行しましょう。
$ git reset --hard HEAD@{1}
これにより、git reset
の操作を取り消すことができます。
取り消しの注意点
git reset --hard
は非常に強力な操作であり、元に戻せない場合もあるので注意が必要です。
特に、git reset --hard
によって破棄された変更を取り戻すことはできません。
そのため、git reset
の前には必ず現在の状態を保存するなどの対策を行うことが推奨されます。
先手必勝!Git操作のベストプラクティス
ここではGit操作のベストプラクティスを2つご紹介します。
Gitの使用法を正しく理解していれば、その使い方に迷うことはありません。
- ブランチ管理について
- 適切なコミットメッセージの書き方
ブランチ管理について
Gitでは、新機能やバグ修正などを行うために、ブランチを作成します。
ただしブランチが多すぎると、管理が難しくなることも理解してください。
そのため、以下のようなルールを持つことが推奨されます。
- ブランチの命名規則を明確にする
- ブランチを削除する
ブランチの命名規則を明確にする
ブランチ名からそのブランチが何をおこなうのかを明確にしましょう。
例えば、以下のように特定の機能追加やバグ修正に対応したブランチ名をつけます。
$ git checkout -b feature/add_login_button $ git checkout -b bugfix/fix_login_error
ブランチを削除する
各ブランチで作業を行った後は、以下を実行しましょう。
- 必ずマージまたはリベース:メインブランチ(通常はmasterまたはmain)に反映
- 使用していたそのブランチを削除する
以下は、featureブランチでの作業が終了した後にmainブランチにマージする例です。
$ git checkout main
$ git merge feature/add_login_button
$ git branch -d feature/add_login_button
適切なコミットメッセージの書き方
コミットメッセージは、そのコミットが何をおこなったのかを一目で理解できるように書くべきです。
また、可能な限り具体的であることが求められます。
例えば、以下のように具体的なコミットメッセージを書くことが推奨されます。
$ git commit -m "ヘッダーにログインボタンを追加。"
$ git commit -m "特殊文字によるログインやパスワードを入力した際のバグを修正。"
これらのメッセージは、何を行ったのかが明確であり、後からコミットログを見返した際にも、そのコミットの目的を一目で理解できます。
まとめ
Gitはバージョン管理システムとして非常に強力なツールであり、適切に使用すれば開発作業を大いに助けます。
しかしその反面、誤った操作をしてしまうと思わぬトラブルを引き起こす可能性があるのも事実。
「git push」の取り消しも、その一例といえるでしょう。
具体的には、以下の手順で取り消しを行うことができます。
git reset
による方法:「git reset –hard HEAD^」コマンドを使用します。
ただし、これはローカルの履歴も元に戻してしまうため注意が必要です。git revert
による方法:「git revert HEAD」コマンドで直前のコミットを取り消し、その結果を新たなコミットとします。
これはローカルの履歴はそのままに、リモートの履歴だけを戻す方法です。
また、ブランチの管理やコミットメッセージの書き方など、Gitのベストプラクティスを覚えることで、より効率的な開発作業が可能になります。