Git - 忽略前几次提交但将其他后续提交推送到分支

时间:2014-05-21 11:30:39

标签: git branch

我经常发现自己处于克隆存储库,创建本地分支然后必须进行一些初始设置工作(这会更改某些文件)的情况,然后才能继续执行我想要稍后推送的实际更改。

例如:我克隆了一个Visual C ++项目并创建了本地分支。现在我必须更改include和lib目录以正确引用libboost。这会更改.vcxproj文件,但这显然是我不想发送回origin/master的更改。只有后续更改才是真正的变化。

我考虑使用git update-index --assume-unchanged <file>,但这会忽略整个文件,因此它排除了我想要提交的文件的其他更改的可能性。

有什么解决方案? git rebase可能是解决方案吗?

3 个答案:

答案 0 :(得分:2)

是的,很可能git rebase就是你想要的。

有很多方法可以做到这一点。一种方法是从您不想发送的更改开始,然后在完成后使用git rebase --interactive,这样您就可以重新排序提交并将这些不相关的更改放在最后。

类似的东西:

  • 项目变更(项目)
  • 修复2(修正)
  • 修复1
  • 上次提交(主)

我手动添加分支名称(主,修复和项目),但您可以在没有分支的情况下执行此操作。例如,如果您想推送&#39;项目的所有提交。分支作为修复&#39;分支,除了最后一个分支,即使你没有本地分支,你可以这样做:

git push origin project^:fixes

另一个选择是建立一个永久性项目&#39;对本地更改为&#39; .vcproj.default&#39;的分支,然后让您的其他分支基于它:

  • 修复2(修正)
  • 修复1
  • 项目变更(项目)
  • 上次提交(主)

完成“修复”后#p>分支,您可以在推送之前重新分支您的分支:

git rebase --onto master project fixes

这基本上会选择来自&#39;项目&#39;的提交。修复&#39; (&#34;修复1&#34;和&#34;修复2&#34;),并将它们重新放在master之上,基本上删除了&#34;项目更改&#34;从分支机构提交。

答案 1 :(得分:1)

我不确定我是否正确地提出了您的问题,但我认为将包含本地设置的配置文件直接放入存储库并不是一个好主意。相反,我会添加一个文件,让我们说.vcproj.default到存储库,其中包含所有设置的默认定义。克隆存储库后,您只需

cp .vcproj.default .vcproj 

然后更改您需要的设置。文件.vcproj本身我将使用.gitignore文件排除。

答案 2 :(得分:1)

过滤器可以使过程无痛。 Here's the basic idea,您可以保存上游的当前值并在结帐时将其替换为您的值,并保存当前值并在检查时将其替换为上游值。您能否提供一些想要避免泄漏的变更样本?