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
我认为这会返回我在新分支上需要的提交,但我不知道如何提取"提取"这些提交的分支。
答案 0 :(得分:1)
在分支上执行git过滤器分支。有关详细信息,请参阅https://git-scm.com/docs/git-filter-branch。查看--subdirectory-filter标志。我只是重读你的问题陈述,看起来你想过滤多个目录而不只是一个?如果是这样的话,看起来似乎不能使用--subdirectory-filter,因为你只能用它指定一个目录(并且看起来你可以多次指定--subdirectory-filter,一次用于每个不同的目录)。
答案 1 :(得分:0)
也许修补更适合您的需求。
使用以下命令创建补丁:
git diff origin/master HEAD -- <pathToDirectory>/ > changes.patch
然后制作你的分支,但是你计划,希望从一个共同的祖先提交,并应用补丁。 以下是diff和applying补丁的官方文档。通过这种方式,如果存在冲突,您可以轻松解决它们。
答案 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,但是当你回到其他目录时,请记得撤消它。