2014-09-17 2 views
2

У меня есть несколько коммитов в ветке «feature-1», которые являются частью некоторой функции (позволяет назвать ее функцией X). В ветке существует также несколько слияний с мастером, это означает, что функция X может быть распределена между другими коммитами.GIT Как создать патч из не последовательных коммитов

представить себе также, что перебазироваться не использовали, поэтому мы можем иметь что-то вроде:

J - K - L - M - N     [master] 
    \    /(1) 
    - A - B - C - D - E    [Branch feature-1] 

Графический Вышесказанное означает, что:

  • После фиксации ямайских ветвь была создана функция-1.
  • На мастере выполнены некоторые коммиты (K, L, M, N), они могут быть получены из внешних функций.
  • В функции ветвления-1 существует три коммитов A, B, C.
  • В функции ветвления-1 происходит слияние (1) от ведущего устройства в эту ветвь.
  • На ветви функционально 1 существует еще два коммиты, чтобы закончить эту функцию X.

Графически мы имеем:

J - K - L - M - N        [master] 
    \    
    - A - B - C - K - L - M - N - D - E   [Branch feature-1] 

Можем ли мы получить совершает A, B, C, D, E из функции -1 в файл патча?

ОБНОВЛЕНИЕ: Существует еще один большое ограничение, изменяет А, В, С, D, Е были объединены также в мастер после совершения E, так что формат патч не может обнаружить, что присутствует на функции-1, который не на хозяине.

ответ

0

Наконец единственный способ, который я нашел использует Баш скрипт. Этого можно избежать, если GIT был использован правильно, я имею в виду, если бы слияния применялись только к master (в этом случае работают решения Andrew's).

Другим хорошим решением было перебазироваться вместо слияния, во всяком случае, это не является ни главной темой или мой фактический сценарий, так что единственное решение, которое я нашел, чтобы получить файл заплатки делает:

#!/bin/bash 
if [[ $# -lt 1 ]]; then 
    echo "Ilegal number of parameters." 
    echo "Usage $0 PartialCommitMessage [file.patch]." 
    exit 1; 
fi 
if [[ $# -eq 1 ]]; then 
    FILE_NAME=$1.patch 
else 
    FILE_NAME=$2 
fi 
#First line needed in patch files. 
echo "From: [email protected]" > $FILE_NAME 
for rev in `git log --reverse --pretty=format:%H --grep=$1` 
do 
    cmd="git diff $rev^ $rev >> $FILE_NAME" 
    echo $cmd 
    eval $cmd 
done 

Для найдите коммиты, которые содержат некоторый номер билета (i.е: 1122), просто запустите:

Использование:

./createPatch.sh 1122 

Выход:

Файл называется 1122.patch, содержащий изменения Diff.

0

Формат-патч принимает те же самые спецификации редакции, что и большинство других команд git.

Это должно генерировать исправления только для тех коммитов, которые доступны для функции-1, но не для мастера.

git format-patch master..feature-1 

Обновление

, предполагающее мастер, указывая на слиянии фиксацию можно попробовать

git format-patch master^1..feature-1 

В противном случае вы можете жёстко УОЙ для слияния фиксации на месте хозяина в выше.

Если ваша история хуже, чем тогда вы, возможно, придется смотреть на что-то вроде

непроверенных

for rev in ${git rev-list --first-parent feature-1 ^ROOT_SHA 
do 
    git format-patch -1 ${rev} 
done 
+0

Это верно, если функция-1 не была объединена с мастером. Я добавлю обновление в вопрос. – sgroh

+0

@sgroh, в каком направлении произошло слияние? Здесь вы говорите, что 'feature-1' был объединен в' master', но в вопросе вы говорите, что 'master' был объединен в' feature-1'. – Chris

+0

@Chris. Слияние происходит в обоих направлениях сначала в функцию 1 (это приводит к приложению K, L, M, N от мастера). Второй слияние обновляет мастер со всеми изменениями, которые находятся в функции-1, это означает, что после этого хозяин будет содержать все изменения. – sgroh

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