Git checkout 某个版本到指定文件夹下

本文介绍了在Git中避免覆盖本地工作区,将特定版本的文件检出到不同目录的三种方案:1.使用gitarchive创建tar文件;2.gitshow逐个文件检出;3.利用git--work-tree进行检出。gitarchive灵活但文件多时繁琐,而git--work-tree存在bug需要注意。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景说明

  • 我不想checkout到覆盖本地工作区的文件,
    而是想把该
  • 版本checkout到另外一个文件夹下,检出看看,这个文件夹不被git管理

方案一:git archive 最简单省事

# `git archive` 创建对应版本 当前目录下的文件为一个tar文件
# `tar -x -C` 加压文件到指定位置
git archive <commit_hash> | tar -x -C <new_folder>

将 <commit_hash> 替换为你想要检出的具体commit的哈希值,<new_folder> 替换为你想要保存文件的新文件夹路径。

这条命令会创建一个对应版本的tar临时归档文件,并将其解压到指定的新文件夹中,保持原来的文件结构。

注意:

  • 执行这条命令应在git仓库的根目录下,否则得到的只有当前目录下的文件
  • 你需要确保 <new_folder> 不存在,或者是一个空文件夹,否则会报错。

如果打包时不想对某些文件/文件夹打包,可以创建一个.gitattributes文件(但是只有含有这个文件的commit,打包时才能忽略,对历史版本打包时无效),并在其中添加export-ignore属性,比如:

# 这三个东西打包时将被忽略
.gitignore        export-ignore
.gitattributes    export-ignore
/result           export-ignore

方案二:git show 最灵活, 但文件较多时麻烦

另一个方案是利用git show结合重定向>逐个检出文件,比如:git show 94119e2:test.py > test_v1.0.py,有多个文件的话就逐个执行。

方案三:git --work-tree 有bug

方案:通过指定--work-tree=/path/to/dist 可实现目标功能
	git --work-tree=/d/mycode/test_git/labs/2053 checkout 3d9862a -- .
	
其中:
	• git checkout 3d9862a -- .
		○ 检出指定版本的所有文件
		○ `.`表示所有文件, 也可以换成某个文件/文件夹
		
	• --work-tree=/d/mycode/test_git/labs/2053
		○ 用于指定检出到的位置,该路径必须存在
		○ 如果该路径下已有文件,则会直接覆盖

执行这个命令之后会把你的文件变成not staged for commit, 然后执行git add就可以了,不需要再commit.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值