Найти точку ветвления с помощью Git?

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

if (e.Status == WebExceptionStatus.ProtocolError)
{
   HttpWebResponse response = (HttpWebResponse)ex.Response;             
   if (response.StatusCode == HttpStatusCode.NotFound)
      System.Diagnostics.Debug.WriteLine("Not found!");
}
413
задан Matt Ball 5 December 2011 в 16:16
поделиться

5 ответов

Возможно, вы ищете git merge-base :

git merge-base находит лучших общих предков между двумя коммитами использовать в трехстороннем слиянии. Один общий предок лучше , чем другой общий предок, если последний является предком первого. Общий предок, у которого нет лучшего общего предка, - это лучший общий предок , то есть база слияния . Обратите внимание, что для пары коммитов может быть более одной базы слияния.

122
ответ дан 22 November 2019 в 23:24
поделиться

Вы можете изучить журнал ссылок ветви A, чтобы найти, из какого коммита он был создан, а также полный история, на которую указывает эта ветка. Рефлоги находятся в .git / logs .

-2
ответ дан 22 November 2019 в 23:24
поделиться

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

В git ветки - это просто текущие имена подсказок разделов истории. У них на самом деле нет сильной идентичности.

Это обычно не большая проблема, поскольку база слияния (см. Ответ Грега Хьюгилла) двух коммитов обычно гораздо полезнее, давая самую последнюю фиксацию, которую две ветки общий.

Решение, основанное на порядке родителей коммита, очевидно, не будет работать в ситуациях, когда ветка была полностью интегрирована в какой-то момент истории ветки.

git commit --allow-empty -m root # actual branch commit
git checkout -b branch_A
git commit --allow-empty -m  "branch_A commit"
git checkout master
git commit --allow-empty -m "More work on master"
git merge -m "Merge branch_A into master" branch_A # identified as branch point
git checkout branch_A
git merge --ff-only master
git commit --allow-empty -m "More work on branch_A"
git checkout master
git commit --allow-empty -m "More work on master"

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

git commit --allow-empty -m root # actual branch point
git checkout -b branch_A
git commit --allow-empty -m  "branch_A commit"
git checkout master
git commit --allow-empty -m "More work on master"
git merge -m "Merge branch_A into master" branch_A # identified as branch point
git checkout branch_A
git commit --allow-empty -m "More work on branch_A"

git checkout -b tmp-branch master
git merge -m "Merge branch_A into tmp-branch (master copy)" branch_A
git checkout branch_A
git merge --ff-only tmp-branch
git branch -d tmp-branch

git checkout master
git commit --allow-empty -m "More work on master"
10
ответ дан 22 November 2019 в 23:24
поделиться

Как насчет чего-то вроде

git log --pretty=oneline master > 1
git log --pretty=oneline branch_A > 2

git rev-parse `diff 1 2 | tail -1 | cut -c 3-42`^
5
ответ дан 22 November 2019 в 23:24
поделиться

Я использовал git rev-list для такого рода вещей. Например, (обратите внимание на 3 точки)

$ git rev-list --boundary branch-a...master | grep "^-" | cut -c2-

выплюнет точку ответвления. Это не идеально; поскольку вы несколько раз объединяли master в ветвь A, это приведет к появлению нескольких возможных точек ветвления (в основном, исходная точка ветвления, а затем каждая точка, в которой вы объединяли master в ветвь A). Однако это должно по крайней мере сузить круг возможностей.

Я добавил эту команду в псевдонимы в ~/.gitconfig как:

[alias]
    diverges = !sh -c 'git rev-list --boundary $1...$2 | grep "^-" | cut -c2-'

так что я могу вызывать её как:

$ git diverges branch-a master
39
ответ дан 22 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: