가장 최근의 커밋 순서대로 Git 브랜치 목록을 어떻게 얻을 수 있습니까?


1322

"최신"분기가 맨 위에있는 Git 저장소의 모든 분기 목록을 얻고 싶습니다. 여기서 "최신"분기는 가장 최근에 커밋 된 분기입니다 (따라서 하나 일 가능성이 높습니다) 주의를 기울이고 싶습니다).

Git을 사용하여 (a) 최신 커밋으로 분기 목록을 정렬하거나 (b) 마지막 커밋 날짜와 함께 분기 목록을 기계가 읽을 수있는 형식으로 가져올 수있는 방법이 있습니까?

최악의 경우, 항상 git branch모든 분기 목록을 가져 와서 출력을 구문 분석 한 다음 git log -n 1 branchname --format=format:%ci각 분기의 커밋 날짜 를 얻기 위해 실행할 수 있습니다. 그러나 이것은 새로운 프로세스를 시작하는 데 비용이 많이 드는 Windows 상자에서 실행되므로 분기당 한 번 Git 실행 파일을 시작하면 분기가 많은 경우 느려질 수 있습니다. 하나의 명령으로이 모든 것을 할 수있는 방법이 있습니까?


2
stackoverflow.com/a/2514279/1804124 더 나은 답변이 있습니다.
펀던

12
@Spundun, 넌 날 잃었 어. 펄과 sed를 통해 파이프 된 것을 포함하여 여러 명령의 조합은 Git이 이미 가지고있는 명령을 사용하는 것보다 "더 나은"방법은 무엇입니까?
Joe White

36
git for-each-refJakub Narębski 의 대답과 관련하여 @Spundun : 원격 분기를 refs/remotes/대신 전달 refs/heads/할 수 있습니다 (또는 공백으로 구분하여 전달할 수 있음). refs/tags/태그 또는 refs/세 종류 모두에 대해
jakub.g

4
git 2.7 (Q4 2015)부터는 더 이상 없습니다 for-each-ref! 당신은 직접 사용할 것입니다 git branch --sort=-committerdate: 아래 내 답변을
VonC

답변:


1874

; --sort=-committerdate옵션을 사용하십시오 git for-each-ref.

또한 사용할 수 힘내 2.7.0 이후 에 대한 git branch:

기본 사용법 :

git for-each-ref --sort=-committerdate refs/heads/

# Or using git branch (since version 2.7.0)
git branch --sort=-committerdate  # DESC
git branch --sort=committerdate  # ASC

결과:

결과

고급 사용법 :

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'

결과:

결과


15
완전한! 을 추가하여 출력을 참조 이름으로 만 제한 할 수도 있습니다 --format=%(refname).
Joe White

35
이것은 나에게 더 낫다 :git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname) %(committerdate) %(authorname)' | sed 's/refs\/heads\///g'
saeedgnu

2
@ilius : 왜 사용하지 :shortname않습니까?
Jakub Narębski 2019

37
@ilius : @BeauSmith가 쓴 것처럼 : git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/. git-for-each-ref (1) 맨 페이지의 말 : ref append의 모호하지 않은 짧은 이름의 경우 :short.
Jakub Narębski

76
이것은 해시, 메시지, 커밋 날짜를 기준으로 오름차순으로 정렬되는 각 버전의 마지막 커밋의 상대 연령을 포함하는 컬러 버전입니다. 나는 위의 너희들로부터 모든 아이디어를 훔쳤다. [alias]섹션의 .gitconfig에 있으며 좋아합니다. br = for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
마이클 퍼시

124

가장 최근의 커밋 순서로 정렬 된 Git 브랜치 이름 목록…

Jakub의 답변Joe의 팁을 확장 하여 다음은 "refs / heads /"를 제거하여 출력에 분기 이름 만 표시합니다.


명령:

git for-each-ref --count=30 --sort=-committerdate refs/heads/ --format='%(refname:short)'

결과:

최근 Git 지점


4
--format=%(refname:short)에 의존 하는 대신 사용할 수도 있습니다 cut.
Chaitanya Gupta 5

3
REMOTE 저장소에이를 수행 할 수있는 방법이 있습니까?
Allan Bowe 2016 년

