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 分支的文件子集。此答案采用所有文件,而不是指定的组。
示例: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
可能有两个问题:
部分文件名可能包含空格。诸如 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尤其有一些方法可以处理它。不过,最好的办法是首先避免在文件名中使用空格。
上面 git log
向您展示的某个文件的活动之一可能是该文件在该提交中被 删除 . --name-only
选项告诉 Git 只显示 names 文件的 names 在提交的父级和相关提交之间进行了一些更改。如果 change-made 是“完全删除文件”,则该文件 不是 在 new 提交中,并且可能不是在最后一次提交中,因为它可能保持删除状态。
对于这样的文件,正确的做法通常是将其删除。因此,如果您收到有关此文件的错误,只需将其从 $files
集中取出即可:它不在 branch_A
末尾的提交中,因此您无法 将其复制出来 的那个提交,但是你不 想要 把它复制出来。就把它删除吧。
请注意,如果您的 Git 是 2.23 或更高版本,您可以使用 git restore
而不是上面的 git checkout
。1 这不是比git checkout
更好,只是更清晰一点:Git版本中的git checkout
命令早于 2.23 的版本可以完成多项工作中的一项,而在 Git 2.23 中,这些工作被细分为两个单独的命令:git switch
完成大约一半,git restore
完成另一个 roughly-half 这些工作。
(将命令一分为二,然后 split-up 命令变得 更智能 和 更好 。所以在当前版本的 Git,随着时间的推移,git switch
和 git 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 的索引,以及它们是否进入你的工作树,个别地。
如何从一个分支复制我在过去 10 天内更改过的所有文件,并将它们放入另一个 git 分支?
这找到所有更改的文件,
git log --since="10 day ago" --author="John Smith" --name-only --pretty=format: | sort | uniq
现在,尝试利用下面的答案,指定要复制到另一个 git 分支的文件子集。此答案采用所有文件,而不是指定的组。
示例: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
可能有两个问题:
部分文件名可能包含空格。诸如
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尤其有一些方法可以处理它。不过,最好的办法是首先避免在文件名中使用空格。
上面
git log
向您展示的某个文件的活动之一可能是该文件在该提交中被 删除 .--name-only
选项告诉 Git 只显示 names 文件的 names 在提交的父级和相关提交之间进行了一些更改。如果 change-made 是“完全删除文件”,则该文件 不是 在 new 提交中,并且可能不是在最后一次提交中,因为它可能保持删除状态。对于这样的文件,正确的做法通常是将其删除。因此,如果您收到有关此文件的错误,只需将其从
$files
集中取出即可:它不在branch_A
末尾的提交中,因此您无法 将其复制出来 的那个提交,但是你不 想要 把它复制出来。就把它删除吧。
请注意,如果您的 Git 是 2.23 或更高版本,您可以使用 git restore
而不是上面的 git checkout
。1 这不是比git checkout
更好,只是更清晰一点:Git版本中的git checkout
命令早于 2.23 的版本可以完成多项工作中的一项,而在 Git 2.23 中,这些工作被细分为两个单独的命令:git switch
完成大约一半,git restore
完成另一个 roughly-half 这些工作。
(将命令一分为二,然后 split-up 命令变得 更智能 和 更好 。所以在当前版本的 Git,随着时间的推移,git switch
和 git 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 的索引,以及它们是否进入你的工作树,个别地。