如何解决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分支的文件子集。该答案将使用所有文件,而不是指定的组。
示例:将25个文件从Git分支A移动/复制到Git分支B,按原样保留文件,或合并(获取源代码)。希望所有文件都像分支A中一样。
解决方法
文件实际上不在分支中。文件位于 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
可能有两个问题:
-
某些文件名可能包含空格。像
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有一些应对方法。不过,最好的办法是首先避免文件名中出现空格。
-
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 restore
和git switch
的总和比git restore
还要大。旧的git checkout
仍然存在,因此如果您习惯了,可以继续使用。但是,如果您需要一些新功能,则必须切换到新命令。)
1 使用git checkout
时,您将需要git restore
而不是git restore --source=branch_A -iw -- $files
。输入的时间稍长一些,可能会很烦人,但效果相同。 git checkout branch_A -- $files
的“聪明”之处在于,您可以分别选择文件是否进入Git的索引,以及文件是否进入工作树。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。