Git. Ветка проверки функций между фиксациями слияния - PullRequest
4 голосов
/ 14 марта 2010

Это немного странно, но я не могу выполнить довольно обычную операцию с git. По сути, я хочу проверить ветку функции, не используя ее заголовок, а используя идентификатор SHA. Этот SHA указывает между слияниями из основной ветви.

Проблема в том, что все, что я получаю, это просто ветка master без коммитов из ветки Feature. В настоящее время я пытаюсь исправить регрессию, введенную ранее в основной ветке.

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

#!/bin/bash

rm -rf ./.git
git init

echo "test1" > test1.txt
git add test1.txt
git commit -m "test1" -a

git checkout -b patches master

echo "test2" > test2.txt
git add test2.txt
git commit -m "test2" -a

git checkout master

echo "test3" > test3.txt
git add test3.txt
git commit -m "test3" -a

echo "test4" > test4.txt
git add test4.txt
git commit -m "test4" -a

echo "test5" > test5.txt
git add test5.txt
git commit -m "test5" -a

git checkout patches
git merge master    

#Now how to get a branch having all commits from patches + test3.txt + test4.txt - test5.txt ???

По сути, все, что мне нужно, это просто оформить ветки "заплатками" с файлами 1-4, но не включая test5.txt.

Выполнение: git checkout [sha_where_test4.txt_entered]

... просто выдает ветку с test1, test3, test4, но исключая test2.txt

Более сложный пример:

#!/bin/bash

rm -rf ./.git
git init

echo "test1" > test1.txt
git add test1.txt
git commit -m "test1" -a

git checkout -b patches master

echo "test2" > test2.txt
git add test2.txt
git commit -m "test2" -a

git checkout master

echo "test3" > test3.txt
git add test3.txt
git commit -m "test3" -a

echo "test4" > test4.txt
git add test4.txt
git commit -m "test4" -a

echo "test5" > test5.txt
git add test5.txt
git commit -m "test5" -a

git checkout patches
git merge master

echo "test6" > test6.txt
git add test6.txt
git commit -m "test6" -a

#Now how to get a branch having all commits from patches + test3.txt + test4.txt - test5.txt ???
git log --topo-order | cat

# Now I need something to help me going back to history 
# without manually calculating that patches~2 sha's
git checkout -b patches.tmp master~1
git merge patches~2

Спасибо.

Ответы [ 3 ]

1 голос
/ 14 марта 2010

Нет такой точки. Здесь у вас есть два параллельных пути разработки: один содержит файлы test1 и test2, а другой - файлы test1, test3, test4 и test5. Вы можете создать такую ​​точку с помощью слияния.

Проверьте SHA1 для коммита, который добавляет test4, и объедините с коммитом, который добавляет test2. Например, после запуска вашего скрипта мой репозиторий выглядит так:

*   b054987 (HEAD, patches) Merge branch 'master' into patches
|\  
* | 5ae790f test2
| * f2a3dac (master) test5
| * 70e8cd2 test4
| * c4102ed test3
|/  
* d448eaa test1

На этом запустите:

% git checkout 70e8c
% git merge 5ae79

В результате получается HEAD, который содержит файлы 1-4:

*   bcc8f7a (HEAD) Merge commit '5ae79' into HEAD
|\  
| | *   b054987 (patches) Merge branch 'master' into patches
| | |\  
| |/ /  
| * | 5ae790f test2
| | * f2a3dac (master) test5
| |/  
|/|   
* | 70e8cd2 test4
* | c4102ed test3
|/  
* d448eaa test1

% ls
test1.txt   test2.txt   test3.txt   test4.txt

Теперь вы можете создать ветку из этой точки, как вы.

1 голос
/ 14 марта 2010

Что касается вашего первого примера, вам нужно воспроизвести test3 и 4 поверх test2: это классический случай rebase --onto:

Начать с:

альтернативный текст http://img169.imageshack.us/img169/2255/gitr1.png

Отметьте текущее размещение патчей и переместите ветку патчей туда, где вы хотели бы закончить (test4):

C:\Prog\Git\tests\rep\main>git checkout patches
Switched to branch 'patches'

C:\Prog\Git\tests\rep\main>git checkout -b tmp
Switched to a new branch 'tmp'

C:\Prog\Git\tests\rep\main>git checkout patches
Switched to branch 'patches'

C:\Prog\Git\tests\rep\main>git reset --hard master~1
HEAD is now at 8448d0f test4

Это дает вам:

альтернативный текст http://img169.imageshack.us/img169/4826/gitr2.png

И просто вернитесь на нужную вам последовательность коммитов:

C:\Prog\Git\tests\rep\main>git checkout tmp
Switched to branch 'tmp'

C:\Prog\Git\tests\rep\main>git rebase --onto tmp tmp~1 patches
First, rewinding head to replay your work on top of it...
Applying: test3
Applying: test4

Что дает:

альтернативный текст http://img52.imageshack.us/img52/372/gitr3.png

Это работает только для линейного набора коммитов, которые нужно перемещать.

0 голосов
/ 14 марта 2010
Операция

A git merge не возвращает назад и не меняет историю, скорее она создает новый коммит, указывающий на две истории, из которых она произошла. Итак, на фотографиях вы видите что-то вроде этого:

  2-----------\
 /             \
1---3---4---5---M (HEAD)

Когда вы перематываете историю, чтобы вернуться к версии 4, вы получаете файлы 1, 3 и 4, но не 2.

...