使用Git作为撤消重做管理器吗?

时间:2019-05-26 20:53:33

标签: git undo-redo

我正试图将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^来撤消操作,但是现在我处于分离状态,无法将其推送到远程。另外,如果我从分离的头部状态进行任何更改,则分支不会跟随头部。

1 个答案:

答案 0 :(得分:0)

因此,首先,在重置后进行推送并不意味着提交会“永远丢失”,您可能会觉得这是不对的,因为还有其他原因导致简单的重置不会像您期望的那样进行一般,但是如果您想为git设计自己的用例,则需要首先了解如何管理git的正确概念。

而且,正如您所注意到的,没有简单的git命令可以映射到您的“撤消”和“重做”操作-因为您所描述的不是git设计的目的,这并不意味着它可以不是-它非常灵活。但这确实意味着您正在尝试设计自己的用例。

因此,没有一个简单的解决方案。您将不得不设计边缘案例,以及蒙蔽的案例(撤消后出现分歧时,您曾说过希望残废的旧状态仍然可以访问和看到-但您希望如何显示它,以及如何引用它?

完成设计工作后,您将必须构建用于实施该软件的软件。也许您会发现git的功能为其提供了良好的基础,在这种情况下,您可以编写将git命令串在一起的脚本。但这不仅是“运行此命令”,而且可能涉及最终用户不常用的命令(卫生命令)。

如目前所希望的那样,详细的分步解答已超出堆栈溢出问答的范围。因此,这使我重新开始-您需要首先详细了解git如何处理提交给它的数据。如果您对这些问题有特定的疑问,并且(虽然不错,尽管有时措辞不好)git文档未阐明问题,那么您可能会有一个我们可以合理回答的问题。

相关问题