在分支之间移动单个 Git 文件及其历史记录

Move single Git file between branches with its' history

我正在使用 Git 来管理小型 shell 脚本的小型存储库。 它们有很多,none 证明有自己的存储库,所以我将它们集中在一个存储库中。

为了保持整洁,我有几个长的 运行 分支 - 一个用于我仍在处理的脚本,另一个用于我通常已完成但仍在测试的脚本,另一个用于经过验证、值得信赖的脚本脚本。当然,我偶尔会在树枝之间移动它们。

我目前正在使用 git checkout {branch} {filename} 在分支之间传输脚本,但这只会导入当前的文件,将其历史记录留在旧分支中。

这不是很重要,但出于好奇 - 有没有办法在分支之间移动单个文件及其历史记录?

谢谢!

在Git中,文件没有历史记录。相反,提交历史。 Git 存储库中的历史记录是通过以下方式找到的:

  • 选择一个分支名称(或其他一些可以让您找到提交的哈希 ID 的标签);
  • 观察那个 提交,由它的散列 ID 找到;
  • 使用 that 提交(其中包含一个或多个较早提交的哈希 ID)返回到较早的提交。

正是这种从提交到早期提交的倒退,探索历史的行为。因此,提交 历史。

现在,每个提交都包含文件:事实上,每个提交都有 每个 文件的完整副本,以只读格式保存,压缩并且——因为大多数提交主要是复制一些以前提交的文件不变——去重。因此,给定一些 历史记录的提交集,我们可以 Git 过滤掉 一些甚至 大多数 的历史,只向我们展示那些 Git 认为我们会发现特别有趣的提交。这就是 git log -- <em>path</em>git log --follow -- <em>文件名</em> 工作。他们查看实际历史的一些子集——一些提交集——然后简单地对你说谎,使用精心挑选的、编程可控的谎言来为你提供有用的信息。

必须记住,这些都是谎言,你可以通过 --simplify-by-decoration--full-history 等选项来控制。否则你会被谎言所愚弄。实际历史是 提交 并且 Git 正在过滤掉一些。

进行新提交会使所有现有提交保持不变。它 必须 因为任何提交的任何部分都不能更改,即使 Git 本身也不能更改。 (这就是 Git 设法完成分布式版本控制系统的“分布式”部分的方式。)