Git:将Group文件从一个Git分支复制到另一个Git分支? 主要

问题描述

如何将过去10天更改过的所有文件从一个分支复制到另一个git分支?

这将找到所有更改的文件,

https://stackoverflow.com/a/8016702/14432516

git log --since="10 day ago" --author="John Smith" --name-only --pretty=format: | sort | uniq

现在,尝试利用下面的答案,指定要复制到另一个git分支的文件子集。该答案将使用所有文件,而不是指定的组。

How can I get All the files from one git branch,and put them into the current branch without merging?

示例:将25个文件从Git分支A移动/复制到Git分支B,按原样保留文件,或合并(获取源代码)。希望所有文件都像分支A中一样。

寻找一种快速的自动化方法来对100多个文件进行处理。

解决方法

文件实际上不在分支中。文件位于 commits 中。每个提交都具有每个文件的完整完整副本,或更准确地说,是您(或任何人)进行该提交时Git知道的每个文件。

之所以如此重要,是因为它使答案很容易,或者更容易地 。稍后,我们将更多地了解这部分

给出:

这将找到[我要复制]的所有文件:

git log arguments --name-only | sort -u

您现在可以按照git log检查的提交顺序,简单地从 last 提交复制这些文件。由于上面指定的 arguments 不包含任何特定的提交,因此Git从当时为HEAD提交的提交开始,这将是您当时已签出的分支。例如,假设您有分支branch-A

此时,您可能还想执行以下操作: arguments =“-since =” 10天前“” --author =“ John Smith”-仅名称--pretty =格式:“ files = $(git log $ arguments | sort -u) 回显$ files

(首先设置$arguments的唯一原因是使所有这些内容都适合此发布中的一行,并且/或者让您多次运行git log这样。)

[我如何准备(那些文件)准备提交到将在branch-B上进行的新提交中?]

您将下次运行:

git checkout branch-B

照常。然后,就像在the better answer to the question you linked中一样,您将使用:

git checkout branch-A -- $files

$files变量是根据git log --name-only | sort -u命令的输出设置的。

主要

主要出现 的地方是$files可能有两个问题:

  1. 某些文件名可能包含空格。像bash这样的shell(这里的示例都是sh / dash / bash兼容的),将空格作为分解参数,这就是为什么您可以首先运行git log --since=...的原因:每个{{1 }},log--since等必须作为单独的参数传递给Git命令。

    但是,假设您有一个名为--name-only的文件。然后path/to/file with spaces.ext包含$files,要重击它,就像您输入path/to/file with spaces.ext作为第一个参数,path/to/file作为第二个参数,with作为第三个参数论点。

    如果您陷入这种情况,特别是bash有一些应对方法。不过,最好的办法是首先避免文件名中出现空格。

  2. spaces.ext上面显示的某个文件上的活动之一可能是该提交中的文件被删除git log选项告诉Git仅向您显示在提交的父级和有问题的提交之间进行了某些更改的文件的名称。如果所做的更改是“完全删除文件”,则该文件不在新提交中,并且可能不在最终提交中,因为它可能保持删除状态。

    对这样的文件正确执行的操作通常是将其删除。因此,如果您对该文件有错误,只需将其从--name-only集中删除:它不在$files尖端的提交中,因此您不能将其复制出来提交,但您不想将其复制出来。只需将其删除即可。

请注意,如果您的Git为2.23或更高版本,则可以使用branch_A代替上面的git checkout 1 这不是更好的git restore更清楚了:在2.23之前的Git版本中,git checkout命令可以完成多项工作之一,而在Git 2.23中,这些工作又细分为两个单独的命令:git checkout完成大约一半的工作,而git switch完成大约一半的工作。

(将命令分为两部分,然后将拆分后的命令制作为 smarter better 。因此,在当前版本的Git中,随着时间的推移, git restoregit switch的总和比git restore还要大。旧的git checkout仍然存在,因此如果您习惯了,可以继续使用。但是,如果您需要一些新功能,则必须切换到新命令。)


1 使用git checkout时,您将需要git restore而不是git restore --source=branch_A -iw -- $files。输入的时间稍长一些,可能会很烦人,但效果相同。 git checkout branch_A -- $files的“聪明”之处在于,您可以分别选择文件是否进入Git的索引,以及文件是否进入工作树。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...