Git 如何仅签出特定提交的内容?

Git 如何仅签出特定提交的内容?,git,version-control,Git,Version Control,我有一个old_分支,在那里我只对代码中的几个文件进行一些原型设计。我的主分支远远领先于旧分支,所以当我 git checkout old_branch -- . 从master,我得到了很多对索引的中间提交。我知道如何使用以下语法提取所需的文件: git checkout old_branch -- file1 git checkout old_branch -- file2 ... git checkout old_branch -- fileN 但是当这些文件的数量很大时,任务就变得相

我有一个
old_分支
,在那里我只对代码中的几个文件进行一些原型设计。我的
主分支
远远领先于
旧分支
,所以当我

git checkout old_branch -- .
master
,我得到了很多对索引的中间提交。我知道如何使用以下语法提取所需的文件:

git checkout old_branch -- file1
git checkout old_branch -- file2
...
git checkout old_branch -- fileN
但是当这些文件的数量很大时,任务就变得相当麻烦

那么,我如何从
master
以一行代码获取此特定提交的内容(旧分支
的提示),而不在索引中看到提交之间的其他更改呢?

我可能只用于此:

git cherry-pick old_branch --no-commit
该选项将把由
old_分支
引用的提交引入的更改应用于您的索引和工作目录,但它不会在
master

上创建提交,我可能仅用于此:

git cherry-pick old_branch --no-commit

该选项将把由
old_branch
引用的提交引入的更改应用到您的索引和工作目录中,但它不会在
master
上创建提交。在继续执行此操作之前,您必须清楚一些git概念:

git diff --name-only master...old_branch | xargs git checkout old_branch --
  • 提交包含当时存储库的完整快照,而不是一组更改
  • 分支只是指向提交(并从那里指向该提交的历史)的方便指针,而不是一组实际的提交
考虑到这一点,我们可以更清楚地定义要求:

  • 从分支
    旧分支当前指向的提交中签出(分支的“提示”)
  • 。。。那些被任何提交更改的文件。。。(更迂腐的是,那些与其父文件不同的文件会提交)
  • 。。。可从
    旧分支
    访问,但不能从
    主分支
    访问(我们直观地理解为
    旧分支
    上的提交)
可能有多种方法可以做到这一点,但根据上述定义,我们可以将一些东西串在一起:

  • 正如您在问题中所说,
    git checkout old_branch--
    允许我们签出选定的文件;重要的是,就我们的目的而言,它可以接受任何数量的论点
  • git diff--name only
    将为我们提供在某对提交之间更改的文件列表
  • 传递给git diff的特殊符号
    master…old_branch
    将“查看包含和直到第二个分支的更改,从这两个分支的共同祖先开始”;在这种情况下,它将找到
    旧分支
    主分支
    分支的点,并将其与
    旧分支
    的当前提示进行比较
拼图的最后一块是Unix命令
xargs
,它可以获取一个命令生成的值列表,并将其转换为另一个命令的参数。因此,我们最终得出以下结论:

git diff --name-only master...old_branch | xargs git checkout old_branch --

另一方面,这将使用
old_branch
中的版本完全覆盖这些文件。我认为您有很好的理由希望这样做,但更常见的是希望应用
old_branch
中的更改,这非常简单:

git merge old_branch

在继续这项工作之前,您需要先了解几个git概念:

git diff --name-only master...old_branch | xargs git checkout old_branch --
  • 提交包含当时存储库的完整快照,而不是一组更改
  • 分支只是指向提交(并从那里指向该提交的历史)的方便指针,而不是一组实际的提交
考虑到这一点,我们可以更清楚地定义要求:

  • 从分支
    旧分支当前指向的提交中签出(分支的“提示”)
  • 。。。那些被任何提交更改的文件。。。(更迂腐的是,那些与其父文件不同的文件会提交)
  • 。。。可从
    旧分支
    访问,但不能从
    主分支
    访问(我们直观地理解为
    旧分支
    上的提交)
可能有多种方法可以做到这一点,但根据上述定义,我们可以将一些东西串在一起:

  • 正如您在问题中所说,
    git checkout old_branch--
    允许我们签出选定的文件;重要的是,就我们的目的而言,它可以接受任何数量的论点
  • git diff--name only
    将为我们提供在某对提交之间更改的文件列表
  • 传递给git diff的特殊符号
    master…old_branch
    将“查看包含和直到第二个分支的更改,从这两个分支的共同祖先开始”;在这种情况下,它将找到
    旧分支
    主分支
    分支的点,并将其与
    旧分支
    的当前提示进行比较
拼图的最后一块是Unix命令
xargs
,它可以获取一个命令生成的值列表,并将其转换为另一个命令的参数。因此,我们最终得出以下结论:

git diff --name-only master...old_branch | xargs git checkout old_branch --

另一方面,这将使用
old_branch
中的版本完全覆盖这些文件。我认为您有很好的理由希望这样做,但更常见的是希望应用
old_branch
中的更改,这非常简单:

git merge old_branch

git中的提交是代码库的快照,因此提交包含进行提交时repo中的所有文件。是否仅签出在特定提交中更改的文件?了解您为什么这样做也很有用,而不是签出分支本身,或者将其与
master
合并。是的,我只想签出在这个特定提交中更改的文件(但所有文件)。为什么您不能只签出
git checkout old_branch
?(无
-.
)原因如下:1。当我