"提取"来自目录下的提交的分支

时间:2016-06-28 18:17:17

标签: git

git中是否有办法创建只包含影响目录的提交的分支?

例如,给定如下的repo(commit,commit' s patch,branch):

g  dir3/file33 (develop)
f  dir1/file12
e  dir2/file22
d  dir2/file21
c  dir1/file11
b  dir3/file32 (master)
a  dir3/file31

创建一个如下所示的分支:

f' dir1/file12 (feature dir1)
c  dir1/file11
b  dir3/file32 (master)
a  dir3/file31

到目前为止,我已经考虑过做类似的事情:

git log --right-only --cherry-pick master...develop -- dir1

我认为这会返回我在新分支上需要的提交,但我不知道如何提取"提取"这些提交的分支。

4 个答案:

答案 0 :(得分:1)

在分支上执行git过滤器分支。有关详细信息,请参阅https://git-scm.com/docs/git-filter-branch。查看--subdirectory-filter标志。我只是重读你的问题陈述,看起来你想过滤多个目录而不只是一个?如果是这样的话,看起来似乎不能使用--subdirectory-filter,因为你只能用它指定一个目录(并且看起来你可以多次指定--subdirectory-filter,一次用于每个不同的目录)。

另请参阅https://github.com/slobobaby/git_filter

答案 1 :(得分:0)

也许修补更适合您的需求。

使用以下命令创建补丁:

git diff origin/master HEAD -- <pathToDirectory>/ > changes.patch

然后制作你的分支,但是你计划,希望从一个共同的祖先提交,并应用补丁。 以下是diffapplying补丁的官方文档。通过这种方式,如果存在冲突,您可以轻松解决它们。

答案 2 :(得分:0)

L"\??\"就是您所需要的。

由于某些版本的Git可以立即使用;在旧版本中,它是&#34; contrib&#34;中的一个脚本。 Git发行版的目录。

答案 3 :(得分:0)

如果您正在为他们所做的更改选择提交,那么您需要rebase或cherrypick。对于这个,看起来像cherrypick将是最简单的。

git checkout -b feature/dir1 master
git cherry-pick $(git rev-list --reverse master..develop -- dir1)

是一种简单的方法,它不会注意到它可以快速转发你的提交c,但这真的很重要吗?如果是这样,只需在上面的c中交换master的id,但是当你回到其他目录时,请记得撤消它。