问题描述
除了源代码控制之外,我还使用 git 和 Github 作为事实上的备份解决方案,并且正在开发一个大型功能。这个功能非常粗糙。我专注于完成所有增强功能的添加,但我知道自上次提交以来我添加的所有代码肯定会有大量的清理工作要做。
通常我会在开发过程中的逻辑检查点经常提交提交,但这次我一直在拖延,因为提交会使找到所有需要清理的代码变得更加困难。现在我可以在 Windows 的 Github 客户端中看到未提交的文件 + 更改的列表,我的 IDE Android Studio 也清楚地显示了未提交的更改的文件。
我有一个额外的备份解决方案,但想知道是否有人有适合这些情况的好系统 - 当您不想橡皮戳/提交未完成的代码但想以某种方式将它保存在 git 中时?
解决方法
如果您的问题是关于在不提交的情况下在 Git 中保存文件,答案很简单:您不能。1
如果您的问题是如何在 Git 之外保存文件,答案也很简单:只需将它们保存在 Git 之外。这里Git本身不入图。
理解这一点的关键是一个简单但最初令人惊讶的事实:当您使用 Git 时,您可以看到和处理/使用的文件不在 Git 中。保存在提交中的文件在 Git 中,但不是您可以查看和处理/使用的文件。它们甚至不是直接从这些文件制作的。相反,当您运行 git add
时,Git 会将您可以查看和使用的文件复制到隐藏的、准备提交的副本。当您运行 git commit
时,那就是保存那些隐藏的、准备提交的副本的时间。
有几个不拼写为 git commit
的 Git 命令仍然会提交,因此会在 Git 中保存文件。例如,austurist mentions 的 git stash
命令进行两次或三次提交(两次是正常设置;如果使用 git stash -u
或 git stash -a
,则得到 3)。>
您在评论中提到:
我仍然希望我的更改在工作目录中进行构建
您的工作树是您的,您可以随意使用。这里的文件不在 Git 中,所以你可以用它们做任何你喜欢的事情。请记住:
-
git checkout
和其他一些 Git 命令作为显式请求替换工作树中的文件; -
git add
告诉 Git 将出现在工作树中的部分或全部文件复制到 Git 的 index aka staging area em>,以便他们准备好进行下一次提交。
索引/暂存区最初与您签出的任何提交匹配,这就是建议的下一次提交最初与当前提交匹配的原因。
1正如上面所暗示的,这并不完全是 100% 正确。例如,您可以使用非提交命令将一些单独的文件复制到某处:git hash-object -w
将获取文件内容(不是文件,只是其内容)并将其转换为内部 blob 对象.不过,这种方法相当令人担忧:未引用的 blob 可能会被垃圾收集。为了防止它们被垃圾收集,您有一些时间(默认为 14 天)在此期间您可以构建按名称引用它们的 tree 对象,然后构建 commit引用树对象的对象,并使用引用(例如分支或标记名称)使提交对象具有外部名称,以防止整个程序集被垃圾收集。
唉,这只是一种冗长的 git commit
方式。但是你可以把它分解一下,这样就可以在 13 天(如果你调整你的 GC 年龄设置的话,更长时间)不用提交。不过,这不值得。只需提交,或在 Git 之外保存文件。
您可以隐藏更改,请参阅命令 git stash
。它会清理您的工作目录,将所有内容保存在所谓的“存储堆栈”中。稍后可以使用 stash apply
或 stash pop
重新应用这个保存的状态。
stash 的目的是“记录工作目录和索引的当前状态”,并提供一个干净的工作树。这是您要搜索的内容吗?