자식에서 다음 커밋을 어떻게 찾습니까? (ref의 어린이 / 어린이) 커밋 후에는 ref 어떻습니까? 예를 들어 git checkout

ref^전에 커밋을 참조 ref하십시오. 커밋 후에는 ref 어떻습니까?

예를 들어 git checkout 12345다음 커밋을 어떻게 확인합니까?

감사.

추신 : git은 DAG 노드 포인터 구조체 트리입니다. 이 커밋 후에 커밋을 어떻게 찾습니까?



답변

현재 커밋에서 시작하여 커밋을 모두 나열하려면 기본적으로 표준 git log이지만 시간이 지남에 따라 다음과 같은 것을 사용하십시오.

git log --reverse --ancestry-path 894e8b4e93d8f3^..master

여기서 894e8b4e93d8f3은 표시하려는 첫 번째 커밋입니다.


답변

Hudson (현재 Jenkins) Kohsuke Kawaguchi 의 제작자가 방금 게시 (2013 년 11 월) :
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

이 스레드 에서 볼 수 있듯이 DAG (Directed Acyclic Graph)로 표시되는 히스토리를 기반으로하는 VCS 에는 “하나의 부모”또는 “하나의 자식”이 없습니다.

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

커밋 순서는 “topo-order”또는 “date-order”에 의해 수행됩니다 ( GitPro book 참조 ).

그러나 Git1.6.0 부터 커밋의 자식을 나열 할 수 있습니다.

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

참고 : 부모 커밋의 경우 동일한 커밋이 있으며 해당 커밋 객체 ^첫 번째 부모를 의미하는 개정 매개 변수 의 접미어 가 있습니다. ^<n><n>부모를 의미합니다 (즉, rev^ 에 해당 rev^1).

지점에 foo있고 ” git merge bar“를 발행 foo하면 첫 번째 부모가됩니다.
즉 : 첫 번째 부모는 병합 할 때 있었던 지점이고 두 번째 부모는 병합 한 지점의 커밋입니다.


답변

내가 찾은 것은

git rev-list --ancestry-path commit1..commit2

내가 설정 한 경우 commit1현재는 커밋하고 commit2현재의 머리. 이것은 나에게 사이의 경로 구축 모든 커밋의 목록 반환 commit1commit2.

출력의 마지막 행은 commit1의 자식입니다 (commit2의 경로에 있음).


답변

무슨 뜻인지 알아 이전 커밋으로가는 구문이 풍부하지만 다음 커밋으로 이동하는 것은 실망 스럽습니다. 복잡한 역사에서 “다음 커밋은 무엇인가”라는 문제가 다소 어려워 지지만 복잡한 병합에서는 동일한 경도가 ‘이전’커밋과 함께 나타납니다. 간단한 경우, 선형 히스토리가있는 단일 분기 (일부 제한적 커밋의 경우 로컬조차도)에서는 앞뒤로 이동하는 것이 좋습니다.

그러나 이것의 실제 문제는 자식 커밋이 참조되지 않고 역방향으로 연결된 목록이라는 것입니다. 자식 커밋을 찾는 것은 너무 나쁘지 않지만 git이 refspec 로직에 넣고 싶지 않은 검색을 필요로합니다.

어쨌든, 나는이 질문에 도달했습니다. 왜냐하면 나는 한 번에 한 번의 커밋을 수행하고 테스트를 수행하기를 원하기 때문에 때로는 뒤로 물러서지 않고 앞으로 나아가 야하기 때문입니다. 글쎄, 좀 더 생각하면이 솔루션을 생각해 냈습니다.

현재 위치보다 먼저 커밋을 선택하십시오. 아마도 브랜치 헤드 일 수 있습니다. 분기 ~ 10에 있다면 “git checkout branch ~ 9″다음 “git checkout branch ~ 8″다음에 다음을 얻으려면 “git checkout branch ~ 7″등입니다.

필요한 경우 스크립트에서 숫자를 줄이는 것이 정말 쉬워야합니다. git rev-list를 파싱하는 것보다 훨씬 쉽습니다.


답변

두 가지 실질적인 답변 :

한 아이

@Michael의 답변을 바탕으로 child내 별칭을 해킹했습니다 .gitconfig.

기본 경우에 예상대로 작동하며 다목적입니다.

# Get the child commit of the current commit.
# Use $1 instead of 'HEAD' if given. Use $2 instead of curent branch if given.
child = "!bash -c 'git log --format=%H --reverse --ancestry-path ${1:-HEAD}..${2:\"$(git rev-parse --abbrev-ref HEAD)\"} | head -1' -"

현재 분기의 끝을 향한 조상 한 단계를 따라 (다른 커밋이 두 번째 인수로 제공되지 않는 한) 조상을 한 단계 씩 수행하여 HEAD의 자식 (다른 커밋이 필요한 인수가 제공되지 않은 경우)을 제공하는 것이 기본값입니다.

짧은 해시 양식을 원한다면 %h대신 사용하십시오 %H.

여러 자녀

HEAD가 분리되어 있거나 (분기가 없음) 분기에 관계없이 모든 어린이를 갖기 위해 :

# For the current (or specified) commit-ish, get the all children, print the first child
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $1' -"

(가) 변경 $1하는 $*모든 아이들을 인쇄 할 수 있습니다.

또한 --all커밋을 변경 하여 해당 커밋의 조상 인 자식 만 표시합니다. 즉, 지정된 커밋의 “방향으로”만 표시합니다. 이를 통해 많은 어린이의 출력을 한 사람으로 좁힐 수 있습니다.


답변

고유 한 “다음 커밋”이 없습니다. Git의 히스토리는 한 줄이 아닌 DAG이므로 많은 커밋에는 공통 부모 (분기)가있을 수 있으며, 커밋에는 둘 이상의 부모 (병합)가있을 수 있습니다.

특정 분기를 염두에두면 로그를보고 현재 커밋을 상위로 나열하는 커밋을 확인할 수 있습니다.


답변

나는 많은 다른 해결책을 시도했지만 아무도 나를 위해 일하지 않았다. 내 자신을 생각해 내야했다.

다음 커밋 찾기

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

이전 커밋 찾기

function p() {
    git checkout HEAD^1
}