说你的历史是
$ git lola
* 6473d7f(大师)更新
| * 9bcfa7e (HEAD, topic) Munge a, b, and c
| * 99af942 芒格 b 和 c
| * 8383e2c 芒格 a 和 b
|/
* d1363f4 基线
注意:lola 是一个非标准但有用的别名。
提交修改了三个不同的文件。
$ git log --decorate=short --pretty=oneline --name-status 主题
9bcfa7e946a92c226ad50ce430a9e4ae55b32490(头,主题)
嘛
甲乙
麦克
99af942dbb922effcad8a72e96bec9ee9afcc437 芒格 b 和 c
甲乙
麦克
8383e2c8d6092550fec13d3c888c037b3a68af15 芒格 a 和 b
嘛
甲乙
d1363f4fba67d94999b269b51bdb50a8a68ba27a 基线
一个
乙
一个c
对文件b 的更改是您想要保留的,并且您想要放弃对a 和c 的所有更改。一种方法是使用git filter-branch。
$ git checkout -b tmp 主题
切换到新分支 'tmp'
$ git 合并基础主题大师
d1363f4fba67d94999b269b51bdb50a8a68ba27a
$ git filter-branch --tree-filter 'git checkout d1363f -- a c' master..tmp
重写 8383e2c8d6092550fec13d3c888c037b3a68af15 (1/3)
重写 99af942dbb922effcad8a72e96bec9ee9afcc437 (2/3)
重写 9bcfa7e946a92c226ad50ce430a9e4ae55b32490 (3/3)
Ref 'refs/heads/tmp' 被重写
上面的树过滤器检查命名范围内的提交并将文件a和c恢复到“合并基础”的内容,即topic从@987654331分支的提交@。
现在tmp 拥有topic 对b 的所有更改,但没有任何其他文件的更改。
$ git log --decorate --pretty=oneline --name-status tmp
9ee7e2bd2f380cc338b0264686bcd6f071eb1087 (HEAD, tmp) 芒格 a、b 和 c
甲乙
226c22f150af1ddc1f9adc19f97fc4f220851ada Munge b 和 c
甲乙
45e706f7b22c37ee2025ee0d04c651135e7b31cd 芒格 a 和 b
甲乙
d1363f4fba67d94999b269b51bdb50a8a68ba27a 基线
一个
乙
一个c
作为一项安全措施,git filter-branch 存储您原始参考的备份。当您对更改感到满意并想要删除备份 tmp 时,运行
$ git update-ref -d refs/original/refs/heads/tmp