Git:将文件添加到旧提交中,作为新分支的父级已经合并回来?

Git: add file to old commit being parent of a new branch already merged back?

给定以下 git 日志,我如何将文件(在任何提交中都不存在)添加到提交 B,以便这个新文件将出现在 A 的所有其他提交中?

A --> B -----> D ------> F
       \--> C --> E --/

在我使用 git rebase --onto 的尝试中,我没有成功地不必基本上复制每个修改内容的提交,但我确信我没有使用 [=20 的全部功能来接近它=].有帮助吗?

注意:远程可以强制执行,甚至可以删除并重新推送,不用担心。

非常感谢

最终结果将是:复制所有提交。

不过,关于实现方法,您可以使用 git rebase 和一些选项:

# -i for --interactive
# -r for --rebase-merges
git rebase -i -r A

git 将为您打开一个文本编辑器,要求您描述每次提交要执行的操作。

在该文件中:

  • 找到提到提交的行 B
  • 将操作从 pick 更改为 edit
  • 保存并退出

git 将开始应用您指示他执行的脚本,并在到达 B 后暂停。

此时,您可以添加额外的文件:

  • git add你要的文件
  • git commit --amend 将其添加到 B
  • git rebase --continue 继续变基

这应该重写 B 之后的所有提交。

您可以查看您的本地历史记录,以及您提交的内容,
如果您对结果满意,您可以 push --force.

git filter-branch 可能会有帮助。它可以一次重写一系列提交。从你的笔记中,我认为你已经意识到了潜在的问题。提交重写共享历史(不同的哈希等)

注意。在尝试之前创建一个备份副本不会有什么坏处:)

git filter-branch \
  --index-filter 'cp /path/to/new/file path/in/repo && git add path/in/repo/file' \
  -- A..F

这会将过滤器应用于从 F 可访问的所有提交,但排除可从 A 访问的任何提交(换句话说:排除 A 及其所有祖先)