13

8 つのコミットと 1 つのブランチ (マスター) の線形 git 履歴があるとします。

1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> [8=master]

master を 4 に移動したい (これは で実行できますgit branch -f master 4):

1 -> 2 -> 3 -> [4=master] -> 5 -> 6 -> 7 -> 8

これで作業ツリーは状態 4 になりました。

4 -> 8からの変更を作業ツリーにパッチとして適用したいと考えています。

つまり、.git フォルダーの状態に影響を与えずに、4->8ステージングされていない変更を作業ツリーに適用したいと考えています。この後、作業ツリーは状態 8 になりますが、コミットされた状態とマスター ブランチは状態 4 になります。

別の言い方をすれば、master を 4 に移動したふりをして、4 から 8 への変更をインデックスに追加せずに作業ツリーに手動で加えました。結果は同じになるはずです。

これを行う最も簡単な方法は何ですか?

4

5 に答える 5

16

私はパーティーに遅れていることを知っていますが、他の人の参考のために、最も簡単な方法は次のとおりだと思います。

git cherry-pick --no-commit 4..8

于 2014-10-28T21:34:25.463 に答える
5
git format-patch 4..8 | xargs git apply

[編集: 以下のコメントの次のものは、個々のパッチ ファイルの作成をスキップします]

git diff 4..8 | git apply
于 2013-01-09T22:58:10.027 に答える
2

あなたの場合、実際に「ステージングされていない」ビットを気にしないのであれば、おそらく最も簡単なことは

git checkout 8 -- .

これにより、コミット履歴を変更せずに、ツリーとインデックスがコミット8のものと一致するように更新されます。git resetその後、インデックスの変更を破棄できます。

本当にインデックスファイルを邪魔されないようにしたい場合は、gitが常にインデックスから作業ツリーを更新するため、少し複雑になります。あなたは次のようなことをすることができます

GIT_INDEX_FILE=/tmp/foo git checkout 8 -- .

/tmp/fooこれにより、このコマンド専用の一時インデックスファイルとしてパスが使用されます。その後、このファイルを削除することをお勧めします。


実際にはコミット8の正確な状態に戻らないパッチを再適用する必要があるより複雑な状況ではgit cherry-pick --no-commit commit1 commit2 ...、コミットを順番に適用するために使用できます。もちろん、これでもインデックスは変更されます。

于 2013-01-09T22:47:42.903 に答える
0
 git checkout master@{1} -- .

は、あなたが必要とすることすべてです。「マスターが1回前に指していたコミットのファイルをチェックアウトする」と表示されます。チェックアウトgit reflogして、これがどのように機能するかを確認してください。

また、あなたがしたように強制的にブランチを作り直すべきではありません。これにより、マスターが指していたすべての場所を git が追跡できるようになります。使用する

git stash -u 

作業ディレクトリに作業がある場合。それで

git reset --hard master^^^^

また

git reset --hard master~4
于 2013-01-10T00:08:36.867 に答える
0
git cherry-pick master~4 master~5 master~6 master~7 master~8

ただし、作業ツリーはきれいにする必要があります

git help cherry-pick
于 2014-09-05T15:27:18.767 に答える