壊滅的なコード損失を防ぐ、十分に活用されていない Git セーフティ ネット

in tech

git は、マシンにインストールされているコマンドの中で最も複雑なコマンドの 1 つであると言っても過言ではありません。 (バージョン 2.55 では) 180 を超えるサブコマンドがあるため、試したことはおろか、聞いたこともないサブコマンドが 1 つまたは 2 つあるはずです。

reflog サブコマンドもその 1 つです。これを使用すると、致命的なあらゆる種類の間違いから回復できますが、おそらく使用されていないでしょう。ただし、簡単な導入と少量の練習により、コマンド 1 つでこのセーフティ ネットを展開し、災害を回避できるようになります。

git reflog: git log に似ていますが、すべてに対応します

このサブコマンドは、以前のすべてのローカル アクションの記録を明らかにします。

Git は、ユーザーの行動すべてを記録するという印象を与えることがありますが、ほとんどの場合、これは非常に正確です。しかし、標準の git ログではすべてがわかりません。さらに詳しく知るにはどこに行けばよいでしょうか?リブログ。

git log と git reflog からはまったく異なる出力が得られる可能性があるため、両者の違いを理解することが重要です。ローカル マシン上の単純な 1 回コミットのリポジトリの場合、2 つは基本的に同じです。

初期コミットを表す 1 つのアクションを示す git reflog コマンド。

ただし、リモートからクローンを作成したはるかに古いリポジトリでは、大きな違いが見られます。

新しくクローン作成されたリポジトリで git reflog コマンドを実行すると、リポジトリに何千ものコミットがある場合でも、エントリは 1 つだけ表示されます。

ここで何が起こっているのかというと、git log には現在のコミットから到達可能なコミットの履歴が表示されています。一方、git reflog は、ローカル リポジトリ内の参照アクションのログを表示します。アクションには、コミット、マージ、リベースなどがあります。クローン作成やアップストリームからのプルなど、リモートとの対話も含まれます。

基本的な git reflog コマンドはデフォルトの短縮形です git reflog ショー サブコマンド。これは実際には、への特定の呼び出しと同義です。 git ログ、つまり:

git log --walk-reflogs --abbrev-commit --pretty=oneline

ここ、 –walk-reflogs コミットの代わりに reflog エントリを表示します。 –pretty=ワンライン 各エントリを 1 行に表示します。 –abbrev-コミット はるかに短いコミット ID (たとえば、「771eb26cc738ab21d9d4e3ec7e3b27c51fb0fa56」の代わりに「771eb26」) が生成されます。しかし、「reflog」はそれらすべてよりもはるかに覚えやすく、メンテナンス用の追加のサブコマンド (list、delete、expired など) がいくつかあります。

–abbrev=n を使用して最小長を指定すると、コミット ハッシュをさらに短くすることができます。デフォルトでは 7 ですが、4 まで短くすることもできます。

例: 修正を取り消す

適切な探偵ツールを使用して潜在的な大惨事から回復する方法

Git の reflog コマンドは、サーバーにプッシュされなかったローカル アクションへのアクセスを提供するため、非常に便利です。これらはローカル マシン以外に記録がないため壊れやすいです。 reflog コマンド自体は回復を行いませんが、他の方法では回復できない可能性があるコミットの SHA1 ハッシュを明らかにすることで回復を可能にします。

データ損失につながる可能性のある一般的な例として、変更の修正を考えてみましょう。使用する git commit –amend、最後のコミットを変更して、そのメッセージを書き換えたり、それに含まれるファイルの変更を変更したりすることができます。たとえば、修正が必要なタイプミスをすぐに見つけることができます。

git add .
git commit -m 'bug fix for #672'
git commit --amend -m 'bug fix for #673'

これは素晴らしい機能ですが、バックグラウンドで何が起こっているかに注意する必要があります。 –amend を使用すると、git は以前のコミットを置き換える新しいコミットを作成します。次のようなことから始めると:

2 つの先祖を持つコミットを指すメイン ブランチを指す HEAD 参照を示す図。

最終的には、古いコミットの代わりに新しいコミットが作成され、それ自体は到達不能のままになります。

2 つの先祖を持つコミットを指すメイン ブランチを指す HEAD 参照を示す図。別の到達不能なコミットが存在します。これは、以前は同じ 2 つの祖先を持っていました。

ただし、この状況では、修正したものの後で修正するつもりはなかったと判断した場合に、git reflog を使用すると、失われたコミットを見つけるのに役立ちます。まず、実行してください git reflog そして、失われたコミットの SHA1 ハッシュを特定します。

git reflog コマンドは 4 つのアクションを示しており、そのうちの 1 つは修正されたコミットです。

SHA1 (117ed62) を入手したら、git-checkout を使用して変更を元に戻すことができます。

git checkout 117ed62

git log は、元の 3 つのコミットを修正せずに報告するようになったことに注意してください。

元に戻されたコミットを示す git log コマンド。

一方、 git reflog は以前よりもさらに多くの情報を生成します。

git reflog コマンドは、3 つのコミット、修正されたコミット、および元に戻されたコミットを表示します。

reflog 識別子の使用

ほとんどのコマンドはコミット ID の代替をサポートしています

多くの git コマンドは、git log 3dde11f など、SHA1 ハッシュを使用してコミット ID を識別します。ただし、 git reflog は、HEAD@関連情報は以下のリンクからご確認いただけます などの相対 ID を各アクションと一緒に出力します。これらの ID を使用すると、単なるコミット ID よりも詳細な粒度で特定のアクションを識別できます。

reflog ID は、diff、log などの多くの git コマンドで使用できます。git log と一緒に使用すると、reflog と同じように、他の方法では到達できないコミットを明らかにすることができます。 @ の前のプレフィックスを省略すると、デフォルトで現在のブランチが使用されます。

長いログで reflog ID を探している場合は、次を使用してみてください。 git reflog –oneline –no-decorate。 –no-decorate オプションを使用すると、reflog がブランチやタグなどの参照にラベルを付けることがなくなり、ID が整列して読みやすくなります。


reflog サブコマンドは究極の回復ツールです

reflog は直接何も回復しませんが、他の git ツールやコマンドを介してそれを行うことができます。到達不能なコミットの SHA1 を使用すると、当時はそれがどれほど破壊的であるように見えたとしても、ほとんどすべての git アクションから回復できます。

詳しい情報を見る

詳しい情報を見る

関連記事

前の投稿
過去に残すべきCDに関する5つの誤解
次の投稿
この無料アプリは、Adobe が月額 20 ドル請求するものと同じものを提供します

関連記事