【问题标题】:Move single Git file between branches with its' history在具有历史记录的分支之间移动单个 Git 文件
【发布时间】:2021-05-11 05:26:00
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 一个分支只不过是一个提交的指针。
  • Git checkout 没有导入任何东西?
  • 也许导入不是正确的词。我的意思是将文件从一个分支复制到另一个分支。
  • @dkd6 我只是想澄清一下。 Checkout 不会复制文件。它根据您给它的分支/提交恢复工作树(不是分支)中的文件。

标签: git git-branch git-history


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 感谢您的详细解答!真的为我清理了一切。在这种情况下,我认为除了合并或变基之外没有其他方法,这是可以理解的。
猜你喜欢
  • 2019-02-05
  • 2011-04-20
  • 2011-08-05
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多