仅将特定文件移动到新分支

时间:2017-02-22 23:00:07

标签: git github

我有branch1有10个文件,而创建新分支作为branch2,我想只选择四个文件到新分支。

是否可以在git中,因为在创建新分支时?

2 个答案:

答案 0 :(得分:8)

创建新分支,删除该分支中的所有文件,从另一个分支检索一些文件并提交更改:

# create a new branch
git checkout -b branch_name
# remove all files for this branch
git rm -rf .
# retrieve some files from master branch
git checkout master -- file1 file2 file3 file4
# commit changes
git commit -m "create new branch"

答案 1 :(得分:6)

您可以查看What exactly do we mean by "branch"?分支名称仅仅是指针,指向特定的提交。每个提交都包含一个快照,其中包含创建快照时索引中的任何内容。 (每个提交也“回退”到它的父提交,当然还有一个作者,提交者和提交消息。)

首先创建一个新的提交写出索引,然后写一个提交,引用保存的索引(一个对象),并返回当前,或者HEAD,提交。最后,通过将其ID写入分支名称,新提交将成为当前/ HEAD提交。然后,分支名称指向最新的提交(HEAD文件仅包含分支名称;它是指向提交的分支名称。

如果您希望新提交包含一些特定的文件集,则应将这些文件添加到索引中并从索引中删除任何其他文件。索引中的任何内容都将成为您进行的下一次提交的快照内容。

要立即查看索引中的内容,请运行git ls-files。对于更详细/详细的输出,使用git ls-files --stage,它显示哪些索引槽(在冲突的合并期间可能有多个索引槽;但是其他所有内容都在槽0中)也被占用。

Bertrand Martel's answer一样,您可以使用git checkout将文件复制到索引中:

git checkout <commit-specifier> -- <path> [ <path> ... ]

从指定的提交复制每个<path>的文件 - 分支名称指向该分支上的提示提交,但您可以使用gitrevisions中的任何内容 - 进入索引,然后从索引进入工作树。

您还可以通过从工作树中获取文件将文件复制到索引中:

git add <path> [ <path> ... ]

这会将给定路径中工作树中的任何内容复制到索引中(特别是在插槽零中,消除任何其他插槽,这就是解决合并冲突的原因)。

要从索引中删除文件,请使用git rm,类似于git add。但请注意,这会将其从 索引工作树中删除;要仅从索引中删除,请使用git rm --cached

对于复杂的脚本操作,您可以使用git update-index直接对索引进行更改,但这需要更加熟悉Git内部(例如,您必须先单独散列blob对象,并且知道何时使用--add--replace等等。)

相关问题