Git 签出提交,在工作目录中保留更改

Git 签出提交,在工作目录中保留更改,git,working-directory,Git,Working Directory,我的工作目录是脏的,这就是我喜欢它的方式 我想签出某个提交,但git抱怨: error: Your local changes to the following files would be overwritten by checkout: 很公平。我怎么知道git: 请不要覆盖它们。保持更改后的文件不变,并且 签出所选提交中的其余部分 我的工作目录是脏的,这就是我喜欢它的方式 好吧!:-) 我如何告诉git:请不要覆盖它们。保持更改后的文件不变,并从所选提交中签出其余文件 你不能——至少不能

我的工作目录是脏的,这就是我喜欢它的方式

我想签出某个提交,但
git
抱怨:

error: Your local changes to the following files would be overwritten by checkout:
很公平。我怎么知道git:

请不要覆盖它们。保持更改后的文件不变,并且 签出所选提交中的其余部分

我的工作目录是脏的,这就是我喜欢它的方式

好吧!:-)

我如何告诉git:请不要覆盖它们。保持更改后的文件不变,并从所选提交中签出其余文件

你不能——至少不能直接

现在还不清楚你为什么要这样做,这可能会影响你应该如何做

请注意,您可以使用
Git-worktree-add
将任何特定的提交提取到新的工作树(如果您的Git足够新:2.5是最小值,2.6+更好)。如果您的Git较旧,您只需将存储库克隆到新的克隆,并使用该克隆将提交提取到新克隆的工作树中

您还可以使用
git-archive
将任何特定提交打包为tar或zip归档。一旦你有了那个档案,你可以用它做任何你喜欢的事情

这两种方法都有一个副作用,即不会以任何方式更改现有工作树的
头和索引,当然,也不会更改任何工作树文件。(或者,更好的说法是,
git checkout
具有改变
HEAD
和索引的副作用,只是这些不是真正的副作用;这些是主要的影响,因为
HEAD
表示当前提交,索引索引索引工作树,
git checkout
的目的是切换提交s、 更新工作树)


最后一个选项是继续并进行提交,这当然违反了设置中的“我喜欢它的方式”部分。但是您可以在临时分支上进行此提交,甚至可以在没有分支的情况下进行此提交。
git stash
就是这样做的,尽管它实际上会根据您给出的参数进行两到三次提交。一旦你有了一个提交,你就可以使用所有基于提交的工具来处理这个提交,比如樱桃采摘。

git stash
git checkout提交
git stash apply
为你工作吗?从stash中恢复也有完全相同的问题。@XavierGuihot更好地说,unstashing尝试合并,并给我(喘息)合并冲突,这绝对不是我想要的。我想让我更改的文件保持原样,请不要乱动。从未尝试过此操作,但这可能会有帮助,而不是签出提交,您可以签出该提交中所有在工作目录中未更改的文件。我在重构代码时面临此问题。在我做了一些更改之后,一些测试失败了。在这种情况下,我希望在不丢失当前进度的情况下回滚到上一次提交。@user11452194:要记住的是,您的工作树是您的,您可以随意处理。只有
.git
是git的。只要不触摸
.git
内容,您可以将所有工作树文件移动到其他地方,也可以随意处理它们。当您要求Git执行诸如
Git开关
Git恢复
Git重置--hard
之类的操作时,您告诉Git:覆盖我的工作树,它会按照您的要求在那个时候这样做,所以那时你必须确定你对Git覆盖你的工作树内容没问题。在Git 2.23之前的Git版本中,两个单独的命令
Git-switch
(在完成未保存的工作树工作之前检查)和
Git-restore
(只覆盖你的工作树)都拼写为
Git-checkout
,因此,如果您使用旧的
git checkout
命令,请注意您使用的是哪种
git checkout
命令:您使用的是安全的,上面写着“将关闭文件”,而不是关闭文件,还是强制的“立即关闭我的文件!”表单?在使用Git 2.23及更高版本的两个独立命令时,情况会更清楚。通常,有两种方法可以保存工作树文件:(1)将它们复制到Git存储库之外的某个地方。现在,它们与您的存储库完全无关,并且不会受到您对存储库所做的任何操作的影响。或者(2)提交它们。现在,他们处于一种承诺状态;每次提交都会一直冻结。使用commit的hash ID和Git命令,稍后将它们取回。