21

そのコミットをHEADコミットとして設定せずに、git作業コピーのファイルを特定のコミットに復元したいと思います。

特定のコミットにチェックアウトをgitすると、切り離されたHEADを取得し、変更をコミットした後、コミットツリーは次のようになります。

A
|
B
|
C  
| \
D  E

私が取得したい動作は次のとおりです。

A
|
B
|
C
|
D
| <- git command so my files are restored to C, but my HEAD still points to D
E

ありがとう

4

3 に答える 3

25

これはそれを行う必要があります:

git reset --hard C
git reset --soft D

まずHEAD、、インデックス、およびワークツリーをにリセットしCます。次に、(「 ?の実際の使用法で説​​明されているように、のみ)
をにリセットします。HEADHEADgit reset --softD

この時点でコミットすると、コンテンツを含む新しいコミットが作成され、のようCに置き換えDられることに注意してください。 それは歴史を変え、単純なものと大差ありません。D'C
git reset --hard C

別のオプションがgit revert C上に表示されますが、履歴DDは引き続き表示されます。これは、望ましくない場合があります。

于 2012-12-16T01:31:15.833 に答える
23

VonCの回答では、往復を行う必要があります。1つの「gitcheckout」で同じことを達成できます

git checkout C ./

指定する必要があることに注意してください。./そうしないと、gitは指定されたブランチまたはコミットを実際にチェックアウトします。

于 2015-08-01T01:31:50.883 に答える
6

このための配管コマンド(この種のスクリプトを作成する人向け)は次のとおりです。

git read-tree C
git checkout-index -f -a

なんらかの理由で理解できませんが、スクリプトからこれを実行すると、上記のコマンドの後に次のことも実行する必要があります。そうしないと、パッチがインデックスに適用されないというエラーが発生します。

git update-index -q --refresh
于 2016-12-22T15:35:12.900 に答える