어떤 Git 브랜치가 어떤 원격 / 업스트림 브랜치를 추적하는지 어떻게 알 수 있습니까?


824

내가 할 수 있다는 것을 알고 git branch --all로컬 및 원격 지점을 모두 보여 주지만 그들 사이의 관계를 보여주는 데 그렇게 유용하지 않습니다.

어떤 지역 지점이 어떤 원격 지점을 추적하는지 보여주는 방식으로 지점을 어떻게 나열합니까?

답변:


1144

스크립팅을 위해 원하는 경우 매우 많은 도자기 명령입니다.

git branch -vv   # doubly verbose!

git 1.8.3에서는 업스트림 분기가 파란색 으로 표시됩니다 ( " git에서 분기 추적 (있는 경우)은 무엇입니까? "참조).


깨끗한 출력을 원하면 arcresu의 답변을 참조하십시오 .이 답변원래이 답변을 작성한 시점에 존재하지 않았다고 생각되는 도자기 명령을 사용하므로 조금 더 간결하고 병합뿐만 아니라 rebase를 위해 구성된 분기와 함께 작동합니다.


3
위의 첫 번째 방법은 원하는 정보를 제공하지 않습니다. 두 번째는 Kubi의 답변이 효과가 있기 때문에 과잉으로 보입니다. 뭔가 빠졌습니까?
garyp

3
@garyp 당신은 질문을 한 사람이 아닙니다. 먼저 영업 이익은 필요한 것을 제공하고, 두 번째는 제공 정확히 별칭으로 그냥 저장하려면 그가 필요로했던 경우에 그 스크립트에 대한 깨끗한 형태를 원하거나 원했다. 이 질문의 관점에서 kubi의 답변은 몇 가지 외부 정보를 제공하며 하나 이상의 리모컨이있는 경우에는 그렇지 않습니다. 모든 것을 보여주지는 않지만 귀하의 요구를 충족시키는 경우 반드시 사용하십시오.
Cascabel

2
사과해야합니다. 처음에 첫 번째 방법을 실행할 때 무엇을 추적하는지에 대한 정보를 얻지 했으며 명시 적으로 언급해야합니다. 그러나 이제 추적 정보가 표시되므로 설정에 문제가 있었을 것입니다. 그래서 내가 일이 없습니다.
garyp

2
-v와 -vv가 비슷한 결과를 보여주기 때문에 혼란 스러웠습니다. 추적 된 분기는 해시 후 및 가장 최근의 커밋 전에 (기본 OSX homebrew 설치시) 대괄호로 표시됩니다.
jerclarke

3
이 모든 것은 각 분기의 마지막 커밋 해시와 주석을 인쇄합니다.
capybaralet

263

git remote show origin

'원점'을 리모컨의 이름으로 바꾸십시오.


11
이 도자기 명령은 인간에게는 효과적이지만 (도자기 출력을 구문 분석해야하므로 스크립트에서는 그다지 중요하지 않습니다),이 접근법에 대해 마음에 들지 않는 점은 git remote show명령이 실제로 원격 저장소에 연결된다는 것입니다 ... 따라서 어떤 이유로 든
오프라인 상태이거나 리포지토리

17
@pvandenberk git remote show -n origin오프라인 상태에서도 일부 정보를 얻을 수 있습니다 . 로부터 자식 원격 문서 : "; 캐시 된 정보가 대신 사용됩니다 -n 옵션을 사용하면 원격 헤드는 <이름>을 먼저 자식 LS-원격으로 조회되지 않습니다."
Cerran

5
이 명령에 대한 한 가지 이상한 점은 풀 / 푸시에 대해 구성된 로컬 분기가없는 경우에도 원격 분기를 "추적 된"것으로 나열합니다. 나는 항상 이것이 혼란 스럽습니다. 이 출력에서 ​​"추적"이 무엇을 의미하는지는 확실하지 않습니다. 주제에 자식 문서는 원격 지사는 "추적"있는 것처럼 들리게 만이 링크 된 때 / 푸시 / 풀에 대한 로컬 지점 ... 바인딩
호크 아이 파커

문제는 실제로 찾고있는 것을 볼 때까지 모든 원격 이름에 대해 이것을 호출해야한다는 것입니다.
jolvi

2
@jolvi git remote show | xargs git remote show -n모든 리모컨에 대한 통합 추적 정보를보기 위해 실행할 수 있습니다.
Synoli

107

에 대한 매뉴얼 페이지를 보면 git-rev-parse다음 구문이 설명되어 있습니다.

<branchname>@{upstream}예를 들면 master@{upstream},@{u}

@{upstream}branchname 의 접미사 (약식 <branchname>@{u})는 branchname으로 지정된 분기가 빌드되도록 설정된 분기를 나타냅니다. 누락 된 분기 이름은 기본적으로 현재 이름입니다.

따라서 지점의 상류를 찾으려면 master다음을 수행하십시오.

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

각 지점에 대한 정보를 인쇄하려면 다음과 같이 할 수 있습니다.

while read branch; do
  upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
  if [[ $? == 0 ]]; then
    echo $branch tracks $upstream
  else
    echo $branch has no upstream configured
  fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)

