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

swa*_*ati 5 git github

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

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

Ber*_*tel 14

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

# 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"
Run Code Online (Sandbox Code Playgroud)


tor*_*rek 6

您可以看看"分支"究竟是什么意思? 分支名称只是指针,指向特定的提交.每个提交都包含一个快照,其中包含您创建快照时索引中的所有内容.(每个提交也"回退"到它的父提交,当然还有一个作者,提交者和提交消息.)

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

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

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

Bertrand Martel的答案一样,您可以使用git checkout以下方法将文件复制到索引中:

git checkout <commit-specifier> -- <path> [ <path> ... ]
Run Code Online (Sandbox Code Playgroud)

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

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

git add <path> [ <path> ... ]
Run Code Online (Sandbox Code Playgroud)

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

要从索引中删除文件,请使用git rm,类似于git add.但是请注意,这个删除它从两个索引工作树; 要仅从索引中删除,请使用git rm --cached.

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