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。当我