1

履歴をクリーンアップするために git rebase --interactive をよく使用します。マージ競合が発生するか、競合がなくてもマージが発生します。コミットの順序を変更したり、押しつぶしたりしただけなのに、何かが変わったのではないかといつも少し怖がっています。

以前は、作業ツリーのバックアップ コピーを保持して、新しいツリーに貼り付けていました。次に、gitg のコミット ウィンドウを調べて、すべてが同じかどうかを確認しました。これは面倒ですが、バックアップ コピーを作成するのをやめました。

次に、バックアップ ブランチを作成したところ、それがgit diff backup-branch機能することがわかりました。

今私は試しました:(バックアップブランチの作成もやめたいので)

git --diff HEAD ORIG_HEAD

しかし、それは変更を示しています。作業ディレクトリのファイルを見ると、変更されていないように見えます。

このシナリオの正しいコマンドは何ですか?

4

2 に答える 2

2

この場合、対話型リベースはチェックアウトを実行することから始まり、何らかの理由で ORIG_HEAD がチェックアウトに設定されます。実際には、リベースがそのチェックアウトを行う前に HEAD であったコミットと比較したいと考えています。reflog で見つけることができます。

git reflog

先頭に最も近いチェックアウトを探し、次の行のコミットと比較します。reflog が次のようになっている場合:

ec4bd97 HEAD@{0}: rebase -i (finish): returning to refs/heads/big_cat_branch
ec4bd97 HEAD@{1}: rebase -i (fixup): Divide the bug class into modules
5d62142 HEAD@{2}: rebase -i (fixup): updating HEAD
c28c562 HEAD@{3}: checkout: moving from big_cat_branch to c28c562
7f6bc0e HEAD@{4}: commit: Fix bug related to big cats.

次に、次のように差分します。

git diff HEAD 7f6bc0e

また

git diff HEAD HEAD@{4}

また、インタラクティブなリベースによってコード内の何かが実際に変更されない限り、出力は期待できません。

reflog からそのエントリを取得できればいいのですが、ORIG_HEAD が指すコミットを取得し ( with git rev-parse ORIG_HEAD)、reflog でそれを grep し、次を確認する以外に簡単な方法はわかりません。ライン。それを行うスクリプトを作成することもできますが、手動で見つけるのは難しくありません。

(ORIG_HEAD^ が必要なものを提供すると思うかもしれませんが、ローカルの reflog ではなく、コミット履歴で ORIG_HEAD より前のコミットが得られます。後者が必要です。)

于 2012-05-18T18:36:07.583 に答える
0

私は個人的に好きgit log -pです。マージを含むすべてのコミットの差分を表示します。

于 2012-05-18T16:37:23.763 に答える