По шкале от 1 до 10 мои навыки работы с git равны -5 для всего, кроме вытягивания, фиксации, толчка.
Я выполнял git rebase в своей ветке, чтобы объединить мои слияния, используя git rebase --interactive [my first commit hash]
Но, как мы все знаем, это откроет редактор со всеми коммитами после моего первого коммита.
Я хотел втиснуть свой второй коммит в первый коммит, поэтому я разумно решил: «Эй, позвольте мне использовать ту же команду, но с хешем первого коммита, который я вижу перед хешем моего первого коммита». Так я и сделал.
Диаграмма для справки
master ------- commitX --- my branch --- commit1 --- commit2 --- ... --- commitINF.
|__________another branch____commitA
Я хотел сжать commit2 в commit1. Для этого я поэкспериментировал с запуском git rebase --interactive commitX
, а затем сжал commit2 в commit1 и запустил git push --force-with-lease
После этого я посмотрел на свою ветку, и commit2
был раздавлен в commit1
, все в порядке. Но теперь моя ветка также показывает commitX
из another branch
в истории работы моей ветки со всеми ее изменениями.
Что я сделал не так в этом случае? Как мне в следующий раз раздавить первые два коммита в ветке?
Что еще более важно, как мне удалить commitX из истории моей ветки БЕЗ, удалив его из истории работы репозитория, чтобы он по-прежнему отображался в своей ветке, где он принадлежит?
Ваша диаграмма не очень хороша, но я думаю, что вы хотели нарисовать это:
V -- W -- commitX (master)
| |
| commit1 -- commit2 -- commitN (mybranch)
|
commitA (anotherbranch)
Правильно будет сказать, что если вы хотите объединить commit2 и commit1 вместе, вы должны запросить интерактивную перебазировку, которая начинается как commitX. Это создаст список TODO, начиная с commit1, который вам нужен для выполнения интерактивной перебазировки.
Остальная часть вашего вопроса бессвязна, учитывая диаграмму, которую я представил. Возможно, я не совсем правильно угадал, что вы хотели изобразить.
Но ваше использование таких фраз, как «моя ветка также показывает ...», похоже, подразумевает, что вы думаете, что «ветвь» - это длинная тонкая вещь, состоящая из множества коммитов. Это не так. «Ветвь» в Git — это коммит один, и это все. «История» — это просто то, что вы получаете, когда начинаете идти назад от каждой фиксации к ее родителю.
И так иди никогда не останавливается — пока не доберешься до первого сделанного коммита. На моей диаграмме, например, верный означает, что commitX является частью истории моей ветки, а также W и V. Если вы можете достичь фиксации, идя назад, это часть истории.
Выбрал ваш ответ, потому что он в конечном итоге помог мне лучше понять, проследить историю и исправить ее. Спасибо!
В моем случае оказалось, что это произошло из-за человеческого фактора, как всегда. Я вытащил коммит, из которого я выполнил свою перебазировку, commitA
, из журнала коммитов репо, не имея в виду, что журнал коммитов показывает коммиты все на ветвях все.
Так что на самом деле, я не перебазировал поверх commitX, как я думал, я перебазировал поверх commitA.
Хотя в конечном итоге мои коммиты 1 и 2 были объединены вместе, как я и хотел, он также перебазировал мою ветку поверх anotherbranch
, поэтому я увидел commitA в истории моей ветки.
Решение состояло в том, чтобы просто запустить еще одну интерактивную перебазировку в моей ветке, но на этот раз мне нужно было убедиться, что я запускаю ее на коммите Sha последнего коммита НА МАСТЕРЕ (в этом примере — commitX).
Вам может быть полезно знать, что вещи, которые вы делаете в Git, почти всегда тривиально невыполнимы. См., например, мой stackoverflow.com/a/71750947/341994 при восстановлении после неправильной интерактивной перебазировки.
Другая проблема в том, что вы можете не понять, как увидеть красивый график ситуации? Обычное заклинание git log --graph --oneline --decorate
Наконец, вам может быть полезно прочитать мой bitinteractive.com/…
Да, вы правы, именно эту схему я и имел в виду. Думаю, я понимаю, что вы имеете в виду, когда говорите о ветке, но с моей стороны возникло недопонимание относительно того, что произошло. Перебазирование из commitX успешно сжало commit2 в commit1. Но в моем случае также произошло перебазирование головы mybranch поверх commitA. Итак, теперь моя история коммитов в графическом интерфейсе (в данном случае на битбакете) показывает commitA а потом commit1, а родителем моей ветки теперь является другая ветка. Я не уверен, почему это произошло вообще, поэтому мой вопрос.