2010-12-26 2 views
32

Я использовал git-вину, чтобы найти конкретную фиксацию. Теперь я хочу найти ветку, из которой она изначально пришла. (Оттуда я буду использовать название филиала, чтобы найти конкретный билет)Показать первоначальную ветку для фиксации

Давайте определим «исходную ветвь» как «ветвь, в которую была сделана фиксация до того, как ветка была объединена в любую другую ветвь».

ответ

40

Как и другие сказали, если ветвь вы ищете не является локальным в хранилище, на котором вы обвиняете этого совершить (например, филиал только в личном репо отдаленного разработчика), вы болты.

Но если предположить, что желанный ветвь то, что вы можете видеть, и, конечно, у вас есть хэш совершить, скажем d590f2..., частичный ответ, что вы можете сделать:

$ git branch --contains d590f2 
    tests 
* master 

Тогда просто подтвердить, что вы имеете виновника:

$ git rev-list tests | grep d590f2 

конечно, если d590f2 были объединены в более чем одной ветви, вы должны быть более тонкими, чем это.

7

Это не применимо в git. Филиалы являются локальными понятиями для каждого репозитория: ветвь «локальный материал» одного человека может быть совершенно отделена от ветви «местного материала» другого человека. Если вы делаете что-то вроде просмотра своей основной ветки интеграции и вашего запроса, и удаляете все базы слияния между ними, вы должны иметь возможность получить поддерево истории фиксации, которое может пролить некоторое освещение ... или не может , например если вы проследите ссылку от фиксации запроса к «хозяину», вы должны надеяться найти коммиты слияния с полезными комментариями, говорящими о том, откуда произошло слияние ... но эта информация просто информационная, а не записанная каким-то образом предназначена для автоматического получения.

например. gitk some-commit...master (это почти недолго для)

6

Разрыв Git - это не что иное, как «указатель на фиксацию» (это принципиальная концепция, отличная от других известных VCS).

Эта ситуация ясна, совершить на branch-1, совершают B на branch-2:

o A [branch-1] 
    | 
o | B [branch-2] 
| | 

После объединения является становится неясно, является ли А (или В), первоначально был на branch-1 или branch-2:

o [branch-1] [branch-2] 
| 
o merged 
|\ 
| o A 
| | 
o | B 
| | 

Возможно, вы можете догадаться о том, что Git-ветвь является фиксацией A, если вы отметили родительские коммиты A, например release-1, и вы знаете, что этот тег был предоставлен только для коммитов в branch-1.

o [branch-1] [branch-2] 
| 
o merged 
|\ 
| o A 
| | 
o | B 
| | 
| o <release-1] 
| | 
+0

Строго говоря, это невозможно, только если слияние выполняется быстро. Если все слияния выполняются с помощью '--no-ff', git сохраняет историю ветвей. Просто сделайте 'git log -graph $ commit_id .. HEAD' – slebetman

+5

Вообще говоря, в Git коммиты не относятся к ветвям, ветви находятся на фиксации. –

6

Прошу прокомментировать, так как не совсем уверен, но я считаю, что это делает эту работу.

Ниже будет работать только тогда, когда ветви еще указывают на кончике, прежде чем они объединены в мастера, который имеет место в случае, если ветви были на том же репо:

o [master] 
| 
o merged branch "great-feature" into master 
|\ 
| o A [great-feature] 
| | 
o | B 
| | 

Если это не (например, если вы вытащили из другого репо), вы можете воссоздать их вручную.

Сначала получите ветви, где ваша фиксация являются:

$ git branch -a --contains=<sha-of-B> 
*master 
great-feature 

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

$ git log --pretty=oneline <sha-of-B>..great-feature | wc -l 
1 
$ git log --pretty=oneline <sha-of-B>..master | wc -l 
4 

Таким образом, B находится ближе всего к отличной функции, что означает, что он был создан в нем.

Это может быть сделано в хороший сценарий, не стесняйтесь, чтобы добавить его к ответу (я не очень хорошо в этом)

+0

Я думаю, вы можете использовать 'git rev-list -count' вместо того, чтобы переводить' git log' в 'wc'. –

1

я нашел более простой способ сделать это: это в сообщении последнего совершить ошибку git log <sha>..HEAD --merges!

