Цитируя git merge
documentation, --squash
означает:
Производят рабочее дерево и индекс состояния, как если бы произошло реальное слияние (за исключением для информации о слиянии), но на самом деле не совершайте фиксацию или не перемещайте HEAD
, а также запись $GIT_DIR/MERGE_HEAD
, чтобы вызвать следующую команду git commit
, чтобы создать фиксацию слияния. Это позволяет создать единую фиксацию поверх текущей ветви, эффект которой совпадает с объединением другой ветви (или более в случае осьминогов).
Другими словами, после того, как вы получили git commit
результат, у вас есть обычная фиксация, а не фиксация слияния. Дерево , связанное с этим обычным фиксацией - то, что вы получаете в рабочей директории, если вы его проверяете, - соответствует дереву, которое вы получили, выполнив слияние, но фактическое слияние не записывается.
Учитывая установку вы описали, вы должны были это перед запуском git merge --squash B
:
...- o <-- A
\
o - o <-- B
, как коммиттер график. После того, как git checkout A; git merge --squash B; git commit -m squash-B
теперь у вас есть:
...- o ----- * <-- HEAD=A
\
o - o <-- B
Обратите внимание, что там нет фиксации-график связи между последним коммитом *
и либо из двух фиксаций, которые исключительно по отрасли B
. дерево для фиксации *
такой же, как тот, который вы получили бы, делая регулярные слияния, но коммит график отличается: реальное слияние выглядело бы так:
...- o ----- *
\ /
o - o
(я ушел из отраслевые метки здесь, чтобы подчеркнуть, что это не то, что у вас есть на самом деле).
Точка-точка обозначения A..B
просит «совершает достижима из B
, минус совершает достижима из A
».График выглядит следующим образом (то же самое, как выше мало, просто повторил здесь для ясности):
...- o ----- * <-- HEAD=A
\
o - o <-- B
Два o
фиксаций вдоль нижней части достижимы из B
, наряду с верхними o
и любыми фиксаций; но верхние o
и любые более ранние фиксации достигают от A
, начиная с фиксации, отмеченной *
, и работают в обратном порядке, поэтому они исключены. Это оставляет только две команды o
: одна на кончике ветки B
, а другая перед ней.
Обратите внимание, что если вы сделали реальное слияние, A..B
будет пустым, как и все совершает достижимо от кончика ветви B
бы также достижим от кончика ветви A
. (И, напротив, B..A
бы просто совершить *
так, что совершают бы достижим из A
, но не от B
, но это правда с не-фактического слияния сквош только истории.)
Есть ли способ получить только раздавленные коммиты? – Arif
Нет. Ключевым моментом здесь является то, что 'git merge --squash' * не делает коммитовую фиксацию * (он вообще не совершает фиксацию!), Поэтому нет ничего, что отличало бы вашу последующую ручную фиксацию от любой другой сделанной вами фиксации , (Вы можете удостовериться, что вы даете такие коммиты специальную строку сообщения фиксации, а затем ищите свою собственную специальную строку, но это требует, чтобы вы придерживались своего самоопределяемого протокола задолго до вашего возможного желания найти такие коммиты.) – torek
torek: Хорошо, спасибо. – Arif