在分支之间移动单个 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 设法完成分布式版本控制系统的“分布式”部分的方式。)
我正在使用 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 设法完成分布式版本控制系统的“分布式”部分的方式。)