8

file があるとしますa.txt。ある日、私はそれを削除し、コミットし、プッシュしました。

翌日、最後のコミットを元に戻したいと思っていましたa.txt。を使用してみgit revertましたが、使用するとgit blame、すべての行に復帰コミット ハッシュが表示されます。元の責任履歴は失われます。

ファイルを復元して、ファイルの履歴を保持することはできますか? コミットがプッシュされたので、履歴を変更してはならないことに注意してください。

ありがとう!

4

3 に答える 3

7

あなたはこれを行うことができます!方法は次のとおりです。

  1. 元に戻す削除の前のコミットから新しいブランチを開始します。
  2. 問題のある変更を でマージしgit merge <sha> -s oursます。
  3. コミットに保持したい削除以外の変更があった場合:
    1. で変更を作業コピーに再適用しますgit diff <sha>^..<sha> | git apply
    2. 削除を破棄します (多くの手法が利用可能です。git checkout -pうまくいく可能性があります)。
  4. このブランチをメイン ブランチ (master など) にマージします。

これにより、2 つの分岐を持つ履歴が生成されます。1 つはファイルが削除されたもので、もう 1 つはファイルが削除されていないものです。その結果、git は-C -C -C. (実際、 を使用しても、ファイルは「復元」されません。なぜなら、新しいファイルが以前に存在したファイルのコピーとして-C -C -C作成されたことを git が認識しているためです。この手法を使用すると、同じファイルをリポジトリに再導入することになります。 )

于 2016-06-03T19:36:25.017 に答える
2

-Cオプションを 3 回指定して git Blame を実行します。

git blame -C -C -C

これによりgit blame、以前のコミットでファイルからコピーされたコンテンツが検索されます。

のドキュメントgit blameから:

-C|<num>|

に加えて-M、同じコミットで変更された他のファイルから移動またはコピーされた行を検出します。これは、プログラムを再編成し、コードをファイル間で移動する場合に役立ちます。このオプションを 2 回指定すると、コマンドはさらに、ファイルを作成するコミット内の他のファイルからのコピーを探します。このオプションを 3 回指定すると、コマンドは任意のコミットで他のファイルからのコピーを追加で検索します。

<num>オプションですが、Git がそれらの行を親コミットに関連付けるためにファイル間の移動/コピーとして検出する必要がある英数字の数の下限です。デフォルト値は 40 です。複数の-Cオプションが指定 されている<num>場合、最後の引数が-C有効になります。

于 2015-08-19T17:47:23.470 に答える
0

git resetの代わりに を使用して実行できますgit revertgit reset新しいコミットをドロップし、以前のコミットをチェックアウトします。すでに上流にプッシュしている場合、これはお勧めできません。

NAME
       git-reset - Reset current HEAD to the specified state

SYNOPSIS
       git reset [-q] [<tree-ish>] [--] <paths>...
       git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
       git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]

DESCRIPTION
       In the first and second form, copy entries from <tree-ish> to the index. In the third form, set the
       current branch head (HEAD) to <commit>, optionally modifying index and working tree to match. The
       <tree-ish>/<commit> defaults to HEAD in all forms.

すでにプッシュしているので:

  • その日にプルしたアクティブなコラボレーターがいない場合はgit reset、プッシュを使用して強制しgit push -fます。
于 2015-08-19T17:40:26.847 に答える