2016-03-12 63 views
2

我有一组提交,说从提交A到提交Z.该设置改变了存储库中的文件集。这就像是一系列尝试和失败的功能的发展历史。是`git diff`能够将diff应用于当前工作树吗?

现在我想清理历史,减少提交次数并从历史记录中删除错误的尝试。我想保留当前的开发分支,并在另一个分支中创建清理历史记录,例如feature-rc1。稍后,这个分支将被合并到上游存储库中。

所以我的计划是对文件file1.cpp进行所有更改并将这些更改应用于feature-rc1分支的工作树。然后我会和file2.cppfile3.cpp一样。然后我提交更改并继续处理其他文件和提交。因此,我的基本操作是这样的:

git diff A Z -- file1.cpp >temp.diff 
patch -P1 <temp.diff 
git diff A Z -- file2.cpp >temp.diff 
patch -P1 <temp.diff 
git diff A Z -- file3.cpp >temp.diff 
patch -P1 <temp.diff 
git commit -a -m "commit" 

我的问题是,如果有可能避免使用临时差异文件和外部工具诸如patch?如果git diff具有将差异结果应用于当前工作树的内置功能,或者存在具有相同功能的另一个git命令,那将会非常好。

更新:我认为这是可能避免的临时文件是这样的:

git diff A Z -- file1.cpp | patch -P1 

但是,这将是巨大的,避免patch太:

git diff A Z -- file1.cpp | git ???? 

什么来代替在那里的

+1

听起来像你在谈论压扁提交? –

+0

是的,这是挤压,但在每个文件的基础上。 –

+5

您正在查找的命令是'git apply'。 (另请参阅'git am',但'am'则用于完整提交,而不是单个文件。)如前所述,南瓜可能更合适(和/或'git cherry-pick -n')。 – torek

回答

0

因此,我的问题的最佳答案在@torek评论中提供。 答案是git apply命令可以将git diff的输出应用于工作树。

1

如果要应用更改,应使用git format-patch命令生成补丁,然后使用git apply将它们应用于所需的分支/项目。

enter image description here

一旦你的补丁使用git amgit apply的补丁添加到所需分支/项目。


git-apply - 应用一个补丁文件和/或指数
git-am - 从邮箱中应用了一系列的补丁

0

这是可能的通过差异和修补来完成此操作,但这对git rebase -i

如果A..Z是你想要的工作,用git rebase A^ Z提交的范围内,那么所有的线路切换到edit,并使用如git reset <files>git checkout -- <files>命令只保留你想要的改变。

然后,我会做第二遍git rebase -i做任何必要的压扁,如果不明显的话第一遍要做什么。

+0

是的,我知道关于互动式底座。但在我的情况下有两个注意事项: 1.它用新的历史替换现有历史(不确定是否有可能不替换现有历史) 2.这是手动过程。我反而想创建一个shell脚本,以便能够生成RC1,RC2等 –

+0

呃,您也可以用其他任何方法替换历史记录......旧的提交仍然可以在reflog中看到。 – o11c