以下情况已经发生过几次了,我正在寻找一种自动化的方法来阻止自己重复犯错。解决方案说“只要记住”或“不要这样做”不会被标记为正确。
很多时候,我会在 git 分支上工作,有一些未提交的代码,然后很快需要对另一个分支进行更改。我习惯于git stash
存储未提交的代码,git checkout
切换到另一个分支,进行更改并提交,然后切换git checkout
到另一个分支。希望我记得git stash pop
。问题是我并不总是记得,特别是如果我最终不得不在另一个分支上进行一些更改,而这些更改最终会花费几个小时/几天的时间。
有没有一个 git hook 可以让我写,当我 checkout 一个有存储的分支时,它会给我发送一条小消息?比如:
$ git checkout foo
Switched to branch 'foo'
You have 1 stash on this branch, use `git stash pop` to unstash it.
答案不必太花哨,但我认为这样可以省去很多麻烦。“只要记得跑git stash list
”这样的答案不会被接受。
建议的解决方案:临时提交。
举例来说,我们来看看典型的情况:
这确实是一种很常见的情况。但你确实会这样做:
现在让我们改变一下方向。只对那些你想删除但可能需要事后检查的片段使用存储。
对于有效但未完成的代码,不要存储,而是提交。为此使用几个快速别名:
您是否急需更改分支?
git wip
并在其他地方签出。当您切换回您的分支时,请撤消临时提交git unwip
并恢复工作。你会很快习惯它,并且存储将保持(它应该被命名为)纸箱。(它与 Windows 一样,不会立即删除内容,但让你偶尔检查和恢复最近删除的文件(如果需要))
由于分支可能在历史记录中共享相同的提交,因此很难判断存储是否与特定分支相关。我们可以使用钩子post-checkout来提醒您可能忘记的存储条目。
在我们切换/签出分支后,
post-checkout
会调用。它接收 3 个参数:前一个头、当前头和一个标志,指示它是分支签出还是文件签出。我们可以测试部分或全部存储条目。如果当前头是存储条目的第一个父级,我们说存储位于此分支上。以下是我能想到的一些已知问题。默认存储描述中有类似
WIP on master
或 的字词WIP on dev
,但我们不会在钩子中使用它们。多个分支可能引用同一个提交,并且在其中一个分支上创建的存储可以应用于另一个 head。有时我们可能会处理没有分支名称的分离 HEAD,也可以接受存储应用。钩子只是尽可能多地打印提醒消息,这可能会很嘈杂。另一个问题是,如果您没有很好地维护存储条目,存储条目列表会变得很长,并且挂钩可能需要相当长的时间。您只能在 while 循环中测试前 N 个条目。
钩子无法报告这样的存储。在 上创建一个存储 A
main
,创建一个新的提交,然后创建另一个存储 B,切换到 以main
调用钩子。由于 A 的父级不是当前头,因此不会报告。更复杂的情况是 有main
多个分叉头,并且在它们上创建了存储。仅报告与当前头相关的存储。当您在本地分支上进行一些实验并在这些测试头之间重置时,这种情况很常见。如果您也对这些存储条目感兴趣,则 while 循环中的测试需要更多代码。