Contents
.gitignoreで追跡対象外のファイルは別で対応
.gitignoreでphp.iniや.htaccessが追跡対象外になっているため、Git操作だけでは不十分で、FTPでの個別ファイル操作が必要
Git resetについて
git reset
は、リポジトリの状態を以前のコミットに戻すコマンドです。主に3つの異なるモードがあります:
- git reset –soft
git reset --soft [コミットハッシュ]
- 変更点: HEADの位置だけを変更します
- ステージングエリア: 変更されません
- ワーキングディレクトリ: 変更されません
- 用途: コミットをやり直したい場合に使用します
- 結果: 指定したコミットとHEAD間の変更がステージングエリアに残り、再コミットできます
HEAD はローカルの概念!
✅ 結論:HEAD
は ローカルリポジトリでのみ使われる用語 で、現在チェックアウトされているコミットを指す
✅ origin
とは違う:origin
はリモートリポジトリ(GitHub など)を指す。
- git reset –mixed (デフォルト)
git reset [コミットハッシュ]
git reset --mixed [コミットハッシュ]
- 変更点: HEADの位置とステージングエリアを変更します
- ステージングエリア: 指定したコミットの状態に戻ります
- ワーキングディレクトリ: 変更されません
- 用途: コミットとステージングをやり直したい場合
- 結果: 変更は保持されますが、コミット前の状態(unstaged)になります
- git reset –hard
hardは全部なかったことにする
git reset --hard [コミットハッシュ]
- 変更点: HEAD、ステージングエリア、ワーキングディレクトリすべてを変更します
- ステージングエリア: 指定したコミットの状態に戻ります
- ワーキングディレクトリ: 指定したコミットの状態に戻ります(未保存の変更はすべて失われます)
- 用途: 完全に過去の状態に戻したい場合
- 結果: すべての変更が失われ、指定したコミットの状態に完全に戻ります
Git resetのロールバック手順:–hardオプションの推奨理由
Webサイトのロールバックを行う場合、git reset --hard
オプションを使用することを強く推奨します。
- ロールバック対象のコミットハッシュを確認
git log
コミットの履歴が表示されるので、ロールバック先の安定していたコミットのハッシュ値を確認します。
- ハードリセットを実行
git reset --hard [安定していたコミットのハッシュ]
これにより、リポジトリ、ステージングエリア、ワーキングディレクトリすべてが指定したコミット時点の状態に完全に戻ります。
- リモートリポジトリに変更を強制的に反映
git push -f origin [現在のブランチ名]
git push -fの本質は「履歴を消して上書きする」ことにあり、これによって履歴に依存しない更新が可能になります。
強制プッシュはGitの履歴を書き換える強力なコマンドですが、適切に使用すれば問題を解決する効果的な手段になります。特にロールバックのような緊急対応時には非常に役立ちます
- 本番サーバーで変更を取得・適用
cd [Webサイトのディレクトリ]
git pull
–hardオプションを推奨する理由
- リポジトリ、ステージング、ワーキングディレクトリの全てが完全にリセットされ、確実に安定状態に戻ります
- 部分的なリセット(–soft/–mixed)では問題のある変更が残る可能性があり、トラブルシューティングには不向きです
- 障害対応では「確実に動作していた時点」に完全に戻すことが最も安全な方法です
git resetとgit revertの主な違い
git reset | git revert |
---|---|
コミット履歴を実際に書き換えます | 既存のコミット履歴はそのまま保持します |
対象のコミットまで戻り、それ以降のコミットを削除します | 対象コミットの変更を打ち消す新しいコミットを作成します 履歴を安全に修正できます |
通常はプッシュ済みの共有ブランチには使用しません | 共有リポジトリでも安全に使えます |
Git resetとpush -fの練習方法
Git resetやforce pushの操作を安全に練習するには、以下のような方法があります。これらは実際の本番環境に影響を与えずに練習できる方法です。
1. ローカルでの練習環境を作る
# 練習用ディレクトリを作成
mkdir git-practice
cd git-practice
# 新しいGitリポジトリを初期化
git init
# いくつかファイルを作成してコミット
echo "初めてのファイル" > file1.txt
git add file1.txt
git commit -m "最初のコミット"
echo "2つ目のファイル" > file2.txt
git add file2.txt
git commit -m "2つ目のコミット"
echo "3つ目のファイル" > file3.txt
git add file3.txt
git commit -m "3つ目のコミット"
# コミット履歴を確認
git log --oneline
2. リモートリポジトリをシミュレート
# 別のディレクトリに裸のリポジトリを作成(これがリモートの役割)
cd ..
mkdir remote-repo.git
cd remote-repo.git
git init --bare
# 元のリポジトリに戻り、リモートとして追加
cd ../git-practice
git remote add origin ../remote-repo.git
# リモートにプッシュ
git push -u origin master
3. git resetとforce pushの練習
# 履歴を確認
git log --oneline
# 1つ前のコミットに戻す
git reset --hard HEAD~1
# 履歴を確認(最新のコミットが消えているはず)
git log --oneline
# 強制プッシュ
git push -f origin master
4. チーム開発をシミュレーション
# 別のディレクトリにクローンして別のユーザーをシミュレート
cd ..
mkdir teammate
cd teammate
git clone ../remote-repo.git .
# 変更を加えてコミット
echo "チームメイトの変更" > teammate-file.txt
git add teammate-file.txt
git commit -m "チームメイトの変更"
# リモートにプッシュ
git push origin master
そして元のディレクトリに戻って、どのように競合が発生するかを観察できます。
オンラインの練習サービス
Learn Git Branching
https://learngitbranching.js.org/?locale=ja