10
aah-@ jakub.g는 이미 설명했습니다 : refs / heads / 대신 refs / remotes /를 전달하는 원격 브랜치를 얻을 수 있습니다. 완전한!!
Allan Bowe 2016 년

git rb명령이 따옴표로 묶어야 한다는 것을 명심해야합니다.git config --global alias.rb "for-each-ref --count=20 --sort=-committerdate refs/heads/ --format=\'%(refname:short)\'"
Michael Discenza

2
그리고 이제 이것을 사용하여 git branch로컬, 원격 또는 모든 분기를 얻는 것이 git-branch (예 : -r, -a)와 같이 작동합니다. git branch -r --sort=committerdate --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'
phord

89

다른 두 가지 답변을 결합한 최적의 코드는 다음과 같습니다.

git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'

10
조금이라도 MOR 표 출력을 얻을 수 있도록 최적화 :git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(authorname) %(refname:short)'
schoetbi

2
어떤 이유로 나는 창문에 큰 따옴표를 사용해야했지만 그렇지 않으면 잘 작동합니다 :)
amenthes

1
@schoetbi이 코드는 nikolay의 코드와 똑같습니다. 테이블 형식으로 변경 한 것은 무엇입니까?
Enrico

@Enrico와 같은 것들에 대해 궁금해하는 다른 사람들. nikolay는 schoetbis 제안을 사용하여 답변을 변경했습니다. 항상 같은 길이의 날짜를 먼저 이동하면 결과가 더 표처럼 보입니다.
조니

83

다음은 최신 커밋이있는 모든 분기를 나열하는 간단한 명령입니다.

git branch -v

가장 최근의 커밋으로 주문하려면

git branch -v --sort=committerdate

출처 : http://git-scm.com/book/en/Git-Branching-Branch-Management


11
git branch -av로컬이 아닌 브랜치를보고 싶다면
Scott Stafford

34
이것은 질문에 따라 커밋 날짜별로 정렬되지 않습니다.
Cas

1
git branch -v나열된 각 커밋 날짜를 쉽게 포함시킬 수 있습니까?
dumbledad

1
<pre> git branch -v --sort = committerdate </ pre>는 어떻습니까?
iraj jelodari

2
대단해. git branch -va --sort=-committerdate가장 최근에 변경된 지점이 맨 위에있는 비 로컬 지점을 표시 하고 싶습니다 .
클린턴 블랙 모어

61

다음 별칭을 사용합니다.

recent = "!r(){git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'}; r"

어떤 생산 :

결과

'|'사용 분리합니다.


1
좋은 별명! column -ts'|'쉼표 문자가 로케일의 상대 타임 스탬프 안에 발생할 수 있다면 문자를 제안 하고 파이프합니다.
Björn Lindqvist

1
좋은 별칭, 대단히 감사합니다. 현재 가지를 다른 색이나 처음에 *로 표시하도록 향상시킬 수 있습니까?
elhadi dp ıpɐɥ ן ǝ

2
최소한 최신 버전의 git '%(HEAD) ...'에서는 형식 문자열의 시작 부분에 추가 하여 sed명령을 통하지 않고 동일한 효과를 얻을 수 있습니다.
Joshua Skrzypek

5
자식 별칭으로 작동하도록 이것을 자식으로 만들 수 없습니다. 내가 사용해야했다[alias] recent = !git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)'|column -ts'|'
Wesley Smith

11
색상을 얻으려면 항상 --color =를 추가해야했습니다. git for-each-ref --sort=-committerdate refs/heads --format='%(HEAD)%(color:yellow)%(refname:short)|%(color:bold green)%(committerdate:relative)|%(color:blue)%(subject)|%(color:magenta)%(authorname)%(color:reset)' --color=always|column -ts'|'}
user3342930 2016 년

40

이전 예제를 참조하여 나에게 가장 적합한 것을 만들 수있었습니다.

git for-each-ref --sort = -committerdate refs / heads / --format = '% (authordate : short) % (color : red) % (objectname : short) % (color : yellow) % (refname : short ) % (색상 : 재설정) (% (색상 : 녹색) % (분할 자 : 상대) % (색상 : 재설정)) '

출력 스크린 샷


