Git Reflog –マージされなかった削除されたブランチを回復する方法



Git Reflogに関するこの記事は、Git Reflogを使用して、Gitで削除されたブランチを復元する方法に関する包括的なガイドです。

「ソースコードが「リリース」ブランチまたは「メイン」ブランチにまだマージされていないブランチを失ったことがありますか?削除されたブランチの作業がすでにメインブランチにマージされているにもかかわらず、そのブランチを再生成したい場合はどうなりますか?」 。まあ、そのようなシナリオへの唯一の解決策は Reflogに移動

Git Reflogに関するこの記事を通じて、私はあなたを助けますブランチでの作業が失われる可能性のあるシナリオと、ブランチを回復する方法を理解します。また、この記事では、大規模なプロジェクトでの作業中にブランチが意図せず失われるのを防ぐために実行できるアプローチについても説明します。





    1. Git Reflogとは何ですか?
    2. ブランチはいつどのように削除されますか?
    3. 削除されたブランチを回復する
    4. 削除されたブランチが復元されると、どのような作業が復元されますか?
    5. GitReflogサブコマンド

それでは、この記事から始めましょう。



シナリオを考えてみましょう。aintainerは、さまざまな共同作業者からの多くの機能ブランチをマージしてから最終的に削除する必要がありますが、作業をマージする前にブランチが誤って削除されていますか?

さて、この記事に移る前に、Gitでは不可能であることをお伝えしましょう。 安全であり、チェックポストとして機能するため、そうすることはできません。つまり、ここでGitReflogが登場します。

Git Reflogとは何ですか?

ザ・「reflog」コマンドは トラックの 参照で行われたすべての変更 リポジトリの(ブランチまたはタグ)。ローカルで作成された、またはチェックアウトされたブランチとタグのログ履歴を保持します。 ブランチが作成または複製されたとき、チェックアウトされたとき、名前が変更されたときのコミットスナップショット、またはブランチで行われたコミットなどの参照ログは、によって維持されます。 「reflog」コマンドで一覧表示されます。



注意: ブランチがローカルリポジトリに存在した場合にのみ、ブランチは作業ディレクトリから回復できます。 ブランチはローカルで作成されたか、Gitが参照履歴ログを保存するためにローカルリポジトリのリモートリポジトリからチェックアウトされました。

このコマンドは、ブランチが失われたリポジトリで実行する必要があります。あなたが考えるならリモートリポジトリの状況では、ブランチを持っていた開発者のマシンでreflogコマンドを実行する必要があります。

コマンド: reflogに行く

さて、Git Reflogとは何ですか?マージされたブランチとマージされていないブランチの両方を削除して、Gitがそれをどのように処理するかを確認してみてください。

ステップ1:マスターにマージされるブランチを一覧表示する

まず、「 主人 コマンドを使用して他のブランチにいる場合は、 ’ブランチ:

$ gitチェックアウトマスター

出力

Gitチェックアウトマスター-GitReflog-Edureka

ここで、マージされたブランチのリストを取得するには、次のコマンドについて説明します。

$ gitブランチ-マージ

出力:

ステップ1.1:次に、マージされたブランチを削除します。

$ git branch -d issue#902

出力:

ブランチ「issue#902」はすでに「master」ブランチにマージされているため、正常に削除されました。

ステップ2:次に、マスターにマージされていないブランチをリストします。

$ gitブランチ--no-merged

出力

ステップ2.2:最後に、次のコマンドを使用して、マージされていないブランチを削除しましょう。

$ git branch -d prepod

「preprod」ブランチなどの未完成の作業でブランチの1つを削除しようとすると、gitは警告メッセージを表示します。

出力

さて、Git Reflogでこの記事のデータを回復する方法を説明する前に、ブランチが削除されたときに正確に何が起こり、どのような状況でブランチを回復できるかを説明しましょう。

ブランチはいつどのように削除されますか?

私たちが知っているように、Gitは 分散バージョン管理システム (DVCS)、リポジトリのクローンまたはコピーを持つすべてのマシンは、両方として機能します ノード ハブ 。この各マシンには、リポジトリコードと履歴全体の独自のコピーがあることを意味します。言うまでもなく、 共有 他の人とのあなたの仕事と 出版 同じ。

したがって、このようなシナリオでは、大規模なプロジェクトに多くの貢献者が取り組んでいる実際のシナリオでブランチが削除される場合が3つあります。次のような場合があります。

ケース1-開発者はブランチをマージまたは削除できます

開発者が機能ブランチをローカルでメインブランチにマージし、「」を使用して機能ブランチを削除するシナリオを考えてみます。 gitブランチ ’コマンドと「- d 前のスクリーンショットに見られるように、」フラグ。

コマンド: ‘git branch -d branch_name’

また、次のコマンドを使用して、開発者がブランチの変更を破棄し、他のブランチとマージせずにブランチを削除することを決定する場合もあります。

コマンド: ‘git branch -D branch_name’

上記のコマンドで、開発者はgit警告をオーバーライドするブランチを強制的に削除します

$ gitブランチ-Dpreprod

出力

注意 :「gitbranch」コマンドを実行すると、「preprod」ブランチは表示されなくなります。だから、yこのブランチに保存された作業は失われます。

ケース2–開発者が共有リポジトリのブランチを削除する