# Output:
# master tracks origin/master
# ...

이것은 refs와 config를 수동으로 파싱하는 것보다 깨끗합니다.


나는 그것을 찾았음에도 불구하고 rev-parse에서 그 비트를 이해할 수 없었으므로 명확한 설명에 감사드립니다!
Alice Purcell

3
: "기능 / blahblah"읽어야 While 루프의 폐쇄 문 이름 지사와 자식 흐름을 사용하여 우리의 사람들에 대해서는 done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)참고 글로브 패턴의 끝에 별표.
markeissler

2
git rev-parse --abbrev-ref HEAD@{upstream}현재 지점에서 잘 작동하는 것 같습니다. 또한 멋진 자식 별칭을 만듭니다.
Digikata

while루프 구문은 나에게 조금 이상한 보인다. git for-each-ref ... | while read branch; do ...FIFO가 필요하지 않고 작성된 명령과 동일한 순서로 실행되는 것을 사용할 수 있습니다 .
Daniel Böhmer

적어도 git 2.5.1 이후, 당신은 다음과 같은 하나의 라이너를 가지고 있습니다git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Mat M

81

kubi의 대답에 대한 대안 .git/config은 로컬 저장소 구성을 보여주는 파일을 보는 것입니다 .

cat .git/config


6
또한 git config --get-regex branch
Tamir Daniely

6
또는, 더 구체적으로, '자식 설정 --get-정규 표현식 지점 * 병합.'
요요

41
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

각 지역 지점에 대한 라인을 표시합니다. 추적 지점은 다음과 같습니다.

master <- origin/master

추적하지 않는 것은 다음과 같습니다.

test <- 

니스, 일부 주문 및 TAB 침대 출력을 추가합니다 : 자식에 대한-각-REF --sort 상류 --format = '% (refname : 짧은) % 09 <- % (업스트림 : 짧은)'심판 / 머리
dimir

아름답고 간결하며 출력은 실제로 허용 된 것보다 훨씬 더 읽기 쉽습니다 git branch -vv. 🙏
조기 납의

유일한 문제는 이것을 기억할 수 없다는 것입니다. 그래서 git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
joki

38

를 들어 현재의 지점, 여기에 두 가지 좋은 선택이 있습니다 :

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

또는

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

그 대답은 또한 여기에 있습니다 . (잘못된) 중복으로 표시된 약간 다른 질문에 대한 것입니다.


5
이를 바탕으로 모든 브랜치를 스크립트 친화적 인 방식으로 나열 할 수 있습니다 git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads.
Daniel James

15

현재 지점의 경우 git checkout(아무 지점도 없음) 이라고 말할 수도 있습니다 . 이것은 현재 브랜치에 대한 추적 정보가있는 경우 부작용을 나타내는 no-op입니다.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

충분히 공평하지만 실수로을 입력 할 수 있습니다 git checkout ..
Tomasz Gandor

6

이 별칭을 사용합니다

git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'

그때

git track

5
두 가지 매개 변수를 사용하면 명령이 트랙 분기를 구성한다는 점에 주목할 가치가 있다고 생각합니다.
albfan

3

Olivier Refalo의 답변을 바탕으로

if [ $# -eq 2 ] 
then
    echo "Setting tracking for branch " $1 " -> " $2
    git branch --set-upstream $1 $2
else
    echo "-- Local --" 
    git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
    echo "-- Remote --" 
    REMOTES=$(git remote -v) 
    if [ "$REMOTES" != '' ]
    then
        echo $REMOTES
    fi  
fi

트랙이 구성된 로컬 만 표시합니다.

경로에 git-track 이라는 스크립트에 작성하면 git track 명령을 얻을 수 있습니다.

https://github.com/albfan/git-showupstream 에서 더 정교해진 버전


1

git config --get-regexp "branch\.$current_branch\.remote"

추적중인 리모컨의 이름을 알려줍니다.

git config --get-regexp "branch\.$current_branch\.merge"

추적중인 원격 지점의 이름을 알려줍니다.

$ current_branch를 현재 브랜치 이름으로 바꿔야합니다. 당신은 그것을 동적으로 얻을 수 있습니다git rev-parse --abbrev-ref HEAD

다음의 미니 스크립트는 이러한 것들을 결합합니다. 라는 파일에 파일을 넣고 git-tracking실행 가능하게 만들고 경로에 있는지 확인하십시오.

그럼 당신은 말할 수 있습니다

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

원격 지사 이름은 로컬 지사 이름과 다를 수 있습니다 (보통 그렇지는 않지만). 예를 들면 다음과 같습니다.

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

코드에서 볼 수 있듯이 이것의 핵심은 git config에서 데이터를 추출하는 것입니다. 나는 sed를 사용하여 외부 데이터를 정리합니다.

#!/bin/sh

current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
  sed -e "s/^.* //" -e "s/refs\/.*\///")

echo "$current_branch -> $remote/$remote_branch"

1

깔끔하고 간단한 것입니다. git remote -v현재 분기의 모든 출발지와 업스트림을 보여주는를 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.