2014-09-24 2 views
1

У меня есть родительская ветвь A с дочерней ветвью B. В ветке B у меня есть две отдельные фиксации. Я слился ветвь В в А с кабачками, как этотСравнение ветвей после слияния git с -squash

git merge --squash B 

Когда я сравнивать ветви А с ответвлением B:

git log A..B 

Он показывает как коммиты из ветви В качестве не-слит. Как я могу сравнить его с раздавленным фиксацией родительской ветви A? так что он не может получить никакой разницы в ответ между двумя ветвями

Благодаря

ответ

3

Цитируя 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, но это правда с не-фактического слияния сквош только истории.)

+0

Есть ли способ получить только раздавленные коммиты? – Arif

+0

Нет. Ключевым моментом здесь является то, что 'git merge --squash' * не делает коммитовую фиксацию * (он вообще не совершает фиксацию!), Поэтому нет ничего, что отличало бы вашу последующую ручную фиксацию от любой другой сделанной вами фиксации , (Вы можете удостовериться, что вы даете такие коммиты специальную строку сообщения фиксации, а затем ищите свою собственную специальную строку, но это требует, чтобы вы придерживались своего самоопределяемого протокола задолго до вашего возможного желания найти такие коммиты.) – torek

+0

torek: Хорошо, спасибо. – Arif

Смежные вопросы