我有一个混乱的分支,有20个左右的提交,我正准备合并回主人。我已经把它从主人那里重新定位,并且仔细观察,我意识到有些文件正在以与这个分支完全无关的方式进行修改,而且还没有准备好提交。对这些文件的更改不仅限于特定的提交。
所以基本上,如果可能的话,我不想要将这些文件包含在这个分支中。有没有好办法解决这个问题?我的后退位置#1显然只是复制每个文件的最新副本然后提交。但是历史仍然会包含变化,而Git Gods会对我不满。
退回位置#2是做同样的事情,然后将整个分支历史记录压缩到一次提交。
对这些进行了哪些改进?
答案 0 :(得分:17)
说出你的历史
$ 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
是非标准但有用的别名。
提交修改了三个不同的文件。
$ 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
的所有更改。一种方法是使用git filter-branch
。
$ 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
恢复到“合并基础”的内容,即{{1}的提交}远离topic
。
现在master
对tmp
进行了所有topic
次更改,但对其他任何文件都没有更改。
$ 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
作为安全措施,b
会存储原始参考的备份。如果您对更改感到满意并想要删除备份git filter-branch
,请运行
$ git update-ref -d refs/original/refs/heads/tmp
答案 1 :(得分:0)
要结帐到特定版本,您可以执行此操作
git checkout <sha1> <file>
其中sha1
是您希望文件所在的版本的唯一sha1哈希值。
答案 2 :(得分:0)
我遇到了一些Windows用户的问题:
以下是我的命令结束的方式:
git filter-branch -f --tree-filter "git checkout a59f75 -- source/_posts/blog1.md source/_posts/blog2.md" master..tmp
答案 3 :(得分:-1)
您可以进行更改以删除新提交的功能,然后从中创建修补程序。做你的变基/挤压或者你需要做什么准备合并回主人,然后当你想重新添加新功能时,你可以用反向模式应用补丁
git apply -R
注意我从来没有这样做过......但我认为它应该在理论上起作用。 : - )