Эта команда показывает слияния, произошедшие между мастером и фиксацией; последний результат фиксации этой командой - это первое комманда слияния, в которое она была включена. Он обычно содержит имя ветки, поэтому даже если ветвь удалена, вы можете найти ее имя.

Чтобы получить только название филиала просто введите git log <sha>..HEAD --merges --oneline |tail -1

+1

Это применимо только в случаях, когда не было быстрого слияния. – meagar

+0

@meagar согласен с тем, что слияние функции с мастером с перемоткой вперед не является хорошей практикой по этой точной причине: в истории приятно видеть, что функция была объединена. – CharlesB

+0

Спасибо, CharlesB, вы только что сэкономили мой бекон. Я случайно удалил удаленную ветку и не имел локального reflog, потому что мой проект был на другом компьютере, к которому у меня нет доступа. Поэтому мне нужно восстановить последнюю фиксацию до слияния, чтобы я смог воскресить ветку. –

4

Сначала убедитесь, вы неправдоподобные изменения от пультов ДУ

$ git fetch --all 

И

$ git branch -a --contains d590f2 

Без -a вариант, вы можете 't обнаружение коммитов, существующих только на удаленных филиалах

+0

Этот ответ наиболее правилен. – kivagant

-1

Это работало достаточно хорошо для меня, чтобы получить имя ветви отстраненно головки в рабочем пространстве Дженкинс:

git show -s --pretty=%d

1

Похоже, это не вопрос, который можно ответить со 100% точностью через мерзавцем ,

git branch --contains --merge <sha1> 

возвращает список всех ветвей, к которым было присоединено объединение, и исходной ветви. --no-merged возвращает все последующие ветви, которые включают фиксацию, потому что они разветвляются после точки слияния.

Таким образом, вы можете получить список каждого слияния, но не оригинальная ветвь и любая ветвь удалена до выполнения команды теряется (или глядя на ваши reflogs)

Результаты

git branch --contains <sha1 for "added feature/inital 1"> 
* develop 
    feature/inital 
    feature/subsequent1 

git branch --contains <sha1 for "added feature/inital 1"> --merged 
* develop 
    feature/inital 

git branch --contains <sha1 for "added feature/inital 1"> --no-merged 
    feature/inital 

Тестовый скрипт

function mkbranch { 
    git checkout -b $1 
    git push --set-upstream origin $1 
} 

# Develop 
mkbranch develop 
for f in 1 2 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "added develop $f"; done 
git push 

# Initial Feature Branch 
mkbranch feature/inital 
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/inital $f"; done 
git push 

# Merge 
git checkout -b develop 
git merge feature/inital 
git push 


# Next Feature Branch 
mkbranch feature/subsequent1 
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done 
git push 
1

Когда на Ответвления «Исходная ветвь» была объединена. Вы можете запустить:

git log <SHA>..HEAD --ancestry-path --merges 

Эта команда покажет все merge фиксаций между <SHA>..HEAD. Вам нужен последний.

Например, для c0118fa фиксации (последний, но один) "оригинальная ветвь" является redesign_interactions

* ccfd449 (HEAD -> develop) Require to return undef if no digits found 
* 93dd5ff Merge pull request #4 from KES777/clean_api 
|\ 
| * 39d82d1 Fix tc0118faests for debugging debugger internals 
| * ed67179 Move &push_frame out of core 
| * 2fd84b5 Do not lose info about call point 
| * 3ab09a2 Improve debugger output: Show info about emitted events 
| * a435005 Merge branch 'redesign_interactions' into clean_api 
| |\ 
| | * a06cc29 Code comments 
| | * d5d6266 Remove copy/paste code 
| | * c0118fa Allow command to choose how continue interaction 
| | * 19cb534 Emit &interact event 

Вы должны запустить:

git log c0118fa..HEAD --ancestry-path --merges 

и прокрутите вниз, чтобы найти последнего коммита. Который является следующим:

commit a435005445a6752dfe788b8d994e155b3cd9778f 
Merge: 0953cac a06cc29 
Author: Eugen Konkov 
Date: Sat Oct 1 00:54:18 2016 +0300 

    Merge branch 'redesign_interactions' into clean_api 
Смежные вопросы