微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 repo 中保存当前更改、返回到旧提交、返回到最近提交并恢复更改? 场景问题我的想法

如何解决如何在 repo 中保存当前更改、返回到旧提交、返回到最近提交并恢复更改? 场景问题我的想法

场景

长话短说,我需要回到旧的提交来运行一些代码,但我最终想回到最近的提交。但是,我做了一些我还没有准备好提交的更改。

出于这个原因,我想隐藏我当前的更改,然后回到旧的提交,做我需要做的事情,然后回到最近的提交,并恢复我最初所做的更改。

注意:这一切都在一个分支上

问题

这样做的最佳方法是什么?

我的想法

我想过做这样的事情:

git stash push
git checkout <old_commit_hash>
#Do some stuff
git checkout <most_recent_commit>
git stash pop

一个想法是提交我当前的更改。最终,当我返回到这个提交时,我可以创建另一个提交来完成我的工作,然后使用 git rebase 将它们压缩成一个新的提交。

解决方法

你可以做你提到的两件事中的任何一件(以修正 eftshift0 mentioned in a comment 为模)。不过,我个人建议避免 git stash;它有太多的极端情况和棘手的问题。 Comitting now 有很多值得推荐的地方。

不管我现在是否进行了提交,我都会做的是使用 git worktree add 在旧提交处创建一个分离的 HEAD 工作树。这使您现有的工作不受干扰。新的工作树与单独制作 git clone 并运行 git checkout hash 一样好,有两点不同:

  • 您不必单独制作 git clone,并且
  • 添加的工作树实际上使用当前的 Git 存储库,因此 Git 禁止它与主工作树位于同一分支,但其他 Git 项目是共享的.

特别是,git stash push(创建新存储)或 git checkout -b(创建新分支)之类的东西在共享存储库中工作,创建一个存储或分支名称,您可以从中看到无论是工作树。这有各种积极和消极的方面,但总体而言是很小的。但是,额外的工作树允许您以分离的 HEAD 模式构建和运行旧提交并完成您需要的事情,而不会弄乱您当前的工作树,因此您可以保留正在进行的内容、临时文件、输入,输出等等,如果有用的话,把它弄乱。如果有用,您还可以将添加的工作树与输入和输出混在一起:这些是单独的工作树(本地文件系统上的不同目录树),因此它们不会相互干扰。

一个警告:在使用 git worktree add 之前,请确保您的 Git 版本至少为 2.15。如果您的 Git 早于 2.5,则您根本没有 git worktree,您需要升级您的 Git。如果您的 Git 版本为 2.14 或更低版本,请确保在两周内在添加的工作树中完成所有工作,然后将其删除。

有关 git worktree 的详细信息,请参阅 its documentation。一个简单的 git worktree add --detach ../old-commit a123456 可以检查旧提交 a123456。 (从技术上讲,您不需要 --detach,但我喜欢在这里明确的想法。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。