は、あなたの歴史は
$ 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
をファイルへの変更を保存しておきたいものです、あなたはa
とc
にすべての変更を破棄します。これを行う方法の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
チェック上記ツリーフィルターとある“マージベース、”のコンテンツにファイルa
とc
を復元し、。
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
+1優秀な答え。filter-branchを使用すると、あなたの頭を包み込むような素晴らしいツールになります。 – ralphtheninja
私はまだ消化しています。 'log --name-status'はすばらしいです。 –
Buh。私はこの優れた答えのすべてのステップに従っていました。フィルターブランチの終わりまですべてがうまく行きました。 "警告:Ref 'refs/heads/tmp'は変更されていません"。履歴を確認すると、ファイルの変更はまだ残っていますが、gitはそれらをすべて「書き直し」しているのに、コミットIDは変更されていません(私が知る限り)。うーん。 –