1
stackoverflow.com/a/33163401/6309 에서 제안한 것처럼 직접 git 브랜치를 사용하는 것보다 멋지고 화려 합니다. +1
VonC 2016 년

2
이것은 다른 사람들과 달리 나를 위해 즉시 사용되었으므로 투표했습니다.
Casey

1
정말 잘 작동했습니다! 감사! :-)
FrozenTarzan 2016 년

1
Ditto-방금 시도한 다른 많은 사람들과 달리이 제품은 기본적으로 작동했습니다. 감사.
Dan Nissenbaum

2
이것은 깨끗하고 깔끔합니다. 때때로 나는 이렇게 원격과 git for-each-ref --sort=-committerdate refs/heads/ refs/remotes --format='%(authordate:short) %(authorname) %(color:red)%(objectname:short) %(color:yellow)%(refname:short)%(color:reset) (%(color:green)%(committerdate:relative)%(color:reset))'
저자 이름을

38

또한 중복없이 색상, 태그 및 원격 참조가 필요했습니다.

for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '! a[$0]++'

인용이 어려울 수 있으므로 Bash의 별칭은 다음과 같습니다.

alias glist='for ref in $(git for-each-ref --sort=-committerdate --format="%(refname)" refs/heads/ refs/remotes ); do git log -n1 $ref --pretty=format:"%Cgreen%cr%Creset %C(yellow)%d%Creset %C(bold blue)<%an>%Creset%n" | cat ; done | awk '"'! a["'$0'"]++'"

$ <여기 명령> AWK : 1 호선 AWK 근처의 구문 오류 : 근처 라인 1을 구제
제이미 메이슨

@GotNoSugarBaby 예제와 같이 작은 따옴표를 사용하고 있습니까? 어떤 쉘을 사용하고 있습니까? 배쉬는 그 캐릭터에게 특별한 의미를 부여합니다.
estani

이 예제를 / bin / bash (GNU bash, 버전 4.0.28 (1) -release (i386-pc-solaris2.11))에서 직접 복사하고 붙여 넣은 상태에서이 코드를 실행했지만 그 이후로 실행했습니다. / bin / bash (GNU bash, 버전 3.2.48 (1)-릴리스 (x86_64-apple-darwin12))에서 작동하므로 작동하지 않습니다. 감사합니다.
Jamie Mason

@GotNoSugarBaby 4.2.25 (1) 릴리스 (x86_64-pc-linux-gnu) nad를 3.x에서 사용해 보았습니다. 나는 그것이 어떤 문제인지 확실하지 않지만 ... bash 문제 대신 git 버전 관련 문제가있을 수 있습니다. 어쨌든, 나는 그것이 당신을 위해 일하게되어 기쁩니다!
estani

1
@MichaelDiscenza는 모든 것을 머리에 파이프합니다. 추가하는 것입니다| head -n20 끝에 입니다. 별명을 사용하는 경우 따옴표 안에 포함 되는지 확인하십시오 .
estani

24

다른 답변은 통과 -vv하여 자세한 출력을 얻지 못하는 것 같습니다 .

git branch -vv커밋 날짜별로 정렬 하고 색상 등을 유지 하는 하나의 라이너가 있습니다 .

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ct $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ct)"\t$REPLY"; done | sort -r | cut -f 2

커밋 날짜를 추가로 인쇄하려면이 버전을 대신 사용할 수 있습니다.

