Как определить исходную ветку конкретной ветки? - PullRequest
38 голосов
/ 16 июня 2011

У меня есть ветка в git, и я хочу выяснить, из какой ветки он изначально был разветвлен и при какой фиксации.

Github, кажется, знает, поскольку, когда вы выполняете pull-запрос, он обычно автоматически устанавливаетветвь, в которую он должен войти, но я не могу понять, как сделать это вручную из командной строки.

Позвольте мне добавить конкретный пример:

master -- ongoing development
2.2    -- stable maintenance

Ветвь функции feature был создан (при коммите B ниже) и работал (B', C' & E') и объединен с веткой-источником для получения C и D

 feature branch:    B'-C'-C--D--E'
                   /     /       
 source branch: A--B--C--D--E-- ...

Теперь я хочу объединить feature обратно в его источник, но я не уверен, было ли это изначально ответвлением от master или 2.2.Для того, чтобы объединить функцию в правильный источник, существует ли программный способ выяснить, является ли ветвь источника master или 2.2?

Ответы [ 3 ]

18 голосов
/ 21 июня 2011

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

Команда для установки этого отношения из командной строки:

git branch --set-upstream <branch> [<start-point>]

Просмотр вывода git-diff может дать вам подсказку:

git diff <mybranch>..master # commits in master that are not in mybranch
git diff <mybranch>..2.2 # commits in 2.2 that are not in mybranch

Вполне вероятно, что тот, в котором зафиксировано меньше коммитов, является точкой ветвления (но это не гарантируется, очевидно.

Вы также можете использовать gitk или git log для просмотра:

gitk --all
git log --graph --color --decorate --oneline --all
2 голосов
/ 22 июня 2011
git show-branch [--all]
git merge-base

Первый покажет вам ветви и даст вам информацию о слиянии. Второй поможет вам понять отношения между двумя конкретными ветвями (где они в последний раз расходились).

1 голос
/ 11 июля 2017
git branch -r

С параметром --contains показывает только ветви, которые содержат указанный коммит (другими словами, ветви, чьи концы коммитов являются потомками именованный коммит). С --merged, только ветви объединяются в именованные commit (то есть ветви, чьи коммиты достижимым из указанного коммита) будет указан. С --no-merged будут перечислены только те ветки, которые не были объединены с указанным коммитом. Если аргумент отсутствует, по умолчанию используется HEAD (т.е. верхушка текущей ветки).

Учитывая, что предыдущий коммит уже был передан в удаленную ветку, вы можете отфильтровать доступные удаленные ветви, используя ключ --contains.

# git branch -r --contains HEAD~1
  origin/HEAD -> origin/master
  origin/master

или

git branch -r --contains refs/heads/<local_branch_name>~1

Если у вас есть еще 2 невыдвинутых коммита, измените число соответствующим образом, чтобы достичь уже выдвинутого коммита:

# git branch -r --contains HEAD~2
  origin/<parent_remote_branch>

Если количество локальных невыдвинутых коммитов неизвестно, вы можете переключаться, пока не получите результат, например:

#!bin/bash

i=0;
res=; 
while [ -z "$res" ]; do 
    res=$(git branch -r --contains HEAD~$i); 
    echo "$i"; 
    i=$(($i+1)); 
done

echo "$res"

Конечно, вы можете ограничить количество итераций, чтобы быть в безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...