我正试图将Git用作对目录所做的更改的撤消重做管理器。
我本质上想要以下东西:
撤消命令,该命令将目录的内容重置为上一次提交的状态(仅当存在上一次提交时)
State
-----
-> * 3b1e4d8 F
* fb2c608 E
* cdd8ac5 D
* aefe3ee C
* 458bb4f B
* 17fa95e A
currently "active" commit: F (represented by ->)
Undo
----
* 3b1e4d8 F
-> * fb2c608 E
* cdd8ac5 D
* aefe3ee C
* 458bb4f B
* 17fa95e A
Note that F is still visible and not lost
Undo
----
* 3b1e4d8 F
* fb2c608 E
-> * cdd8ac5 D
* aefe3ee C
* 458bb4f B
* 17fa95e A
重做命令,它撤消了撤消操作,即将目录的内容重置为下一次提交的状态。
Redo
----
* 3b1e4d8 F
-> * fb2c608 E
* cdd8ac5 D
* aefe3ee C
* 458bb4f B
* 17fa95e A
不应丢失任何提交。也就是说,任何提交都不应变得“悬而未决”,并且必须始终可以访问,并且必须始终显示在git log中。
Change G
----
-> * f12ea02 G
| * 3b1e4d8 F
| /
* fb2c608 E
* cdd8ac5 D
* aefe3ee C
* 458bb4f B
* 17fa95e A
Note that the commit F is not lost from history/log
我如何完成此行为?
我可以使用reset HEAD^
来实现撤消,但这会导致最新的提交丢失。 (最新的提交仍可以通过提交哈希来实现,但是git log
不会显示它,并且推送回购将导致永远丢失该提交。)
因此,这是行不通的。
相反,我可以使用checkout HEAD^
来撤消操作,但是现在我处于分离状态,无法将其推送到远程。另外,如果我从分离的头部状态进行任何更改,则分支不会跟随头部。
答案 0 :(得分:0)
因此,首先,在重置后进行推送并不意味着提交会“永远丢失”,您可能会觉得这是不对的,因为还有其他原因导致简单的重置不会像您期望的那样进行一般,但是如果您想为git设计自己的用例,则需要首先了解如何管理git的正确概念。
而且,正如您所注意到的,没有简单的git命令可以映射到您的“撤消”和“重做”操作-因为您所描述的不是git设计的目的,这并不意味着它可以不是-它非常灵活。但这确实意味着您正在尝试设计自己的用例。
因此,没有一个简单的解决方案。您将不得不设计边缘案例,以及蒙蔽的案例(撤消后出现分歧时,您曾说过希望残废的旧状态仍然可以访问和看到-但您希望如何显示它,以及如何引用它?
完成设计工作后,您将必须构建用于实施该软件的软件。也许您会发现git的功能为其提供了良好的基础,在这种情况下,您可以编写将git命令串在一起的脚本。但这不仅是“运行此命令”,而且可能涉及最终用户不常用的命令(卫生命令)。
如目前所希望的那样,详细的分步解答已超出堆栈溢出问答的范围。因此,这使我重新开始-您需要首先详细了解git如何处理提交给它的数据。如果您对这些问题有特定的疑问,并且(虽然不错,尽管有时措辞不好)git文档未阐明问题,那么您可能会有一个我们可以合理回答的问题。