2013-01-09 16 views
7

は私が8つのコミットし、一方の分岐(マスター)の線形Gitの歴史を持っていると仮定します。作業ツリーにgitコミットを適用せずに追加しましたか?

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

私は(私はgit branch -f master 4を行うことができます)4にマスターを移動したい:

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

作業ツリーは状態4にあります。4 -> 8の変更をパッチとして自分の作業ツリーに適用したいと考えています。

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

もう一つの方法:マスターを4に移動した直後に、私は4-> 8インデックスに追加することなく作業ツリーに追加することができます。結果は同じでなければなりません。

これを行う最も簡単な方法は何ですか?あなたが実際に「unstaged」ビットを気にしない場合は、あなたの場合は

答えて

1

は、最も簡単な方法は、おそらく

git checkout 8 -- . 

これはコミット8のそれと一致するように、あなたのツリーとインデックスを更新しますですコミット履歴を変更することなくインデックスの変更を破棄するには、git resetを入力します。

本当にインデックスファイルをそのままにしたい場合、gitは常に作業ツリーをインデックスから更新するので、やや複雑です。あなたは、このコマンドのための一時的なインデックスファイルとしてパス/tmp/fooを使用します

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

このような何かを行うことができます。その後、このファイルを削除することができます。あなたが実際に戻ってコミット8の正確な状態にあなたを持っていないでしょう、あなたが順序でコミットを適用するためにgit cherry-pick --no-commit commit1 commit2 ...を使用することができ、パッチを再適用したい、より複雑な状況では


。これにより、もちろん索引が変更されます。

3
git format-patch 4..8 | xargs git apply 

[編集:個々のパッチファイルを作るスキップ以下のコメントから、この次の1]

git diff 4..8 | git apply 
+1

また、 'git diff 4..8 | git apply' – cmbuckley

+0

私はあなたの方が好きです。 – jthill

0
git checkout [email protected]{1} -- . 

はあなたが必要とするすべてです。これは、 "マスタが一度前に指していたコミット"ファイルをチェックアウトします。これがどのように動作するかは、git reflogを確認してください。

また、実行したときと同じように、ブランチを強制的に再作成するべきではありません。これにより、gitは、先に指し示していたすべての場所を追跡することができます。あなたが職場に何か仕事をしている場合は、

git stash -u 

をご利用ください。その後

git reset --hard master^^^^ 

または

git reset --hard master~4 
+0

_ "これは、マスターが指していたすべての場所を追跡できるようになります。" - どういう意味ですか?あなたはこの追跡についてもう少し説明できますか? –

+0

彼は、変更をunstagedに適用したいと述べました。チェックアウトはそれらを舞台にするでしょう。 – jthill

0
git cherry-pick master~4 master~5 master~6 master~7 master~8 

作業ツリーがクリーンである必要がありますけれども、私は他の人が参考のために、私はパーティーに遅れてんだけど、知っている

git help cherry-pick 
11

、I最も単純な方法は単純であると思う:

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

+1

これに続いて 'git reset'を実行して、変更をunstagedします。 –

関連する問題