Git:从一个分支的给定文件中删除所有更改的最佳方法

时间:2012-03-17 17:03:58

标签: git git-rebase git-merge git-branch

我有一个混乱的分支,有20个左右的提交,我正准备合并回主人。我已经把它从主人那里重新定位,并且仔细观察,我意识到有些文件正在以与这个分支完全无关的方式进行修改,而且还没有准备好提交。对这些文件的更改不仅限于特定的提交。

所以基本上,如果可能的话,我不想要将这些文件包含在这个分支中。有没有好办法解决这个问题?我的后退位置#1显然只是复制每个文件的最新副本然后提交。但是历史仍然会包含变化,而Git Gods会对我不满。

退回位置#2是做同样的事情,然后将整个分支历史记录压缩到一次提交。

对这些进行了哪些改进?

4 个答案:

答案 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的更改是您要保留的内容,并且您要放弃对ac的所有更改。一种方法是使用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

上面的树过滤器检出指定范围内的提交,并将文件ac恢复到“合并基础”的内容,即{{1}的提交}远离topic

现在mastertmp进行了所有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用户的问题:

  1. 使用双引号执行--tree-filter命令。
  2. 对文件路径使用正斜杠。
  3. 不要使用正斜杠启动文件路径。
  4. 以下是我的命令结束的方式:

    git filter-branch -f --tree-filter "git checkout a59f75 -- source/_posts/blog1.md source/_posts/blog2.md" master..tmp
    

答案 3 :(得分:-1)

您可以进行更改以删除新提交的功能,然后从中创建修补程序。做你的变基/挤压或者你需要做什么准备合并回主人,然后当你想重新添加新功能时,你可以用反向模式应用补丁

git apply -R

注意我从来没有这样做过......但我认为它应该在理论上起作用。 : - )