Как я могу проверить, построена ли git-фиксация из другой [дубликат]

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

На самом деле я никогда не пробовал, если это работает с частичным представлением, но оно должно быть imo.

46
задан Anthony Geoghegan 14 September 2016 в 09:42
поделиться

5 ответов

Использовать git merge-base --is-ancestor <commit1> <commit2>

Существует несколько способов найти ответ на этот вопрос. Самый простой способ - использовать

git merge-base --is-ancestor <commit> <commit>

Из документации для git merge-base :

--is-ancestor

Проверить, что первый <commit> является предком второго <commit> и выйдет со статусом 0, если true, или со статусом 1, если нет. Ошибки сигнализируются ненулевым статусом, который не равен 1.

Другие опции

git log с тройной точкой ... нотация

Другой вариант - использовать git log и использовать трехточечную нотацию ..., чтобы сообщить Git, чтобы вывести установленное объединение дочернего элемента, за вычетом установленного пересечения. В основном, это говорит вам о том, как множество коммитов отклонилось друг от друга:

$ git log --oneline --graph --left-right \
--first-parent --decorate <commit1>...<commit2>

Вышеупомянутая команда покажет вам коммиты, достижимые с commit1 или commit2, но не оба, т.е. C1 UNION C2 - C1 INTERSECTION C2 в терминах заданных операций.

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

Вы можете узнать больше о git log и тройной (g1) git-log (1) .

  • gitrevisions (1): Указание диапазонов

    1. g2].
    2. Выбор редакции .

    git branch - содержит опцию

    git-rev -list (1) кажется, что он может быть использован для ответа на этот вопрос. Другой способ - просто привязать метки временных ярлыков к коммиттам, которые вы хотите проверить, а затем использовать опцию --contains для git branch :

    git branch --contains <commit-to-test>
    

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

    Из документации:

    --contains [<commit>]
    

    Только ветви списка, которые содержат указанное commit (HEAD, если не указано).

  • 55
    ответ дан user 19 August 2018 в 06:59
    поделиться
    • 1
      Просто отметим, что --is-ancestor был введен в git v1.8. Ваш пример git branch отлично работал на машине с git v1.7.x. – eoinoc 15 October 2013 в 12:01
    • 2
      Спасибо за -is-ancestor. Однако мне бы хотелось увидеть git log --contains <commit> (который показывает все коммиты, содержащие конкретную фиксацию), похожие на git tag --contains и git branch --contains – Jarl 20 February 2014 в 09:38
    • 3
      Чтобы увидеть статус выхода последней команды, используйте echo $?. – Pang 20 March 2015 в 09:42

    Следующий скрипт оболочки может сделать трюк:

    if git rev-list $SHA1 | grep -q $SHA2 ; then echo "$SHA2 is ancestor of $SHA1"
    elif git rev-list $SHA2 | grep -q $SHA1 ; then echo "$SHA1 is ancestor of $SHA2"
    else echo "$SHA1 unrelated to $SHA2" ; fi
    

    Или, чтобы аккуратно включить его в псевдоним git:

    git config --global alias.related '!function git_related() { if git rev-list $1 | grep -q $2 ; then echo "$2 is ancestor of $1" ; elif git rev-list $2 | grep -q $1 ; then echo "$1 is ancestor of $2" ; else echo "$1 unrelated to $2" ; fi } ; git_related $1 $2'
    
    7
    ответ дан helmbert 19 August 2018 в 06:59
    поделиться
    • 1
      Это лучше, потому что он работает и в старшем git. – phyzome 26 October 2015 в 18:16
    • 2
      Также приятно даже в новых версиях Git, потому что его вывод - именно то, что необходимо. – RichVel 14 September 2016 в 13:07
    • 3
      Вот версия псевдонима (очень полезная), которая также принимает имена ветвей (или HEAD и т. Д.) Вместо просто идентификаторов ids: git config --global alias.related '!function git_related() { commit1=`git log -n 1 --format="%h" $1` ; commit2=`git log -n 1 --format="%h" $2` ; if git rev-list $commit1 | grep -q $commit2 ; then echo "$2 is ancestor of $1" ; elif git rev-list $commit2 | grep -q $commit1 ; then echo "$1 is ancestor of $2" ; else echo "$1 unrelated to $2" ; fi } ; git_related $1 $2' – Peter Reay 12 October 2017 в 15:50
    git log  --oneline -1  OLD_SHA..NEW_SHA
    

    Iff это дает вам некоторый журнал, тогда OLD_SHA является родителем NEW_SHA.

    1
    ответ дан jin 19 August 2018 в 06:59
    поделиться
    if   (( $(git rev-list $1..$2|wc -l) == 0 )); then echo "$2 is ancestor of $1"
    elif (( $(git rev-list $2..$1|wc -l) == 0 )); then echo "$1 is ancestor of $2"
    else echo "$1 and $2 are unrelated"
    fi
    
    2
    ответ дан michas 19 August 2018 в 06:59
    поделиться

    Чтобы создать превосходный псевдоним @ helmbert git related, вот версия, которая также принимает имена ветвей (или HEAD и т. д.) в качестве аргументов, а не просто фиксирует идентификаторы:

    git config --global alias.related '!function git_related() { commit1=`git log -n 1 --format="%h" $1` ; commit2=`git log -n 1 --format="%h" $2` ; if git rev-list $commit1 | grep -q $commit2 ; then echo "$2 is ancestor of $1" ; elif git rev-list $commit2 | grep -q $commit1 ; then echo "$1 is ancestor of $2" ; else echo "$1 unrelated to $2" ; fi } ; git_related $1 $2'
    
    0
    ответ дан Peter Reay 19 August 2018 в 06:59
    поделиться
    Другие вопросы по тегам:

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