git branch -vv --color=always | while read; do echo -e $(git log -1 --format=%ci $(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g') 2> /dev/null || git log -1 --format=%ci)" $REPLY"; done | sort -r | cut -d ' ' -f -1,4-

샘플 출력 :

2013-09-15   master                  da39a3e [origin/master: behind 7] Some patch
2013-09-11 * (detached from 3eba4b8) 3eba4b8 Some other patch
2013-09-09   my-feature              e5e6b4b [master: ahead 2, behind 25] WIP

아마 더 읽기 쉬운 여러 줄로 나눌 수 있습니다.

git branch -vv --color=always | while read; do
    # The underscore is because the active branch is preceded by a '*', and
    # for awk I need the columns to line up. The perl call is to strip out
    # ansi colors; if you don't pass --color=always above you can skip this
    local branch=$(echo "_$REPLY" | awk '{print $2}' | perl -pe 's/\e\[?.*?[\@-~]//g')
    # git log fails when you pass a detached head as a branch name.
    # Hide the error and get the date of the current head.
    local branch_modified=$(git log -1 --format=%ci "$branch" 2> /dev/null || git log -1 --format=%ci)
    echo -e "$branch_modified $REPLY"
# cut strips the time and timezone columns, leaving only the date
done | sort -r | cut -d ' ' -f -1,4-

이것은 또한 다른 주장과 함께 작동해야합니다. git branch-vvr를 들어 원격 추적 분기 -vva를 나열 하거나 원격 추적 및 로컬 분기를 모두 나열 경우 .


-vv정말 도움이 될 수 있습니다. 그러나이 솔루션은 여전히 ​​각 지점에 대해 새로운 프로세스를 생성하므로 OP는 피하려고했습니다.
musiphil

실제로 git branch의 의미를 구체적으로 정의하지는 않지만의 의미 -vv만 정의 -v하므로 -vv와 동일해야합니다 -v.
musiphil

2
이게 최선이다. -avv를 추가하면 원격 지점도 고려됩니다. 감사합니다!
고퍼 칸

@musiphil 내 자식 브랜치 맨 페이지 섹션 -v, -vv, --verbose에는 다음 내용이 포함되어 있습니다.If given twice, print the name of the upstream branch, as well
Perleone

@ Perleone : 나는 그 정보를 어떻게 얻었는지 모르겠지만, 당신은 옳고, 나는 옳습니다. 감사!
musiphil

23

자식 2.7 (Q4 2015) 지점을 직접 사용하여 정렬 소개 git branch:
참조가 aa3bc55 커밋 , aedcb7d 커밋 , 1511b22 커밋 , f65f139 커밋 , (2015 9월 23일), aedcb7d 커밋 , 1511b22 커밋 , ca41799 커밋 (2015년 9월 24일을)과 Karthik Nayak ( )에 의해 커밋 f65f139 , ... (2015 년 9 월 23 일 ) . (가 합병 - Junio C 하마노 -7f11b48 커밋 2015 15 시월)KarthikNayak
gitster

특히 aedcb7d를 커밋하십시오 .

branch.c: ' ref-filter'API 사용

참조 정렬을 반복하기 위해 ' branch.c'use ' ref-filter'API를 작성하십시오. 이렇게하면 ' branch.c'에 사용 된 대부분의 코드 가 'ref-filter '라이브러리 .

옵션을 추가합니다--sort=<key> :

주어진 키를 기준으로 정렬하십시오.
접두사-값의 내림차순으로 정렬 할 입니다.

당신은 사용할 수 있습니다 --sort=<key>옵션을 여러 번 ,이 경우 마지막 키가 기본 키가됩니다.

지원되는 키는의 키 와 동일git for-each-ref 합니다.
정렬 순서의 기본값은 전체 참조 이름 ( refs/...접두사 포함 )을 기준으로 정렬하는 것입니다 . 분리 된 HEAD (있는 경우)를 먼저 표시 한 다음 로컬 브랜치 및 원격 추적 브랜치를 나열합니다.

여기:

git branch --sort=-committerdate 

또는 (깃 2.19에서 아래 참조)

# if you are sure to /always/ want to see branches ordered by commits:
git config --global branch.sort -committerdate
git branch

Karthik Nayak ( )의 commit 9e46833 (2015 년 10 월 30 일) 도 참조하십시오 . 도움 : Junio ​​C Hamano ( ) . (의해 병합 Junio C 하마노 - -415095f 커밋KarthikNayak
gitster
gitster 2015 11월 3일)

숫자 값에 따라 정렬 할 때 (예 : --sort=objectsize 할 때 두 심판이 같은 값을 가질 때 폴백 비교가 없습니다. 이로 인해 Johannes Sixt ( $ gmane / 280117 )가 지적한 바와 같이 예기치 않은 결과가 발생할 수 있습니다 (즉, 동일한 값으로 참조 목록을 나열하는 순서를 미리 결정할 수 없음 ).

따라서 다른 기준이 같을 때마다 refname을 기반으로 알파벳 비교로 대체됩니다 .

$ git branch --sort=objectsize

*  (HEAD detached from fromtag)
      branch-two
      branch-one
      master

Git 2.19에서는 기본적으로 정렬 순서를 설정할 수 있습니다. 이미
git branch설정이 branch.sort되어있는 것과 같은 설정을 지원합니다 . 참조 560ae1c 커밋 에 의해 (2018 8월 16일) 사무엘 Maftoul를 (``) . (가 합병 Junio C 하마노 - -d89db6f 커밋 , 2018년 8월 27일)git tagtag.sort

gitster

branch.sort:

이 변수는로 표시 될 때 분기의 정렬 순서를 제어합니다 git-branch.
"없이--sort=<value> "옵션을 제공 이 변수의 값이 기본값으로 사용됩니다.


원격 브랜치를 나열하려면 git branch -r --sort=objectsize . -r플래그는 대신 현지 지사의 원격 지점을 나열됩니다.


Git 2.27 (Q2 2020), " git branch"및 기타 "for-each-ref "변형 --sort=<key>은 우선 순위가 높은 순서대로 여러 옵션을 허용 했지만 "--ignore-case "처리 및 refname과의 타이 브레이킹이 수정되었습니다.

Jeff King ( )의 commit 7c5045f , commit 76f9e56 (2020 년 5 월 3 일)을 참조하십시오 . (가 합병 - Junio C 하마노 -6de1630 커밋 2020 08 월)peff
gitster

ref-filter: 모든 사용자 정렬 후에 만 ​​대체 참조 이름 정렬을 적용합니다.

서명자 : Jeff King

Commit 9e468334b4 ( " ref-filter: 알파벳 비교에 대한 대체", 2015-10-30, Git v2.7.0-rc0- 배치 # 10에 나열된 병합 )는 ref-filter의 정렬을 참조 이름 비교와 비교하도록 가르쳤다. 그러나 모든 정렬 키가 소진 된 후가 아니라 사용자 의 단일 " "키에 대한 비교 결과를 무시하여 잘못된 레벨에서 수행했습니다 .
--sort

이것은 하나의 " --sort"옵션에 대해서는 올바르게 작동 했지만 여러 옵션에 대해서는 작동하지 않았습니다.
refname과 첫 번째 키의 관계를 끊고 두 번째 키를 전혀 평가하지 않습니다.

더 흥미로운 일을하기 위해 때때로이 대체를 적용했습니다! 문자열 비교가 필요한
" taggeremail" 와 같은 필드의 strcmp()경우 0 인 경우에도 결과를 반환 합니다.
그러나 " value"와 같은 숫자 " "필드의 taggerdate경우 대체를 적용했습니다. 이것이 바로 다중 정렬 테스트에서이를 놓친 이유입니다.taggeremail 입니다. 주요 비교로 됩니다.

이제 더 엄격한 테스트를 추가하여 시작하겠습니다. 두 개의 태그 이메일, 날짜 및 참조 이름의 모든 조합을 표현하는 커밋 세트가 있습니다. 그런 다음 정렬이 올바른 우선 순위로 적용되었음을 확인할 수 있으며 문자열과 값 비교기를 모두칩니다.

그것은 버그를 보여 주며, 수정은 간단합니다 : 폴백을 외부 compare_refs()함수 로 옮기십시오.ref_sorting 키가 소진 된 .

외부 함수 "ignore_case"에는 각 개별 ref_sorting요소 의 일부이므로 플래그 가 없습니다 . 사용자의 키를 일치시키기 위해 사용하지 않았기 때문에 이러한 폴 백이 수행해야 할 작업에 대해 논란의 여지가 있습니다.
그러나 지금까지 우리는 그 깃발을 존중하려고 노력해 왔으므로 가장 침략적인 것은 계속 그렇게 노력하는 것입니다.
현재 코드의 모든 호출자는 모든 키에 대해 플래그를 설정하거나 아무것도 설정하지 않기 때문에 첫 번째 키에서 플래그를 가져올 수 있습니다. 사용자가 키의 대소 문자 구분을 실제로 뒤집을 수있는 가상의 세계에서, 우리는이 케이스를 담요 " --ignore-case" 와 구분하기 위해 코드를 확장 할 수 있습니다 .


이 옵션으로 리모컨을 나열하려면 다음을 추가하십시오.-r
Troy Daniels

@TroyDaniels 동의합니다. 답변을 편집 할 수 있습니다. 편집 내용을 검토하겠습니다.
VonC

19

나는 상대 날짜를 사용하고 다음과 같이 지점 이름을 단축하는 것을 좋아합니다.

git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads

어느 것이 당신에게 출력을 제공합니다 :

21 minutes ago  nathan/a_recent_branch
6 hours ago     master
27 hours ago    nathan/some_other_branch
29 hours ago    branch_c
6 days ago      branch_d

즐겨 찾는 별칭을 모두 추가 한 다음 스크립트를 팀에 공유하기 위해 Bash 파일을 만드는 것이 좋습니다. 다음을 추가하는 예는 다음과 같습니다.

#!/bin/sh

git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"

그런 다음이 작업을 수행하여 형식이 좋고 정렬 된 로컬 분기 목록을 얻을 수 있습니다.

git branches

업데이트 : 채색을 원할 경우이 작업을 수행하십시오.

#!/bin/sh
#
(echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"

이것은 나에게fatal: unknown field name: '-authordate:iso8601'
팩터 미스틱

1
팬시 컬러 출력은 훌륭하지만 이것은 간단하고 내가 찾던 것입니다. 원격 분기를 살펴 보려면 refs/heads로 교체하십시오 refs/remotes.
Lambart

명령 자체는 사랑 스럽지만 별명에 오류가 발생합니다.expansion of alias 'branches' failed; 'echo' is not a git command
Philip Kahn

나를 위해 작동합니다. 이것을 터미널에 붙여 넣기 만하면 어떻게됩니까? (echo ' ------------------------------------------------------------‌​' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------‌​') | grep --color -E "$(git rev-parse --abbrev-ref HEAD)$|$"
n8tr

17

Git 2.19부터는 간단하게 다음을 수행 할 수 있습니다.

git branch --sort=-committerdate

당신은 또한 수:

git config branch.sort -committerdate

따라서 현재 리포지토리에 분기를 나열 할 때마다 커미터 날짜별로 정렬되어 나열됩니다.

브랜치를 나열 할 때마다 커미터 날짜별로 정렬하려는 경우 :

git config --global branch.sort -committerdate

면책 조항 : Git 에서이 기능의 저자 이며이 질문을 보았을 때 구현했습니다.


2
복잡한 스크립트 나 별칭을 사용하는 것보다 훨씬 쉬운 최신 답변 👌
mtefi

주의해서 사용하십시오! 모두를 조심하십시오. 이것은 가지를 나열하는 명령이 아닙니다. Git의 구성을 변경하는 명령이며 영구적 인 글로벌 영향을 미칩니다.
자지 모프

1
@Jazimov 당신이 맞아요, 나는 대답을 더 명확하게 편집했습니다
user801247

11

색상을 추가합니다 pretty-format 사용할 수 없으므로).

[alias]
    branchdate = for-each-ref --sort=-committerdate refs/heads/ --format="%(authordate:short)%09%(objectname:short)%09%1B[0;33m%(refname:short)%1B[m%09"

9

나는 같은 문제가 있었으므로 Twig 라는 루비 보석을 썼습니다 . 분기 순서대로 (순서 순으로) 분기를 나열하고 최대 분기를 설정하여 모든 분기를 나열하지 않을 수도 있습니다 (많은 분기가있는 경우). 예를 들면 다음과 같습니다.

$ twig

                              issue  status       todo            branch
                              -----  ------       ----            ------
2013-01-26 18:00:21 (7m ago)  486    In progress  Rebase          optimize-all-the-things
2013-01-26 16:49:21 (2h ago)  268    In progress  -               whitespace-all-the-things
2013-01-23 18:35:21 (3d ago)  159    Shipped      Test in prod  * refactor-all-the-things
2013-01-22 17:12:09 (4d ago)  -      -            -               development
2013-01-20 19:45:42 (6d ago)  -      -            -               master

또한 티켓 ID, 상태, 할 일 등 각 지점에 대한 사용자 지정 속성을 저장하고 이러한 속성에 따라 지점 목록을 필터링 할 수 있습니다. 자세한 정보 : http://rondevera.github.io/twig/


5
같은 이름의 소프트웨어가 몇 개 있다고 확신하기 때문에 그 이름은 도움이되지 않을 수 있습니다.
thoroc

8

나는 다음과 같은 명령을 내렸다 (Git 2.13 이상).

git branch -r --sort=creatordate \
    --format "%(creatordate:relative);%(committername);%(refname:lstrip=-1)" \
    | grep -v ";HEAD$" \
    | column -s ";" -t

없는 경우 column마지막 줄을

    | sed -e "s/;/\t/g"

출력은 다음과 같습니다

6 years ago             Tom Preston-Werner  book
4 years, 4 months ago   Parker Moore        0.12.1-release
4 years ago             Matt Rogers         1.0-branch
3 years, 11 months ago  Matt Rogers         1.2_branch
3 years, 1 month ago    Parker Moore        v1-stable
12 months ago           Ben Balter          pages-as-documents
10 months ago           Jordon Bedwell      make-jekyll-parallel
6 months ago            Pat Hawks           to_integer
5 months ago            Parker Moore        3.4-stable-backport-5920
4 months ago            Parker Moore        yajl-ruby-2-4-patch
4 weeks ago             Parker Moore        3.4-stable
3 weeks ago             Parker Moore        rouge-1-and-2
19 hours ago            jekyllbot           master

다양한 조각의 작동 방식에 대한 블로그 게시물을 작성 했습니다 .


좋은. +1. stackoverflow.com/a/33163401/6309git branch --sort 에서 언급 한 것을 사용합니다 .
VonC

@DanNissenbaum Git 2.13 (2017 년 5 월 릴리스) 이상을 사용하고 있는지 확인하십시오.
bdesham


5

최근 분기 간을 전환하는 데 사용하는 작은 스크립트는 다음과 같습니다.

#!/bin/bash
# sudo bash

re='^[0-9]+$'

if [[ "$1" =~ $re ]]; then
    lines="$1"
else
    lines=10
fi
branches="$(git recent | tail -n $lines | nl)"
branches_nf="$(git recent-nf | tail -n $lines | nl)"
echo "$branches"

# Prompt which server to connect to
max="$(echo "$branches" | wc -l)"
index=
while [[ ! ( "$index" =~ ^[0-9]+$ && "$index" -gt 0 && "$index" -le "$max" ) ]]; do
    echo -n "Checkout to: "
    read index
done

branch="$( echo "$branches_nf" | sed -n "${index}p" | awk '{ print $NF }' )"
git co $branch
clear

이 두 별명 사용 :

recent = for-each-ref --sort=committerdate refs/heads/ --format=' %(color:blue) %(authorname) %(color:yellow)%(refname:short)%(color:reset)'
recent-nf = for-each-ref --sort=committerdate refs/heads/ --format=' %(authorname) %(refname:short)'

Git 리포지토리에서 호출하면 마지막 N 가지 (기본적으로 10 개)와 옆에 숫자가 표시됩니다. 지점 번호를 입력하면 체크 아웃됩니다.

여기에 이미지 설명을 입력하십시오


4

일반적으로 우리는 최근에 원격 지점을 고려합니다. 그래서 이것을 시도하십시오

git fetch
git for-each-ref --sort=-committerdate refs/remotes/origin

4

다른 모든 스크립트의 기능을 수행하는 또 다른 스크립트가 있습니다. 사실, 그것은 당신의 쉘을위한 기능을 제공합니다.

Git 구성에서 일부 색상을 가져 오거나 기본값을 사용합니다.

# Git Branch by Date
# Usage: gbd [ -r ]
gbd() {
    local reset_color=`tput sgr0`
    local subject_color=`tput setaf 4 ; tput bold`
    local author_color=`tput setaf 6`

    local target=refs/heads
    local branch_color=`git config --get-color color.branch.local white`

    if [ "$1" = -r ]
    then
        target=refs/remotes/origin
        branch_color=`git config --get-color color.branch.remote red`
    fi

    git for-each-ref --sort=committerdate $target --format="${branch_color}%(refname:short)${reset_color} ${subject_color}%(subject)${reset_color} ${author_color}- %(authorname) (%(committerdate:relative))${reset_color}"
}

3

이것은 saeedgnu의 버전을 기반으로 하지만 현재 분기는 별과 색상으로 표시되며 "달"또는 "년"으로 표시되지 않은 항목 만 표시합니다.

current_branch="$(git symbolic-ref --short -q HEAD)"
git for-each-ref --sort=committerdate refs/heads \
  --format='%(refname:short)|%(committerdate:relative)' \
  | grep -v '\(year\|month\)s\? ago' \
  | while IFS='|' read branch date
    do
      start='  '
      end=''
      if [[ $branch = $current_branch ]]; then
        start='* \e[32m'
        end='\e[0m'
      fi
      printf "$start%-30s %s$end\\n" "$branch" "$date"
    done

2

스크립트로 내 최고의 결과 :

git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short)|%(committerdate:iso)|%(authorname)' |
    sed 's/refs\/heads\///g' |
    grep -v BACKUP  | 
    while IFS='|' read branch date author
    do 
        printf '%-15s %-30s %s\n' "$branch" "$date" "$author"
    done

1
어떤 종류의 스크립트? 세게 때리다?
Peter Mortensen 19 :

2

git branch --sort=-committerdate | head -5

커미터 날짜를 기준으로 정렬 된 상위 5 개의 분기 이름을 얻는 데 관심이있는 사람



1

내가 찾은 변형은 다음과 같습니다.

git for-each-ref --sort=-committerdate --format='%(committerdate)%09%(refname:short)' refs/heads/ | tail -r

tail -r가장 최근이되도록 목록을 반전 commiterdate마지막이다.


3
이를 위해 --sort = -committerdate를 --sort = committerdate로 변경할 수도 있습니다.
rephorm

어느 tail있다 -r?
Christoffer Hammarström 8

1

허용 된 답변의 출력을 dialog로 전달하여 대화 형 목록을 제공합니다.

#!/bin/bash

TMP_FILE=/tmp/selected-git-branch

eval `resize`
dialog --title "Recent Git Branches" --menu "Choose a branch" $LINES $COLUMNS $(( $LINES - 8 )) $(git for-each-ref --sort=-committerdate refs/heads/ --format='%(refname:short) %(committerdate:short)') 2> $TMP_FILE

if [ $? -eq 0 ]
then
    git checkout $(< $TMP_FILE)
fi

rm -f $TMP_FILE

clear

(예) ~/bin/git_recent_branches.sh와 같이 저장하십시오 chmod +x. 그런 다음 git config --global alias.rb '!git_recent_branches.sh'새로운 git rb명령을 내립니다.


1

나는 이미 많은 대답이 있다는 것을 알고 있지만 여기에 간단한 별칭을위한 2 센트가 있습니다 (가장 최근 지점이 맨 아래에있는 것을 좋아합니다).

[alias]
        br = !git branch --sort=committerdate --color=always | tail -n15
[color "branch"]
        current = yellow
        local = cyan
        remote = red

이렇게하면 현재 분기가 강조 표시된 별표가있는 최신 15 개 분기에 대한 개요가 색상으로 표시됩니다.


1

별명을 설정하려고 할 때 bash_profile에서 Mac에서 작은 따옴표를 처리하는 데 문제가있었습니다. 이 답변은 문제를 해결하는 데 도움이되었습니다 " 작은 따옴표로 묶은 문자열에서 작은 따옴표를 이스케이프 처리하는 방법

작업 솔루션 :

alias gb='git for-each-ref --sort=committerdate refs/heads/ --format='"'"'%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'"'"''

추신 : 명성으로 인해 댓글을 달 수 없습니다


0

git for-each-ref --sort=committerdate refs/heads/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))' 이것은 당신이 필요하다는 것입니다


0

Git v2.19branch.sortconfig 옵션을 소개합니다 ( branch.sort 참조 ).

그래서 git branch기본적으로 커미터 일자 (내림차순)으로 정렬됩니다

# gitconfig
[branch]
    sort = -committerdate     # desc

스크립트:

$ git config --global branch.sort -committerdate

최신 정보:

그래서,

$ git branch
* dev
  master
  _

$ git branch -v
* dev    0afecf5 Merge branch 'oc' into dev
  master 652428a Merge branch 'dev'
  _      7159cf9 Merge branch 'bashrc' into dev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.