2012-03-17 5 views
11

私は20個ほどのコミットを持つちょっとしたブランチを持っていて、マスターへのマージの準備をしています。私はそれをマスターから取り除いて、もっと見ると、このブランチとはまったく無関係で、コミットする準備ができていない方法でファイルが変更されていることを認識しています。これらのファイルへの変更は、特定のコミットに限定されません。Git:1つのブランチに対して特定のファイルからすべての変更を削除する最も良い方法

基本的に、可能であれば、このブランチに含めるファイルとは関係がありません。これについては良い方法がありますか?私の後ろ向きのポジション#1は明らかに、それらのファイルの最新のコピーをコピーしてコミットするだけです。しかし、歴史にはまだ変更が含まれており、Git Godsは私の上を睨みます。

フォールバックポジション#2は同じことを行い、ブランチ履歴全体を1つのコミットに縮小します。

これらの改善点はありますか?

答えて

16

は、あなたの歴史は

$ git lola 
* 6473d7f (master) Update 
| * 9bcfa7e (HEAD, topic) Munge a, b, and c 
| * 99af942 Munge b and c 
| * 8383e2c Munge a and b 
|/ 
* d1363f4 Baseline
であると言う:-)

注:lolaは、標準ではありませんが参考になるエイリアスです。

コミットによって3つの異なるファイルが変更されました。

$ git log --decorate=short --pretty=oneline --name-status topic 
9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (HEAD, topic) 
M  a 
M  b 
M  c 
99af942dbb922effcad8a72e96bec9ee9afcc437 Munge b and c 
M  b 
M  c 
8383e2c8d6092550fec13d3c888c037b3a68af15 Munge a and b 
M  a 
M  b 
d1363f4fba67d94999b269b51bdb50a8a68ba27a Baseline 
A  a 
A  b 
A  c

bをファイルへの変更を保存しておきたいものです、あなたはacにすべての変更を破棄します。これを行う方法の1つはgit filter-branchです。 topic離れmasterから分岐コミットれる

名前付き範囲内のコミットアウト
$ git checkout -b tmp topic 
Switched to a new branch 'tmp' 

$ git merge-base topic master 
d1363f4fba67d94999b269b51bdb50a8a68ba27a 

$ git filter-branch --tree-filter 'git checkout d1363f -- a c' master..tmp 
Rewrite 8383e2c8d6092550fec13d3c888c037b3a68af15 (1/3) 
Rewrite 99af942dbb922effcad8a72e96bec9ee9afcc437 (2/3) 
Rewrite 9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (3/3) 
Ref 'refs/heads/tmp' was rewritten 

チェック上記ツリーフィルターとある“マージベース、”のコンテンツにファイルacを復元し、。

tmpはすべてtopic ’が変更されました。bに変更されますが、他のファイルは変更されません。安全対策として

$ git log --decorate --pretty=oneline --name-status tmp 
9ee7e2bd2f380cc338b0264686bcd6f071eb1087 (HEAD, tmp) Munge a, b, and c 
M  b 
226c22f150af1ddc1f9adc19f97fc4f220851ada Munge b and c 
M  b 
45e706f7b22c37ee2025ee0d04c651135e7b31cd Munge a and b 
M  b 
d1363f4fba67d94999b269b51bdb50a8a68ba27a Baseline 
A  a 
A  b 
A  c

git filter-branch店オリジナルの参照のバックアップ。あなたは’変更内容に満足し、バックアップtmpを削除する再、

$ git update-ref -d refs/original/refs/heads/tmp
+3

+1優秀な答え。filter-branchを使用すると、あなたの頭を包み込むような素晴らしいツールになります。 – ralphtheninja

+0

私はまだ消化しています。 'log --name-status 'はすばらしいです。 –

+0

Buh。私はこの優れた答えのすべてのステップに従っていました。フィルターブランチの終わりまですべてがうまく行きました。 "警告:Ref 'refs/heads/tmp'は変更されていません"。履歴を確認すると、ファイルの変更はまだ残っていますが、gitはそれらをすべて「書き直し」しているのに、コミットIDは変更されていません(私が知る限り)。うーん。 –

0

変更を加えて機能を新しいコミットとして削除し、そこからパッチを作成することができます。 、あなたのリベース/押しつぶしたり何でもあなたが戻ってマスターにマージするために準備する必要がありますあなたが戻っての新機能を追加したいときに、あなたは私がしました

git apply -R 

注意してリバースモードでパッチを適用することができます理論的にはうまくいくはずです。あなたはsha1は、ファイルをになりたい、そのバージョンのユニークなsha1ハッシュである git checkout <sha1> <file> を行うことができます特定のバージョンにチェックアウトする

0

+0

右を実行すると、それは基本的に私のフォールバック位置#1です... –

関連する問題