git reset - странное поведение - PullRequest
0 голосов
/ 19 октября 2019

Я хотел раздавить 3 коммита, прежде чем нажать на ветку develop в удаленном репозитории. Я думал, что буду использовать git reset --soft HEAD~3 (чтобы удалить мои последние 3 коммита и сделать их за один коммит с новым сообщением коммита). Однако, когда я написал команду, я заметил, что она не сбрасывает только 3 коммита, а примерно 20 (не волнуйтесь, у меня была резервная копия). После этого я подумал, что попробую еще раз с предыдущими коммитами (просто чтобы проверить поведение), и увидел, что это не только удаление 3 коммитов, но и случайное число.

Откуда это может быть? (Примечание: коммит "HEAD ~ 3" имел конфликты слияния при извлечении до этого, которые были решены мной, но я не уверен, что это может быть так).

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Если вы сбросите коммит merge , то вы удалите все коммиты, которые были объединены в вашу ветку ...

Предположим, у вас была еще одна ветка с 10 коммитами, которую вы слилив вашу develop ветку. Если вы запустите сейчас git reset --soft HEAD~1, то вы увидите все изменения из этих 10 коммитов.

более подробное объяснение

Предположим, у вас есть следующие коммиты:

abc123 last commit (HEAD)
def456 merge feature2-branch (with 10 commits)
ghi789 add feature
jkl123 fix bug

ГОЛОВА (где вы находитесь в своей истории) находится на abc123. Когда вы сейчас выполните команду git reset --soft HEAD~3,

  • , это означает НЕ означает: git, удалите последние 3 коммита.
  • это означает означает: git, пожалуйста, переместите HEAD в jkl123, но оставьте все файлы как есть.

Так что git не имеет понятия числани коммитов, ни коммитов слияния, ни чего-либо другого.

0 голосов
/ 19 октября 2019

Похоже, что вы слились с вашей веткой, а затем выполните сброс.

Вот план, который может сработать.

  1. В вашей ветке найдите коммит до слияния.
  2. git checkout last_commit_before_merge
  3. git branch -b feature/_X_attempt2
  4. Вы раздавливаете - я рекомендую git rebase --interactive
  5. Следуйте своему обычному потоку: объедините мастер, нажмите, создайте PR

После того, как вы вернетесь к своемуперед слиянием вы можете просто перебазировать master в вашей ветке с помощью git rebase -i master. См. Слияние против ребазинга .


Примечание. Это все в контексте того, что вы не делитесь ветками с другими, потому что перебазировка (как и ваш метод git reset) переписывает историю.

...