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

12

我有一个名为branch1的分支,其中有10个文件。当我创建新的分支branch2时,我只想选择其中的四个文件放到新的分支里。

在git中是否可能实现这一点,因为在创建新分支时?

2个回答

24

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

# 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"

谢谢您的回复。这对于少量文件来说是可以工作的,但如果我有大约100个文件并想移动40个文件怎么办? - user7183867
我已更新我的帖子,提供另一种方法:删除所有文件并仅从其他分支中获取所需文件。 - Bertrand Martel
谢谢,也许我会尝试这种方法,很有道理。 - user7183867
它适用于文件夹吗?我已经测试过了,但它找不到文件夹。 - user7075574

9
您可以查看“分支”到底是什么意思? 分支名称只是指向特定提交的指针。每个提交包含快照,快照记录了制作快照时在索引中的所有内容。(每个提交也会“指回”其父提交,当然还有作者、提交者和提交信息。)
创建新提交首先会写出索引, 然后写一个提交,该提交引用保存的索引(树对象)并引用“当前”的或HEAD的提交。最后,将新提交写入分支名称,使其成为当前的/ HEAD提交。分支名称随后指向最新提交(HEAD文件仅包含分支名称;它是指向提交的分支名称)。
如果您想让新提交包含某些特定的文件集,则应将这些文件添加到索引中,并从索引中删除任何其他文件。无论索引中包含什么,都将成为您制作的下一个提交的快照内容。
要查看目前索引中的内容,请运行git ls-files。对于更详细的输出,请使用 git ls-files --stage,它显示已占用哪些索引槽(可能会有多个,在冲突合并期间可能会有多个,但除此之外,一切都在槽零中)。
Bertrand Martel的答案中所述,您可以使用git checkout将文件复制到索引中。
git checkout <commit-specifier> -- <path> [ <path> ... ]

此命令会将指定提交版本中每个 <path> 的文件复制一份到索引中,分支名称指向该分支上的 tip 提交版本,但在此处可以使用来自 gitrevisions 的任何内容。然后再从索引中复制到工作树中。

你也可以通过从工作树中取出文件并将其复制到索引中来实现。

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

这个命令会将指定路径下工作区的内容复制到索引中(具体是放在零号插槽中,将覆盖其他插槽的内容,这也是为什么它能解决合并冲突的原因)。

如果要从索引中删除文件,请使用git rm命令,和git add命令类似。不过需要注意的是,这个命令会将文件从索引和工作区都删除。如果只想从索引中删除,可以使用git rm --cached 命令。

对于复杂的脚本操作,可以使用git update-index直接对索引进行更改。但是,这需要更熟悉Git内部机制(例如,你必须先逐个哈希blob对象,并知道何时使用--add--replace等参数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接