Как можно Я вижу, из какой ветки была разветвлена ​​другая ветка?

C/C++

  1. Отсутствие интегральной функциональности ПОДКАЧКИ
  2. Шаблонный Синтаксис
  3. Вы не можете #define #define (не многопроходный)
  4. несовместимости упаковки Структуры между компиляторами
  5. , символ подписывается или не подписан?

неизменность Java

  1. на краю
  2. No касательно ключевого слова как C#
  3. пробует/ловит блоки везде
  4. Плохая производительность во время выполнения
  5. Весь связанный со строкой материал

Python

  1. Никакое "основное" (я привык к нему!)
  2. подчеркнутые ключевые слова
  3. Ограниченная поддержка потока
  4. "сам" вместо "этого"
  5. Отсутствие C/C++ как синтаксис
27
задан Frerich Raabe 26 January 2011 в 10:50
поделиться

2 ответа

Не уверен, что он охватывает все случаи, но вот функции, которые я придумал:

git_branch_contains() {
    local b=$1
    local c=$2
    IFS_=$IFS
    IFS= 

А вот сценарий для их проверки (git-upstream-branch-test.sh):

#!/usr/bin/env bash
set -eu

. git-upstream-branch.sh

git_commit() {
    if ! [ "${commit_i:-}" ]; then
        commit_i=0
    fi
    (( commit_i++ )) || true
    echo "$commit_i" > "$commit_i"
    git add "$commit_i"
    git commit -qm "c$commit_i"
}

git_merge() {
    if ! [ "${merge_i:-}" ]; then
        merge_i=0
    fi
    (( merge_i++ )) || true
    git merge -m "$merge_i" $1
}

A_TOPOLOGY=${1:-}

mkdir git-upstream-branch-test-repo
cd git-upstream-branch-test-repo
git init -q
if [ "$A_TOPOLOGY" = 10 ]; then
    git_commit
    git_commit
    git checkout -qb dev
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    c=$(git rev-parse HEAD)
    git_commit
    git_commit
    git checkout -q dev
    git checkout -qb t1
    git_commit
    git_commit
    git checkout -q dev
    git_commit
    git_commit
    git rebase --onto "$c" dev t1
elif [ "$A_TOPOLOGY" = 11 ]; then
    git_commit
    git_commit
    git checkout -qb dev
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    git checkout -q dev
    c=$(git rev-parse HEAD)
    git_commit
    git_commit
    git checkout -q master
    git checkout -qb t1
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    git rebase --onto "$c" master t1
else
    git_commit
    git_commit
    git checkout -qb dev
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    if [ "$A_TOPOLOGY" = 4 ] || [ "$A_TOPOLOGY" = 5 ] || [ "$A_TOPOLOGY" = 6 ]; then
        git_merge dev
        git_commit
        git_commit
        git checkout -q dev
        git_commit
        git_commit
        git checkout -q master
    elif [ "$A_TOPOLOGY" = 7 ] || [ "$A_TOPOLOGY" = 8 ] || [ "$A_TOPOLOGY" = 9 ]; then
        git checkout -q dev
        git_merge master
        git_commit
        git_commit
        git checkout -q master
        git_commit
        git_commit
    fi
    git checkout -qb t1
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    if [ "$A_TOPOLOGY" = 2 ] || [ "$A_TOPOLOGY" = 5 ] || [ "$A_TOPOLOGY" = 8 ]; then
        git_merge dev
    elif [ "$A_TOPOLOGY" = 3 ] || [ "$A_TOPOLOGY" = 6 ] || [ "$A_TOPOLOGY" = 9 ]; then
        git checkout -q dev
        git_merge master
    fi
fi
git --no-pager log --oneline --graph --decorate --all
git_upstream_branch t1

Используйте его следующим образом:

$ rm -rf git-upstream-branch-test-repo && ./git-upstream-branch-test.sh NUMBER

Где NUMBER - это число от 1 до 11, чтобы указать, какой случай (топологию) проверять.

\n' local branches=($(git branch --contains "$c" | sed -E 's/^(\*| ) //')) IFS=$IFS_ for b2 in "${branches[@]:+${branches[@]}}"; do if [ "$b2" = "$b" ]; then return 0 fi done return 1 } git_upstream_branch() { local b=$1 local c1=$(git merge-base --fork-point master "$b") || local c1= local c2=$(git merge-base --fork-point dev "$b") || local c2= if ! [ "$c1" ]; then echo dev return fi if ! [ "$c2" ]; then echo master return fi local fp if git merge-base --is-ancestor "$c1" "$c2"; then fp=$c2 else fp=$c1 fi if git_branch_contains master "$fp" && ! git_branch_contains dev "$fp"; then echo master else echo dev fi }

А вот сценарий для их проверки (git-upstream-branch-test.sh):

#!/usr/bin/env bash
set -eu

. git-upstream-branch.sh

git_commit() {
    if ! [ "${commit_i:-}" ]; then
        commit_i=0
    fi
    (( commit_i++ )) || true
    echo "$commit_i" > "$commit_i"
    git add "$commit_i"
    git commit -qm "c$commit_i"
}

git_merge() {
    if ! [ "${merge_i:-}" ]; then
        merge_i=0
    fi
    (( merge_i++ )) || true
    git merge -m "$merge_i" $1
}

A_TOPOLOGY=${1:-}

mkdir git-upstream-branch-test-repo
cd git-upstream-branch-test-repo
git init -q
if [ "$A_TOPOLOGY" = 10 ]; then
    git_commit
    git_commit
    git checkout -qb dev
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    c=$(git rev-parse HEAD)
    git_commit
    git_commit
    git checkout -q dev
    git checkout -qb t1
    git_commit
    git_commit
    git checkout -q dev
    git_commit
    git_commit
    git rebase --onto "$c" dev t1
elif [ "$A_TOPOLOGY" = 11 ]; then
    git_commit
    git_commit
    git checkout -qb dev
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    git checkout -q dev
    c=$(git rev-parse HEAD)
    git_commit
    git_commit
    git checkout -q master
    git checkout -qb t1
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    git rebase --onto "$c" master t1
else
    git_commit
    git_commit
    git checkout -qb dev
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    if [ "$A_TOPOLOGY" = 4 ] || [ "$A_TOPOLOGY" = 5 ] || [ "$A_TOPOLOGY" = 6 ]; then
        git_merge dev
        git_commit
        git_commit
        git checkout -q dev
        git_commit
        git_commit
        git checkout -q master
    elif [ "$A_TOPOLOGY" = 7 ] || [ "$A_TOPOLOGY" = 8 ] || [ "$A_TOPOLOGY" = 9 ]; then
        git checkout -q dev
        git_merge master
        git_commit
        git_commit
        git checkout -q master
        git_commit
        git_commit
    fi
    git checkout -qb t1
    git_commit
    git_commit
    git checkout -q master
    git_commit
    git_commit
    if [ "$A_TOPOLOGY" = 2 ] || [ "$A_TOPOLOGY" = 5 ] || [ "$A_TOPOLOGY" = 8 ]; then
        git_merge dev
    elif [ "$A_TOPOLOGY" = 3 ] || [ "$A_TOPOLOGY" = 6 ] || [ "$A_TOPOLOGY" = 9 ]; then
        git checkout -q dev
        git_merge master
    fi
fi
git --no-pager log --oneline --graph --decorate --all
git_upstream_branch t1

Используйте его следующим образом:

$ rm -rf git-upstream-branch-test-repo && ./git-upstream-branch-test.sh NUMBER

Где NUMBER - это число от 1 до 11, чтобы указать, какой случай (топологию) проверять.

2
ответ дан 28 November 2019 в 05:34
поделиться

хорошо, git merge-base customers/acme_patches stable должен показать общего предка этих двух ветвей.

Вы можете попробовать, например, gitk --left-right customers/acme_patches...stable (обратите внимание на три точки!). Это покажет все коммиты, которые находятся в этих ветках, а не в базе слияния. Использование --left-right помечает каждый коммит стрелкой влево или вправо, в зависимости от того, в какой ветви они находятся, в виде стрелки влево, если они находятся в customer / acme_patches, и стрелкой вправо, если они находятся в стабильном состоянии.

Возможно, также добавьте --date-order, который, как я обнаружил, иногда помогает понять результат.

(Вы можете использовать этот синтаксис с git log --graph, а не с gitk, но imho, это тот случай, когда визуальное отображение графика является большим улучшением).

3
ответ дан 28 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

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