変更を取り消す
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
コードにはミスがつきものです。バージョン管理を使用すれば、ミスを取り消して修正できます。
コミットをリバートすると、存在する問題をプロジェクトの履歴から消去するのではなく、問題のある変更を元に戻す新しいコミット(リバートコミット)が作成されます。コミットをリバートすると、以前のコミットが存在した場所のギャップではなく、明白な監査証跡が提供されます。コミットのリバートでは、プロジェクトのアクセス制御とプロセスに従って、以下を実行します:
- 元のコミットで追加された行を削除する。
- 元のコミットで削除された行を復元する。
- 元のコミットで変更された行を以前の状態に復元する。
リバートするのはコミットだけではありません。問題のある変更が複数のコミットにまたがる場合は、コミットごとにリバートするのではなく、マージリクエストからすべての変更をリバートすることを検討してください。このアプローチにより、より明白な監査証跡が提供されます。
マージリクエストをリバートする
マージリクエストをマージした後、マージリクエスト内のすべての変更をリバートできます。
前提要件:
マージリクエストの編集、リポジトリへのコードの追加を許可するプロジェクトのロールが必要です。
プロジェクトでマージ方法としてMerge Commit(マージコミット)を使用する必要があり、これはプロジェクトの設定 > マージリクエストで設定します。
GitLab 16.9以降では、以下の場合に、GitLab UIから早送りコミットをリバートできます:
- コミットがスカッシュされている、または
- マージリクエストに単一のコミットが含まれている。
マージリクエストExampleをリバートするには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- コード > マージリクエストを選択します。
- セカンダリメニューからマージ済みを選択し、マージリクエストを選択します(ここでは
Example)。 - マージリクエストのレポート領域までスクロールし、マージしたユーザーの情報を示すレポートを見つけます。
- revertを選択します。
- ブランチでRevertで、変更をリバートするブランチを選択します。
- マージリクエストなしですぐにリバートするには:
- Start a new merge request(新しいマージリクエストを作成)をクリアします。
- revertを選択すると、
Exampleのリバートが完了します。
- すぐにリバートせずに、新しいマージリクエストでリバートを確認するには、Start a new merge request(新しいマージリクエストを開始)を選択した後、以下を実行します:
- リバートするマージリクエストのフィールドに入力し、マージリクエストを作成を選択します。
- マージリクエストがマージされると、
Exampleのリバートが完了します。
Exampleマージリクエストをリバートすると、revertのオプションは表示されなくなります。
コミットをリバートする
リポジトリ内のコミットは、次のいずれかにリバートできます:
- 現在のブランチ。
- 新しいマージリクエスト。
前提要件:
- プロジェクトのロールは、マージリクエストを編集し、コードをリポジトリに追加する権限を持っている必要があります。
- この場合、revertオプションは表示されないため、コミットがまだリバートされていない必要があります。
これを行うには、次の手順を実行します:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- コミットを含むマージリクエストがわかっている場合:
- コード > マージリクエストを選択し、該当のマージリクエストを選択します。
- コミットを選択し、リバートするコミットのタイトルを選択します。これにより、マージリクエストのコンテキストにコミットが表示されます。
- GitLabは、**コミットを表示中
00001111**というメッセージをセカンダリメニューの下に表示します。00001111はコミットのハッシュです。コミットハッシュを選択して、コミットのページを表示します。
- コミットの元のマージリクエストが不明な場合:
- コード > コミットを選択します。
- コミットのタイトルを選択し、コミットに関する完全な情報を表示します。
- 右上隅で、オプションを選択し、revertを選択します。
- ブランチでRevertで、変更をリバートするブランチを選択します。
- マージリクエストなしですぐにリバートするには:
- Start a new merge request(新しいマージリクエストを作成)をクリアします。
- revertを選択します。
- すぐにリバートせずに、新しいマージリクエストでリバートを確認するには、Start a new merge request(新しいマージリクエストを開始)を選択した後、以下を実行します:
- リバートするマージリクエストのフィールドに入力し、マージリクエストを作成を選択します。
- マージリクエストがマージされると、コミットのリバートが完了します。
マージコミットを別の親コミットにリバートする
マージコミットをリバートすると、マージ先のブランチ(多くの場合、main)が常に最初の親になります。マージコミットを別の親にリバートするには、コマンドラインからコミットをリバートする必要があります。Gitを使用した変更のリバートと取り消しを参照してください。
リポジトリからテキストを削除する
誤ってコミットされた機密情報や社外秘の情報を完全に削除し、リポジトリの履歴からアクセスできないようにします。文字列のリストを***REMOVED***に置き換えます。
この操作は元に戻せません。履歴を書き換え、ハウスキーピングを実行すると、変更は永続的になります。リポジトリからテキストを削除する場合は、次の影響に注意してください:
- 開いたマージリクエストはマージに失敗し、手動によるリベースが必要になる場合があります。
- これは破壊的な操作です。既存のローカルクローンは、更新されたリポジトリとの互換性がないため、再度クローンする必要があります。
- 古いコミットSHAを参照するパイプラインが破損し、再設定が必要になる場合があります。
- 古いコミット履歴に基づく履歴タグとブランチが正しく機能しない場合があります。
- コミットへの署名は、書き換えプロセス中に削除されます。
- コミットハッシュは更新されます。そのコンテンツが削除操作によって更新されるためです。
GitLabの削除機能は、公開されたシークレットを削除しますが、同時に以下のことも行います:
- Gitの履歴状態を破損させます。
- すべてのデベロッパーに、削除後にリポジトリを再クローンすることを要求します。
- コミットハッシュに依存する次のような機能が破損します:
- マージリクエストを開く。
- 以前のコミットにリンクする。404エラーが発生します。
リポジトリの整合性を高めるために、代わりに次のことを行う必要があります:
- 公開されたシークレットを失効またはローテーションします。
- GitLabのシークレット検出機能を実装します。
このアプローチは次のことを可能にします:
- 将来のシークレット漏洩を積極的に防止する。
- セキュリティコンプライアンスを確保しながら、Gitの履歴を保持する。
詳細については、シークレットプッシュ保護を参照してください。
代替手段として、リポジトリから特定のファイルを完全に削除するには、blobを削除するを参照してください。
前提要件:
- プロジェクトのオーナーロールを持っている必要があります。
リポジトリからテキストを削除するには:
- 左側のサイドバーで、検索または移動先を選択して、プロジェクトを見つけます。
- 設定 > リポジトリを選択します。
- リポジトリの保守を展開します。
- テキストを削除するを選択します。
- ドロワーで、削除するテキストを入力します。正規表現とglobパターンを使用できます。
- 一致する文字列を削除しますを選択します。
- 確認ダイアログで、プロジェクトパスを入力します。
- はい、一致する文字列を削除しますを選択します。
- 左側のサイドバーで、設定 > 一般を選択します。
- 高度な設定を展開します。
- ハウスキーピングを実行を選択します。操作が完了するまで、少なくとも30分待ちます。
- 同じ設定 > 一般 > 高度な設定セクションで、到達不能オブジェクトを排除するを選択します。この操作が完了するまで約5〜10分かかります。
機密情報を含むプロジェクトがフォークされている場合、ハウスキーピングタスクは、この削除処理を完了できなくなり、フォークされたデータを含む特別なオブジェクトプールリポジトリの整合性が維持されなくなる可能性があります。サポートが必要な場合は、GitLabサポートにお問い合わせください。
関連トピック
- 公式
git revertドキュメント - Gitを使用して変更を取り消す
- コミットAPIを使用してコミットをリバートする
- 変更履歴がリバートされたコミットを処理する方法