Это мое понимание того, что ответ, основываясь на комментариях:
Когда вы делаете перебазироваться, совершающие на вашем токе ветвь «отменена», а затем «повторно применена», но на самом деле они не отменены, они «запомнены» * и повторно применены с новыми идентификаторами, так, например, если я смотрю в git reflog show FeatureB
, я получаю что-то вроде этого:
7832f89 [email protected]{0} rebase finished: refs/heads/FeatureB onto f4df3
efd3fed [email protected]{1} commit: B
f3f3d43 [email protected]{2} commit: A
2f32fed [email protected]{3} branch: Created from HEAD
Так как @Jefromi сказал, что оригиналы все еще существуют (SHA из A и B совершают в рефлоге не то же самое, что и в git log, что соответствуют А 'и В').
Аналогично, git reflog show FeatureC
выглядит следующим образом
32873ef [email protected]{0} commit: W
17dafb3 [email protected]{1} rebase finished: refs/heads/FeatureC onto 89289fe
893eb78 [email protected]{2} commit: Z
a78b873 [email protected]{3} commit: Y
e78b873 [email protected]{4} commit: X
378cbe3 [email protected]{5} branch: Created from HEAD
Опять же, оригинальный Z, Y и X коммиты все еще там
Таким образом, решение моей проблемы заключается в создании нового филиала FeaturesBC
выключить ГОЛОВКА мастера (например), то вишневого выбрать совершает FeatureB {2 & 1}, а затем FeatureC {4, 3, 2}, и (возможно) W:
git checkout master
git checkout -b FeaturesBC
git cherry-pick f3f3d43
git cherry-pick efd3fed
//etc...
(Это, похоже, работал, мне пришлось заново делать некоторые из тех же слияний, но это было не так уж плохо)
Редактировать, из Jefromi:
Вишневый сбор, возможно, не было необходимости ,Вы также можете просто восстановить ветви, где ветви были до перебазирования:
git branch FeatureB-old efd3fed
git branch FeatureC-old 893eb78
Или, если вы хотите, чтобы выбросить нормированное положение FeatureB и FeatureC, возвращаясь туда, где они были раньше:
git branch -f FeatureB efd3fed
git branch -f FeatureC 893eb78
Наконец, обратите внимание: если вы хотите, вы можете использовать другие обозначения, указанные в логах - например, [email protected]{2}
вместо 893eb78
. Это означает «вторая предыдущая позиция FeatureC». Будьте осторожны, чтобы использовать это сразу после просмотра reflog, хотя, потому что, как только вы снова обновите ветвь (переместите ее, зафиксируйте на ней ...), вместо этого вместо 0ddbb3 будет ссылаться на 17dafb3.
Как @Jefromi прокомментировал мой вопрос:
Вы должны, вероятно, создали новую ветку от мастера или featureC (так называемого featuresABC, говорят), и объединен друг в него, оставляя ветви функций нетронутыми. Хорошо сохранять независимую историю различных ветвей функций.
* Для того, чтобы быть точным, старые фиксации объекты просто оставили в хранилище. В конечном итоге они будут обрезаны, так как вы не хотите, чтобы репо, полное старых оборванных коммитов; это произойдет в первый раз, когда запущен git gc
, а фиксации не менее двух недель (настроено gc.pruneExpire
).
на самом деле я запутался, почему вы перебазировались на всех. Вероятно, вы, должно быть, создали новую ветку мастера или featureC (называемую функциямиABC, скажем) и объединили их в нее, оставив ветки функций неповрежденными. Хорошо сохранять независимую историю различных ветвей функций. – Cascabel
@Jefromi, потому что я все еще учился ... – Benjol
@Jefromi, я добавил то, что я понял из ваших комментариев, в качестве ответа, если вы хотите проверить (или даже потребовать его для себя) – Benjol