Использовать Git в качестве менеджера отмены-повторения? - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь использовать 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.

    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
    
  • Способность выдвигать репо из репоremote.

Как мне выполнить это поведение?


Я могу реализовать отмену, используя reset HEAD^, но это приведет к потере последней фиксации.(Последний коммит все еще может быть достигнут хэшем коммита, но git log не показывает его, а нажатие на репо приводит к потере коммита навсегда).
Итак, это не работает.

Вместо этого я могу получить checkout HEAD^ для отмены, но сейчас я нахожусь в оторванном состоянии и не могу нажать на пульт.Кроме того, если я внесу какие-либо изменения в состояние отсоединенной головы, ветвь не будет следовать за головой.

1 Ответ

0 голосов
/ 27 мая 2019

Итак, во-первых, нажатие после сброса не означает, что фиксация «потеряна навсегда». Возможно, вы чувствуете, что это не относится к делу, потому что есть другие причины, по которым простой сброс не будет работать так, как вы хотите в Вообще-то, но если вы хотите разработать собственные сценарии использования git, вам нужно начать с правильного понимания того, как он управляет информацией.

И, как вы заметили, не существует простых команд git, которые отображаются на ваши операции «отменить» и «повторить» - потому что вы описываете не то, для чего предназначен git. Это не значит, что он может не делайте этого - это очень гибко. Но это значит, что вы пытаетесь разработать свой собственный вариант использования.

Так что нет простого решения. Вам нужно будет спроектировать крайние случаи и случаи, которые вы закрыли (когда вы отклонились после отмены, вы сказали, что хотите, чтобы старое состояние, которое вы отменяли, все еще было доступно и видимо - но как вы хотите, чтобы это было показано, и как вы хотите сослаться на это?

И после того, как вы выполнили эту проектную работу, вам придется создавать программное обеспечение для ее реализации. Может быть, вы найдете функциональность git, чтобы обеспечить хорошую основу для этого, и в этом случае вы можете написать сценарии, которые объединяют команды git. Но это будет не просто «выполнить эту единственную команду», а, скорее всего, задействовать команды, которые реже используются конечными пользователями (сантехнические команды).

Как мы теперь надеемся, подробный пошаговый ответ выходит за рамки вопросов и ответов о переполнении стека. Так что это возвращает меня к началу - вам нужно начать с подробного понимания того, как git обрабатывает данные, которые вы передаете в него. Если у вас есть конкретные вопросы в том же духе, и если (довольно хорошая, хотя иногда и плохо сформулированная) документация git не проясняет вопросы, то у вас может возникнуть вопрос, на который мы можем разумно ответить.

...