Git:将一个组文件从一个 Git 分支复制到另一个 Git 分支?

Git: Copy a Group files from one Git Branch into Another Git branch?

如何从一个分支复制我在过去 10 天内更改过的所有文件,并将它们放入另一个 git 分支?

这找到所有更改的文件,

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?

示例:Move/Copy 25 个文件从 Git 分支 A 到 Git 分支 B,按原样处理文件,或合并(获取源)。想要分支 A 中的所有文件。

正在寻找一种快速自动化的方法来对 100 多个文件执行此操作。

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

为什么这很重要,因为它使答案变得简单——或者更确切地说,大部分变得简单。待会儿我们会详细了解 mostly 部分。

给定:

This locates all the files [I want to copy]:

git log <em>arguments</em> --name-only | sort -u

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

此时您可能还想执行以下操作: arguments="--since="10 天前" --author="John Smith" --name-only --pretty=format:" files=$(git log $arguments | sort -u) 回显 $files

(设置$arguments第一个的唯一原因是为了让所有这些都在这个帖子中排成一行,and/or让你运行 git log这样不止一次。)

[How do I get (those files) ready to be committed into a new commit I will make on 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=...地方:log--since--name-only 等中的每一个都必须作为单独的参数传递给 Git 命令。

    但是假设您有一个名为 path/to/file with spaces.ext 的文件。然后 $files 包含 path/to/file with spaces.ext,对于 bash,看起来您输入了 path/to/file 作为一个参数,with 作为第二个参数,并且 spaces.ext 作为第三个参数。

    如果您遇到这种情况,bash尤其有一些方法可以处理它。不过,最好的办法是首先避免在文件名中使用空格。

  2. 上面 git log 向您展示的某个文件的活动之一可能是该文件在该提交中被 删除 . --name-only 选项告诉 Git 只显示 names 文件的 names 在提交的父级和相关提交之间进行了一些更改。如果 change-made 是“完全删除文件”,则该文件 不是 new 提交中,并且可能不是在最后一次提交中,因为它可能保持删除状态。

    对于这样的文件,正确的做法通常是将其删除。因此,如果您收到有关此文件的错误,只需将其从 $files 集中取出即可:它不在 branch_A 末尾的提交中,因此您无法 将其复制出来 的那个提交,但是你不 想要 把它复制出来。就把它删除吧。

请注意,如果您的 Git 是 2.23 或更高版本,您可以使用 git restore 而不是上面的 git checkout1 这不是git checkout更好,只是更清晰一点:Git版本中的git checkout命令早于 2.23 的版本可以完成多项工作中的一项,而在 Git 2.23 中,这些工作被细分为两个单独的命令:git switch 完成大约一半,git restore 完成另一个 roughly-half 这些工作。

(将命令一分为二,然后 split-up 命令变得 更智能 更好 。所以在当前版本的 Git,随着时间的推移,git switchgit restore 放在一起可以比 git checkout。旧的 git checkout 继续存在,这样如果你习惯了它,你可以继续使用它。但是,如果你需要一些新的能力,你必须切换到新的命令。)


1当使用 git restore 时,您需要 git restore --source=branch_A -iw -- $files,而不是 git checkout branch_A -- $files。输入的时间有点长,这可能很烦人,但它具有相同的效果。 git restore 的“smarter-ness” 是你可以 select 文件是否进入 Git 的索引,以及它们是否进入你的工作树,个别地。