ホームページ >ウェブフロントエンド >CSSチュートリアル >リフェログを使用して失われたコミットを回復します
この記事は、「Advanced Git」シリーズの一部です。必ずTwitterでフォローするか、ニュースレターにサインアップして、今後の記事をご覧ください!
Gitの「Reflog」機能はほとんど知られていませんが、非常に実用的です。一部の人々はそれを「セーフティネット」と呼び、私はそれをGitの「日記」と考えることを好みます。これは、GITがヘッドポインターのすべての動きを記録するためにそれを使用しているためです(つまり、すべてのコミット、マージ、リベース、ピック、リセットなど)。 gitはリフェログでアクションを記録し、貴重なログブックと問題が発生したときの良い出発点になります。
この「Advanced Git」シリーズの最後の部分では、 git log
とgit reflog
の違いを説明し、Reflogを使用して削除されたコミットと削除されたブランチを回復する方法を示します。
git log
またはgit reflog
:違いは何ですか?以前の投稿では、 git log
コマンドを使用して以前のイベントを確認し、コミット履歴を表示することを提案しました。現在の頭とその祖先、すなわちその親、次の親などを表示します。ログは、各コミットの親を再帰的に印刷することにより、コミット履歴の開始に戻ります。これはリポジトリの一部です。つまり、プッシュ、フェッチ、またはプル後にコピーされます。
一方、 git reflog
プライベートワークスペース関連のレコードです。先祖リストを反復しません。代わりに、過去に頭によって指されたすべてのコミットの順序付けられたリストを表示します。だからこそ、ワードプロセッサ、テキスト編集者などのように、ある種の「歴史を元に戻す」と考えることができます。
このローカルレコードは、技術的にはリポジトリの一部ではなく、コミットとは別に保存されます。 Reflogは、各ブランチのローカルコミットを追跡する.git/logs/refs/heads/
のファイルです。 Gitの日記は通常、90日後にクリーニングされます(これはデフォルトです)が、リフェログの有効期限を簡単に調整できます。日数を180に変更するには、次のコマンドを入力してください。
$ git config gc.reflogexpire 180.days.ago
または、リフェログが期限切れになることはないと判断することができます。
$ git config gc.reflogexpire never
ヒント: GITは、リポジトリの構成ファイル( .git/config
)、グローバルユーザー構成( $HOME/.gitconfig
)、およびシステム全体の設定( /etc/gitconfig
)を区別することに注意してください。ユーザーまたはシステムのリフェログ有効期限を調整するには、上記のコマンドに--system
または--global
パラメーターを追加します。
十分な理論的背景 - git reflog
を使用してエラーを修正する方法をお見せしましょう。
次のシナリオを想像してください。コミット履歴を表示した後、最後の2つのコミットを削除することにします。 git reset
勇敢に実行し、2人のコミットがコミット履歴から姿を消しました...しばらくして、これがバグであることに気付きました。貴重な変更を失い、パニックを始めました!
本当にゼロから始めなければなりませんか?必要なし。言い換えれば、落ち着いてgit reflog
を使用してください!
それでは、物事を台無しにして、実生活でこの間違いを犯しましょう。次の画像は、タワー(グラフィカルなGitクライアント)での元のコミット履歴を示しています。
2つのコミットを削除し、マスターブランチの最後の改訂版として、変更を変更し、タイトルコミット(ID:2B504BEE)を刻印したいと考えています。ハッシュIDをクリップボードにコピーしてから、コマンドラインでgit reset
使用して、そのハッシュ値を入力します。
$ gitリセット - ハード2b504bee
見て!提出物は消えました。さて、これがエラーであると仮定し、失われたデータを回復するためにリフェログを見てみましょう。ターミナルでジャーナルを表示するには、 git reflog
入力してください。
すべてのエントリが年代順に配置されていることに気付くでしょう。これは、最新のコミットが一番上にあることを意味します。そして、よく見ると、数分前に上部で致命的なgit reset
操作に気付くでしょう。
日記はうまくいくようです - それは良いニュースです。それでは、それを使用して最後のアクションを元に戻し、リセットコマンドの前に状態を復元しましょう。以前と同じように、クリップボードにハッシュID(この特定の例でE5B19E4)をコピーします。 git reset
再度使用できます。これは完全に機能します。しかし、この場合、古い状態に基づいて新しいブランチを作成します。
$ gitブランチハッピーエンドE5B19E4
グラフィカルGitクライアントをもう一度見てみましょう。
ご覧のとおり、以前に削除されたコミットでハッピーエンドと呼ばれる新しいブランチが作成されました。
別の例を見て、リフェログを使用してブランチ全体を復元しましょう。
次の例は、最初のシナリオに似ています。何かを削除します。今回はブランチ全体を削除します。クライアントやチームリーダーが機能ブランチを削除するように言うかもしれません。たぶんそれは自分自身を掃除するという考えかもしれません。さらに悪いことに、コミット(写真のC3)は他のブランチに含まれていないため、データを間違いなく失っています。
実際にこれを行い、後でブランチを復元しましょう。
feature/login
ブランチを削除する前に、それを残す必要があります。 (スクリーンショットに示されているように、それは現在のヘッドブランチであり、Gitでヘッドブランチを削除することはできません。)したがって、ブランチを(マスターに)切り替えて、 feature/login
を削除します。
わかりました…今、私たちのクライアントまたはチームのリーダーが彼の考えを変えたと仮定しましょう。結局のところ、 feature/login
ブランチ(コミットを含む)が必要です。私たちは何をすべきですか?
Gitの日記を見てみましょう:
$ git reflog 776f8ca(head-> master)head@{0}:チェックアウト:機能/ログインからマスターへの移動 B1C249B(機能/ログイン)head@{1}:チェックアウト:マスターから機能/ログインへの移動 [...]
私たちは再び幸運であることが証明されました。最後のエントリはfeature/login
からマスターに切り替える方法を示しています。前の状態に戻り、ハッシュID B1C249Bをクリップボードにコピーしてみましょう。次に、必要な状態に基づいて、 feature/login
という名前のブランチを作成します。
$ gitブランチ機能/ログインB1C249B $ git branch -vv 機能/ログインB1C249B IPRINTページのタイトルを変更します *マスター776F8CAタイトルと削除エラーページについて変更
素晴らしい - 支部は死から回復し、私たちが失われたと考える貴重なコミットも含めています。
タワーのようなデスクトップGUIでGitを使用する場合、エラーを入力するときにテキストエディターやワードプロセッサのようにCMD zを押すだけで最後のアクションを元に戻すことができます。
Gitのリフェログは本当の救世主になる可能性があります!ご覧のとおり、墓や枝全体から行方不明のコミットを削除するのは非常に簡単です。あなたがする必要があるのは、リフェログに正しいハッシュIDを見つけることです - 残りはケーキです。
高度なGITツールを掘り下げたい場合は、自由に(無料!)高度なGit Toolkitをチェックしてください。ブランチング戦略、インタラクティブなレベース、リフェログ、サブモジュールなどのトピックに関する短いビデオのコレクションです。
これは、CSS-Tricksの「Advanced Git」シリーズの最後の部分です。これらの記事を楽しんだことを願っています。ハッピーハッカー!
以上がリフェログを使用して失われたコミットを回復しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。