読み取り/書き込みアクセス権を持つ開発者がリモートブランチを強制的に削除しようとするシナリオを考えてみましょう。「–delete」フラグを指定して「gitpush」コマンドを使用します。

$ git push origin --delete quickfix

出力

Apache Spark vsHadoopとは

これとは別に、許可されていないユーザーまたは悪意のあるユーザーがプッシュを強制してリモートブランチを削除する場合もあります。このような場合、メンテナは、開発者が削除した「クイックフィックス」ブランチを回復できるのは、以前にこのブランチをチェックアウトしていました。このシナリオでは、そのローカルリポジトリには引き続きその参照ログがあります。

メンテナがブランチを回復できない場合、それを削除したブランチの所有者は、ローカルのreflogから回復する必要があります。

ケース3–スーパー権限を持つフックスクリプトがブランチを削除します

これはまれなことかもしれませんが、フックスクリプトが特定のgit操作イベントでトリガーされ、まだマージされていないブランチを強制的に削除する可能性のあるシナリオです。あなたはできる上記のコマンドの1つが、sudo特権を持つフックスクリプトでスクリプト化されていると考えてください。

ブランチを削除するとどうなるかがわかったので、Git Reflogのこの記事に進み、失われたブランチを回復する方法を見てみましょう。

GitReflogを使用して削除されたブランチを回復する

ステップ1 すべての参照の履歴ログ

このリポジトリ内のすべての参照(「master」、「uat」、および「prepod」)について、ローカルに記録されたすべての履歴ログのリストを取得します。

reflogに行く

ステップ2 履歴スタンプを特定する

上記のスナップショットから参照できるように、 強調表示されたコミットID: e2225bb HEADポインタインデックスと一緒に:4転売 ’ブランチは、最新の作業を指す現在のHEADポインタから作成されました。

ステップ3 回復する

回復するには '転売 ‘ブランチはコマンドを使用しますインデックスID–4のHEADポインタ参照を渡す「gitcheckout」。これは、「preprod」ブランチが作成されたときのポインター参照であり、出力スクリーンショットで強調表示されている長いコミットIDです。

git checkout -b preprod HEAD @ {4}

出力

そして出来上がり! ‘ 転売 ‘ブランチはすべてのソースコードとともに復元されます。

注意 私にbさせてください上で使用した「gitcheckout」コマンドを再取得して、理解を深めるのに役立ててください。

「gitcheckout」コマンドはオーバーロードされたコマンドです(Javaのオーバーロードされた関数と同じように)。これは、実際のブランチが復元される部分です。

この単一のコマンドは、最初に、が指す以前の履歴タイムスタンプをチェックアウトします。 HEAD @ {4}ポインタ 次に、「-b」オプションを使用して「preprod」という名前のブランチを作成し、作業ディレクトリを新しく作成したブランチに切り替えます。

これは、出力画面に示されているように、ブランチが「マスター」から「プレプロド」に切り替わることを意味します。これで、分岐モデルに従って、「master」または「release」ブランチとマージできます。

ブランチを復元する方法がわかったので、削除されたブランチが復元されたときに復元される作業について説明します。

削除されたブランチが復元されると、どのような作業が復元されますか?

スタッシュされ、スタッシュインデックスリストに保存されたファイルは復元されます。追跡されていないファイルはすべて失われます。私も常に作業をステージングしてコミットするか、それらを隠しておくことをお勧めします。

特定のブランチまたはタグのログ参照をフェッチするには、コマンド「gitreflog」を実行します。

例:「uat」ブランチのログ参照のみを確認するには、コマンド「gitrefloguat」を使用します。

GitReflogサブコマンド

reflogに行く

マニュアルページを開くコマンド

$ git reflog --help

出力

reflogに行く 公演

コマンドラインで提供された参照のログを表示します。

git reflog show master @ {0}

reflogに行く 期限切れ

このコマンドは、古いreflogエントリをプルーニングするために使用されます。

gitreflogの有効期限が切れます

reflogに行く 削除

このコマンドは、reflog履歴から単一のエントリを削除します。

git reflog delete

reflogに行く 存在する

このコマンドは、ref(ブランチまたはタグ)にreflog –ログ履歴エントリがあるかどうかを確認します。

gitreflogが存在します

上記のコマンドとは別に、「Git Reflog」コマンドにはさまざまなサブコマンドがあり、上記のサブコマンドに応じてさまざまなオプションがあります。さらに読むには、「 git reflog –help ターミナルウィンドウから」。

これで、GitReflogに関するこの記事は終わりです。DevOpsの目的は、チーム間のコミュニケーションとコラボレーションを促進しながら、より高品質のソフトウェアをより迅速かつ信頼性の高い方法で作成することです。この記事に興味がある場合は、c 一体 25万人以上の満足した学習者のネットワークを持つ信頼できるオンライン学習会社であるEdurekaが世界中に広がっています。 Edureka DevOps認定トレーニングコースは、学習者がDevOpsとは何かを理解し、SDLCの複数のステップを自動化するためのPuppet、Jenkins、Nagios、Ansible、Chef、Saltstack、GITなどのさまざまなDevOpsプロセスとツールに関する専門知識を習得するのに役立ちます。

質問がありますか? 「GitReflog」記事のコメントセクションにその旨を記載してください。できるだけ早くご連絡いたします。