Git 强行拉取在本地已删除/编辑的文件或目录,用 git checkout 恢复单个已删除/编辑的文件或目录。

当Git提示“Already up to date.”但实际未恢复删除文件时,可以使用 `git fetch --all`、`git reset --hard origin/master` 和 `git pull` 进行强行拉取。若要恢复单个文件或目录,可通过 `git checkout <文件名或目录名>` 来操作,此方法仅从本地恢复。另外,sparse checkout 模式允许排除某些文件,但需要额外配置。

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

Git 强行拉取在本地已删除/编辑的文件或目录,用 git checkout 恢复单个已删除/编辑的文件或目录。

删除本地文件后,想从远程仓库中重新 Pull 最新版文件,Git提示:
git.exe pull -v --progress "origin"
... ...
Already up to date.
Success (6829 ms @ 2019/5/27 12:02:53)

但是,实际上并没有得到删除的文件,怎么办呢?

这时就强行拉取(pull),在删除的文件所在目录下打开命令行窗口,顺序执行下面三条命:
git fetch --all  
git reset --hard origin/master 
git pull

注意,执行这三条命令后,不但恢复了删除了的文件并且没删除的但已修改的文件也被强行拉取并覆盖,不仅如此,整个版本库的其他目录/文件也受到同等待遇,而不只是当前目录里的文件。

那么有没有只恢复指定文件/目录的方法呢?看了一个帖子,用 git checkout 拉取单个文件或单个目录,如下:
git checkout <文件名或目录名>
但实践证明,这条命令只是从本地(注意,是从本地,不是从远程服务器)恢复删除了或编辑过的文件/目录。逻辑上讲,从本地把原文件 checkout 出来就可以,用不着从远程服务器上 pull 下来,所以用 git checkout 恢复单个已删除或编辑了的文件/目录就OK 。

还有帖子说了另一种办法,在服务端执行 git config core.sparsecheckout true 使用 Sparse Checkout 模式,在客户端告诉 Git 哪些文件或者文件夹是想排除的,编辑 .git/info/sparse-checkout 文件 ...... 还没详细研究,以后再说。

参考:

https://www.jianshu.com/p/648e204

### Git Sparse Checkout 添加特定目录文件的方法 #### 基本概念 Git 自 1.7 版本起引入了稀疏检出(Sparse Checkout)的功能,允许开发者仅检出仓库中的部分目录文件到工作区。这不仅能够减少磁盘占用,还能提高工作效率。 #### 配置 Sparse Checkout 要启用 Sparse Checkout 功能并添加特定目录文件,需按照以下方式操作: 1. **初始化仓库** 如果尚未克隆远程仓库,则可以通过 `git init` 初始化一个新的本地仓库,并配置远程地址。 2. **启用 Sparse Checkout** 启用 Sparse Checkout 功能需要修改 `.git/config` 文件将选项设置为 `true`: ```bash git config core.sparseCheckout true ``` 3. **定义稀疏检出路径** 创建编辑 `.git/info/sparse-checkout` 文件,写入希望检出的路径模式。例如,如果只想检出某个子目录 `webprj` 其下的某些文件,可以在该文件中输入对应的路径样式[^4]。 4. **数据** 执行以下命令以获远程分支的数据: ```bash git pull origin main --depth=1 ``` 这里使用 `--depth=1` 参数是为了浅克隆,进一步优化性能和存储需求。 #### 添加新的目录文件 当已经启用了 Sparse Checkout 并完成初始检出后,可以随时向现有列表中添加额外的目录文件。具体方法如下: - 使用 `git sparse-checkout add` 命令直接指定新目标路径。例如,若想新增另一个名为 `docs` 的目录至当前的工作树中,运行下面这条语句即可实现: ```bash git sparse-checkout add docs ``` - 若要移除某条记录者调整现有的范围设定,则可通过编辑`.git/info/sparse-checkout` 文件手动更改相应的内容;也可以利用 `git sparse-checkout set` 来重新定义整个规则集[^2]。 #### 示例代码展示 以下是完整的流程演示,假设我们有一个大型项目结构如前所述 (`project1/webprj`) ,现在只需要同步其中一部分资源下来: ```bash # Step 1: Initialize a new repository and link it to the remote one. cd /path/to/local/folder/ git init git remote add origin https://github.com/example/repo.git # Step 2: Enable sparse checkout mode globally within this repo context. git config core.sparseCheckout true # Step 3: Define which parts of the project should be checked out locally by editing or creating '.git/info/sparse-checkout'. echo "webprj/" >> .git/info/sparse-checkout # Alternatively use 'add' command directly without manual file manipulation: # git sparse-checkout add webprj/ # Step 4: Fetch data from server according to defined rules above. git fetch origin main git checkout FETCH_HEAD ``` 上述脚本展示了如何针对单个子模块执行精简版下载过程的同时还提供了动态扩展其他组件的能力[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值