Как я нахожу следующую фиксацию в мерзавце? (ребенок/дети касательно)

Хитрость при использовании CASE / WHEN заключается в использовании агрегатных функций, таких как MAX, а затем группирование по всем неагрегированным столбцам:

SELECT 
   band,
   Month,
   MAX(CASE 
          when status = 'one' then response_avg
      END) as One,
   MAX(CASE 
          when status = 'two' then response_avg
      END) as Two
FROM t1
GROUP BY band,
   Month
218
задан Rob Bednark 4 July 2018 в 04:53
поделиться

5 ответов

(Это запустилось как ответ на дублирующийся вопрос. Я сделал немного редактирования света для чистки его.)

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

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

A <-B <-C <-D <-E   <-- last
        ^
        |
         \--------- middle

Используя middle~2 следует за стрелками дважды от C назад к A. Таким образом, как мы перемещаемся от [1 110] до [1 111]? Ответ: мы запускаем в [1 112], с помощью имени last, и работаем назад, пока мы не добираемся до [1 114], запись точек, которые мы посещаем по пути . Тогда мы просто перемещаемся насколько мы хотим в направлении [1 115]: продвиньтесь на один шаг к [1 116], или два к [1 117].

Это особенно важно, когда у нас есть ответвления:

          D--E   <-- feature1
         /
...--B--C   <-- master
         \
          F--G   <-- feature2

, Какая фиксация является одним шагом после C? Нет никакого корректного ответа, пока Вы не добавляете к вопросу: в направлении функции ___ (заполняют пробел).

Для перечисления фиксаций между [1 119] (исключая [1 120]) самостоятельно и, скажем, G мы используем:

git rev-list --topo-order --ancestry-path master..feature2

Эти --topo-order удостоверяется, что даже в присутствии сложного ветвления-и-слияния, фиксации выходят в топологически отсортированном порядке. Это только требуется, если цепочка не линейна. --ancestry-path ограничение означает, что, когда мы работаем назад от [1 124], мы только перечисляем фиксации, которые имеют фиксацию C как один из их собственных предков. Таким образом, если graph— или соответствующий блок его anyway— на самом деле похожи на это:

A--B--C   <-- master
 \     \
  \     F--G--J   <-- feature2
   \         /
    H-------I   <-- feature3

простой запрос формы feature2..master перечисляет фиксации J, G и I, и F и H в некотором порядке. С [1 132] мы выводим из строя H и I: они не потомки [1 135], только [1 136]. С [1 137] мы удостоверяемся, что фактический порядок перечисления J, тогда G, тогда F.

git rev-list управляют разливами эти идентификаторы хеша на его стандартном выводе, один на строку. Для перемещения одного шага вперед в направлении [1 142], тогда, мы просто хотим последний строка.

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

git rev-list --topo-order --ancestry-path --reverse <id1>...<id2> | head -1

, чтобы просто получить "следующую фиксацию в направлении id2", и существует очень длинный список фиксаций, эти git rev-list, команда может получить поврежденный канал, когда это пытается записать в [1 146], который прекратил читать его вход и вышел. Так как ошибки повреждать-канала обычно игнорируются оболочкой, это главным образом работает. Просто удостоверьтесь, что они проигнорированы в [1 165] Ваш использование.

также заманчиво добавить -n 1 к эти git rev-list команда, наряду с [1 149]. Не делайте этого! Это делает git rev-list остановка после обхода одного шага назад , и затем инвертируйте список (с одной записью) фиксаций, которые посещают. Таким образом, это просто производит <id2> каждый раз.

Важное Примечание к примечанию

стороны, что с фрагментами графика "ромбовидного" или "бензольного кольца":

       I--J
      /    \
...--H      M--...  <-- last
      \    /
       K--L

перемещение вперед одной фиксации от [1 152] к [1 153] получит Вас или I или K. Нет ничего, что можно сделать об этом: обе фиксации являются одним шагом вперед! Если Вы тогда запускаете с получающейся фиксации и делаете другой шаг, Вы теперь посвящаете себя, какой бы ни соединяют Вас каналом, запустился на.

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

git rev-list --topo-order --reverse --ancestry-path A..B > /tmp/list-of-commits

Затем посетите каждую фиксацию в этом списке, по одному, и Вы получите всю цепочку. Эти --topo-order удостоверится, что Вы совершаете нападки I - и J в том порядке, и K - и L в том порядке (хотя нет никакого простого способа предсказать, сделаете ли Вы пару I-J прежде или после пары K-L).

1
ответ дан 23 November 2019 в 04:13
поделиться

Каждый коммит хранит указатель на своего родителя (родителей, в случае слияния (стандартного) коммита).

Итак, нет способа указать на дочернюю фиксацию (если она есть) от родителя.

0
ответ дан 23 November 2019 в 04:13
поделиться

Создатель Hudson (теперь Jenkins) Kohsuke Kawaguchi , только что опубликованный (ноябрь 2013 г.):
kohsuke / git-children- of :

Для данного коммита найти непосредственных потомков этого коммита.

#!/bin/bash -e
# given a commit, find immediate children of that commit.
for arg in "$@"; do
  for commit in $(git rev-parse $arg^0); do
    for child in $(git log --format='%H %P' --all | grep -F " $commit" | cut -f1 -d' '); do
      git describe $child
    done
  done
done

Как показано в этой ветке , в VCS на основе истории, представленной DAG (направленный ациклический график) , нет «одного родителя» или «одного дочернего элемента».

        C1 -> C2 -> C3
      /               \
A -> B                  E -> F
      \               /
        D1 -> D2 ----/

Упорядочивание коммитов осуществляется по «топо-порядку» или «по дате» (см. книгу GitPro )

Но поскольку Git1.6.0 , вы можете перечислить дети коммита.

git rev-list --children
git log --children

Примечание: для родительских коммитов возникает та же проблема с суффиксом ^ в параметре редакции, означающим первый родительский объект этого объекта фиксации. ^ означает -й родительский объект (т.е. rev ^ эквивалентен rev ^ 1 ).

Если вы находитесь в ветке foo и выполняете команду « git merge bar », то foo будет первым родительским элементом.
То есть: первый родительский элемент - это ветка, в которой вы были при слиянии, а второй - фиксация ветки, в которую вы слились.

34
ответ дан 23 November 2019 в 04:13
поделиться

Есть нет уникального "следующего коммита". Поскольку история в Git - это группа DAG, а не строка, многие коммиты могут иметь общего родителя (ветки), а коммиты могут иметь более одного родителя (слияния).

Если вы имеете в виду конкретную ветку, вы можете посмотреть ее журнал и увидеть, какой коммит перечисляет текущую ветку в качестве ее родительской.

6
ответ дан 23 November 2019 в 04:13
поделиться

Если все дочерние коммиты находятся в некоторой ветке, вы можете использовать gitk --all commit ^ .. , где "commit" что-то идентифицирующее фиксацию. Например, если сокращенный SHA-1 коммита - c6661c5, введите gitk --all c6661c5 ^ ..

Вам, вероятно, потребуется ввести полный SHA-1 в ячейку gitk «SHA1 ID:». Вам понадобится полный SHA-1, который в этом примере можно получить с помощью git rev-parse c6661c5

В качестве альтернативы git rev-list --all --children | grep '^ c6661c5883bb53d400ce160a5897610ecedbdc9d' создаст строку, содержащую всех дочерних элементов этого коммита, предположительно независимо от того, есть ли ветвь.

2
ответ дан 23 November 2019 в 04:13
поделиться
Другие вопросы по тегам:

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