Git 我能';我好像压扁了我的承诺——无法分开我的头

Git 我能';我好像压扁了我的承诺——无法分开我的头,git,rebasing,Git,Rebasing,我对我的.gitignore进行了修复,但花了几次提交-我现在需要压缩它们,但重定基址最终出错,重定基址被中止 我尝试通过使用sourcetree和-f将pick更改为squash来重新设置基址 `git rebase -i e9147 -f error: The following untracked working tree files would be overwritten by checkout: .vscode/settings.json Dating

我对我的.gitignore进行了修复,但花了几次提交-我现在需要压缩它们,但重定基址最终出错,重定基址被中止

我尝试通过使用sourcetree和-f将pick更改为squash来重新设置基址

`git rebase -i e9147 -f
error: The following untracked working tree files would be overwritten by checkout:
        .vscode/settings.json
        DatingApp.API/.vscode/launch.json
        DatingApp.API/.vscode/tasks.json
Please move or remove them before you switch branches.
Aborting
could not detach HEAD`

如何正确地重新设置基址?

从根本上说,这里的问题是,在当前提交中有几个文件未被跟踪,但如果Git允许交互式重新设置基址,这些文件将不会被取消跟踪

至少在这种情况下,最直接的问题是,即使在应用任何rebase magic之前,也相当于您有未跟踪的文件,但希望
git checkout
跟踪这些文件的其他分支。有关更多信息,请参阅 和。不过,解决这些问题的许多方法都是有意识地跟踪这些文件,并立即提交,以便安全地删除它们。至少,
.vscode/settings.json
似乎真的不应该被跟踪(因此不应该提交)

这导致了中概述的困境:如果您确实以某种方式实现了重基,您可能会跟踪这些文件,即使您不希望跟踪它们。如果您
git添加它们并立即提交,您将能够完成重设基础,这些文件上可能存在不应提交的冲突,然后您可以删除它们,但这只会将问题转移到下一次有人需要重设基础或以其他方式使用所有包含这些文件的提交时

对于这个答案的其余部分,我假设这些文件应该不被跟踪。请注意,当您签出包含这些文件的提交时,这些文件将被跟踪!(有关未跟踪文件的精确定义,以及如何、何时以及为什么会变得复杂,请参见下文。)

这个问题没有完美的解决方案。不过,我个人的偏好是遵循Git本身刚刚打印的建议:

将当前存在于工作树中但不存在于索引中的三个未跟踪文件移出工作树。就Git而言,现在它们根本不存在。您可以完成重基。然后,在完成了rebase(这可能会导致这三个文件现在作为跟踪文件存在)之后,您可以删除这三个文件(如果它们存在)并提交删除(如果必须删除它们),以便使它们不被跟踪。然后,您只需将保存的文件移动到Git无法将其视为未跟踪文件的位置,即可将保存的文件移回开始时保存的文件,但现在已完成重新基础

Long:什么是未跟踪的文件?为什么会发生这种情况? 未跟踪文件的定义非常简单,但其中包含Git术语未跟踪文件是存在于工作树中但不存在于索引中的文件。这意味着您需要知道索引和工作树是什么。(如果你已经知道,你可以在这里停止阅读。)

Git主要是关于提交的。每个提交都由自己独特的、大的、难看的散列ID标识,存储所有文件的快照,以及一些元数据,如提交人、提交时间和提交原因(日志消息)。所有这些内容都以压缩、只读、冻结的形式存储:任何提交的任何部分都无法更改。这对于存档来说是非常好的:不仅您不能更改存储的永久文件,Git也不能,而且Git将自动检测在某些内容以某种方式被更改或修改时发生的任何错误:磁盘故障,或破坏数据的恶意程序,或任何其他可能出错的错误

(如果你确实发现了一个坏的存储库,Git并不擅长修复它,但请注意Git鼓励你保留几十个克隆。例如,如果你将Git存储库发送到GitHub,GitHub会有一个副本,而你也会有一个副本。如果有人将你的GitHub存储库分叉,他们至少会有一个,甚至可能还有两个副本,以此类推。由于有数百份拷贝,它们中的大多数很可能都是好的。)

Git有很多很好的理由将文件保存在冻结、压缩、只读、Git-only的形式中——我喜欢在所有保存的提交中称之为冻结-干燥。我们不需要在这里讨论它们;我们只需要知道,您的所有文件,加上其余的提交元数据,都是永久冻结的。它们无法更改,因为等等ly Git理解这种冻干形式,它们甚至对任何非Git程序都没有用处。因此Git必须提供一种从提交中提取所有文件的方法

您已经熟悉了这一点,因为您使用过
git checkout
git checkout
所做的事情之一是将某些提交中的文件的冻干副本重新水化:将它们转换为其他计算机程序可以使用的普通文件。这些文件是读/写文件nd除了Git之外,对任何东西都有好处

提交是您所有文件的快照,当然是提交中的所有文件。Git获取快照中的所有文件,并将它们还原为有用的形式,Git称之为工作树或工作树,或者类似的形式。在这里,您的文件对您来说还是有用的,不管怎样,它们并不真正有用你为Git做了很多事

但是,为了将这些文件放入工作树中,Git首先将所有冻干副本加载到当前冻结提交头和工作树之间的一个位置。Git称这个位置为索引或暂存区域,或者(很少)这三个名字都指的是同一件事:一个存放冻干文件的区域

索引或暂存区实际上有很多角色,但其数量不确定
Please move or remove them before you switch branches