Вы можете использовать git reset --soft
, но есть еще кое-что, что вы должны сделать - или, скорее, не сделать - сначала.
Цель состоит в том, чтобы я мог превратить свою функцию в один большой коммит.
В этом случае убедитесь, что не начинаются с:
-- o -- A -- B -- C -- D -- E -- IM <-- integration
\ \ /
\ \ /
F1 -- F2 - FM - F4 <-- feature
Обратите внимание, что я заменил отдельные буквы здесь, чтобы я мог говорить о конкретных коммитах. Что касается самого Git, то двумя наиболее интересными коммитами являются F4
, который является коммитом tip ветви с именем feature
, и IM
, который является коммитом tip ветви с именем integration
.
Коммит, помеченный FM
, не является проблемой, хотя является коммитом слияния. Коммит, помеченный IM
, является проблемой. Это потому, что этот коммит доступен из кончика integration
. Более подробное описание концепции достижимости см. В Think Like (a) Git . Всякий раз, когда сам коммит IM
доступен, начиная с коммита, на который указывает integration
, и работая в обратном направлении (влево), все коммиты, которые достигает сам коммит IM
, достигают. Фиксация IM
приводит к фиксации E
(не проблема) и F4
(проблема!).
Если вы исключаете коммит IM
, так что у вас есть:
-- o -- A -- B -- C -- D -- E <-- integration
\ \
\ \
F1 -- F2 - FM - F4 <-- feature
теперь вы можете git checkout feature
и запустить git reset --soft integration
, в результате чего:
-- o -- A -- B -- C -- D -- E <-- feature (HEAD), integration
\ \
\ \
F1 -- F2 - FM - F4 [abandoned, but remembered as feature@{1}]
Ваши index и work-tree не изменились по сравнению с тем, когда вы зафиксировали коммит F4
, поэтому теперь вы можете запустить git commit
, чтобы превратить текущий индекс в новый коммит. Имя feature
теперь будет указывать на новый коммит:
F <-- feature (HEAD)
/
-- o -- A -- B -- C -- D -- E <-- integration
\ \
\ \
F1 -- F2 - FM - F4 [feature@{1}]
Снимок для нового коммита F
будет совпадать с моментом для коммита F4
:
git diff feature@{1} feature
вообще ничего не печатает. Но родительский нового коммита F
является существующим коммитом E
. (В коммите F
также есть новый автор и коммиттер и соответствующие метки времени "сейчас", что также отличает его от F4
.)