我有branch1有10个文件,而创建新分支作为branch2,我想只选择四个文件到新分支。
是否可以在git中,因为在创建新分支时?
答案 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
等等。)