如何搁置对 Git 存储库中某个特定文件夹的更改?

How do I shelve my changes of one particular folder in Git repository?

具体情况如下:

git 存储库中的主分支有两个文件夹:

我对项目 B 进行了一些重大更改,而项目 A 完全没有改动。 现在,我不想在这个阶段提交和推送项目 B 的更改,因为它正在等待审查,并且可能有一些修改可能需要长达几周的时间。同时,我不想将这些更改保留在本地只是为了确保我不会在任何灾难性事件中丢失这些更改。

由于我是直接在Master分支上修改的,所以我想搁置这些修改,稍后再提交(可能是一个月后)。没有其他开发人员在该项目上工作,所以在合并时我最不在意。

任何人都可以建议我如何搁置这些更改,或者创建这些更改的私有分支以便稍后将它们与 master 合并?

如有任何帮助,我们将不胜感激。谢谢。

P.S。 - 抱歉,如果这看起来像一个基本问题,但我是一个 TFS 人,所以发现它有点难以适应 Git。在那里我可以简单地通过一两个步骤来完成:)

Git 是一个基于项目 的版本控制系统。这意味着当您在 Git 中提交工作时,您通常会提交存储库中的 每个 文件。因此,就此而言,您的两个文件夹之间没有区别。请注意,这与 Perforce 或 CVS 等 VCS 工具不同,在后者中您可以只对这两个文件夹之一进行版本控制。

关于您的问题,也许最简单的方法就是从您当前的工作中创建一个功能分支。您可以尝试以下方法:

# git checkout yourBranch if not already there
git checkout -b my_project_b            # create a new branch from this point
git add .                               # add your files changed
git commit -m 'Project B latest work'   # commit your work

现在您可以通过

将包含项目 B 更改的新分支推送到远程
git push origin my_project_b

当需要使用这项工作时,只需将 my_project_b 合并到目标分支即可。

@Tim 已经给出了很好的解决方案。我想分享一个棘手但不是很有用的。

现在您已经在项目 B 中进行了一些更改。假设文件夹名称为 PB。

git add .
git commit
git ls-tree HEAD | grep PB
git reset HEAD^ --hard

ls-tree 的预期输出类似于 040000 tree 765b32c65d38f.... PB

这是树对象,PB的快照。我们可以为它做一个标签。

git tag -m "tag of PB tree" tree_PB 765b32c65d38f

可以推送或获取标签 tree_PB

git init tmp_PB
cd tmp_PB
git fetch <remote> tree_PB
git read-tree FETCH_HEAD -u --reset

PB中的文件从树对象中提取到当前文件夹中并暂存。您可以将它们复制到原始仓库。