Git: Как найти все коммиты в ветви A, которые произошли в производной ветви B, слитые обратно в A? - PullRequest
4 голосов
/ 02 июня 2010

В Git, учитывая (1) ветвь A и (2) ветвь B, полученную из A в некоторый момент в прошлом и затем объединенную обратно в A, как я могу найти все коммиты сейчас в A, которые возникли в B

Цель состоит в том, чтобы идентифицировать набор изменений работы, выполненной в B, теперь в A, чтобы быстрее отследить проблемы.

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

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Предполагая, что B был полностью объединен с A, вы можете использовать:

git cherry -v <merge-commit>^ <topic-branch>

... где:

  • <merge-commit>^ является родителем коммита, в который вы объединили ветку темы.
  • <topic-branch> это ветка, которую вы хотите проверить
1 голос
/ 02 июня 2010

Взгляните на git-resurrect.sh скрипт в области contrib/ источников git.

usage: git resurrect [-a] [-r] [-m] [-t] [-n] [-b <newname>] <name>

    -b, --branch ...      save branch as  instead of <name>
    -a, --all             same as -l -r -m -t
    -k, --keep-going      full rev-list scan (instead of first match)
    -l, --reflog          scan reflog for checkouts (enabled by default)
    -r, --reflog-merges   scan for merges recorded in reflog
    -m, --merges          scan for merges into other branches (slow)
    -t, --merge-targets   scan for merges of other branches into 
    -n, --dry-run         don't recreate the branch

<b>git-resurrect</b> attempts to find traces of a branch tip called <name>,
and tries to resurrect it.  Currently, the reflog is searched for checkout
messages, and with `-r' also merge messages.  With `-m' and `-t', the
history of all refs is scanned for "<i>Merge <name> into other</i>" /
"<i>Merge <other> into <name></i>" (respectively) in commit subjects,
which is rather slow but allows you to resurrect other people's
topic branches.
1 голос
/ 02 июня 2010

Как только ветвь была объединена, коммит слияния является маркером ее существования. Предполагая, что вы не слишком много работаете со своими сообщениями о коммитах, вы можете сделать что-то вроде этого:

#!/bin/bash

die_with_usage() {
    # add a git alias for merged-commits to be able to call it like this
    echo "usage: git merged-commits <branch-merged> <branch-merged-into>" 1>&2
    exit 1
}

if [ $# -ne 2 ]; then
    die_with_usage
fi

# Find the merge commits
merges=($(git log --pretty=%H --grep="Merge branch '$1' into $2"))

if [ ${#merges[@]} -eq 0 ]; then
    echo "error: no such merges found!" 1>&2
    die_with_usage
fi

for merge in ${merges[@]}; do
    # The first parent is the merged-into branch
    bar=$merge^1
    # The second is the merged branch
    foo=$merge^2

    # Find the merge base
    base=$(git merge-base $bar $foo)

    # Show the commits
    git log --pretty=%H $base..$foo
done

Я подумал, что было бы полезно просто напечатать SHA1 и позволить вам уйти и потом делать с ними то, что вам нравится, но, конечно, вы можете поиграть с форматом вывода этого последнего git log.

(И я даже проверил это! Могу держать это рядом; это крутой маленький лайнер.)

Еще одна вещь, которую вы можете сделать (в будущем) - это принять сообщение коммита слияния по аналогии с git.git, который, по сути, встраивает шортлог слитых коммитов в сообщение слитого коммита (здесь пример ). Когда-нибудь есть встроенный способ сделать это (он был объединен со следующим, но не главным), но сейчас вам придется свернуть свой собственный, или сделать смелый ход и построить из следующего.

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