Git 브랜치 생성시기를 결정하는 방법은 무엇입니까?


327

Git 브랜치를 언제 만들지 결정하는 방법이 있습니까? 리포지토리에 지점이 있으며 생성 시점을 기억하지 못하며 생성 타임 스탬프를 보는 것이 내 기억을 손상시킬 수 있다고 생각했습니다.


3
이것은 매우 도움이되었다는 것을 발견했습니다 commandlinefu.com/commands/view/2345/…
Brendon-Van-Heyzen

1
당신이이 질문을 할 때, 당신은 정말 분기의 창조의 날짜와 시간을 얻기에 관심이 있었다, 또는 당신은 또한 알고에 관심이 곳에 지사가 처음으로 분기되어 있었다 커밋하는 즉, 분기가 처음 생성 커밋 역사 에서?

3
@ 컵케익, 질문은 분명하다. 지점을 만들 때 관심이있었습니다. 그것은 커밋을 아는 것이 일반적인 경우에 유용한 정보가 될 것이라고 말했다.
paxos1977

답변:


151

사용하다

git show-요약`git merge-base foo master`

gitk를 사용하여 컨텍스트에서 보려는 경우 다음을 사용하십시오.

gitk --all --select-commit =`git merge-base foo master`

(여기서 foo는 찾고있는 지점의 이름입니다.)

스크린 샷


24
답을 명확히하기 위해 프로세스에는 두 단계가 있습니다. (1) "git merge-base <branch> master"를 사용하여 treesh를 얻습니다. 여기서 branch는 관심있는 분기입니다. (2) git show에 입력으로 treesh를 사용하여 날짜를 가져옵니다. "git show --summary <treesh>"
paxos1977

11
이 답변은 지점이 마스터에서 생성되었다는 것을 제외하고는 보입니다. 그러나 그렇지 않은 경우 어떻게해야합니까? 자녀가 둘 이상인 지점의 첫 번째 커밋을 찾는 방법이 있습니까?
Manitra Andriamitondra

20
이것은 브랜치가 생성 된 날짜 가 아니라 "브랜칭"커밋입니다.
Marco

44
솔루션은 'branch'가 'master'로 다시 병합되지 않은 경우에만 작동합니다. 두 지점에 대한 최초의 병합 기반을 보편적으로 찾는 방법이 있습니까?
Ilya Ivanov

22
이것은 브랜치 생성이 아닌 병합 기반을 보여줍니다.
Hedley

139

의견에서 지적 과에 Jackub의 대답은 , 한 지사가 설정 설정에서 설정 한 일 수보다 어리다으로 gc.reflogexpire분기 기준 일 때 (기본 90 일)에, 당신은 알아 보려면 reflog를 활용할 수 처음 생성되었습니다.

git reflog대부분의 git log플래그 를 사용할 수 있습니다 . 또한 HEAD@{0}스타일 선택기는 사실상 시간 개념이며 실제로는 해킹 된 방식으로 날짜 문자열로 처리됩니다. 이것은 플래그를 사용하고 다음 --date=local과 같이 출력을 얻을 수 있음을 의미합니다 .

$ git reflog --date = local
763008c HEAD @ {2010 년 8 월 20 일 금요일 10:09:18} : 풀 : 빨리 감기
f6cec0a HEAD @ {화 8 월 10 일 09:37:55 2010} : 당기기 : 빨리 감기
e9e70bc HEAD @ {2 2 월 4 일 02:51:10}} : 당기기 : 빨리 감기
836f48c HEAD @ {2010 년 1 월 21 일 목요일 14:08:14} : 결제 : 마스터에서 마스터로 이동
836f48c HEAD @ {2010 년 1 월 21 일 14:08:10} : 풀 : 빨리 감기
24bc734 HEAD @ {수 1 월 20 일 수요일 12:05:45} : 결제 : 74fca6a42863ffacaf7ba6f1936a9f228950f657에서 이동 
74fca6a HEAD @ {수 1 월 20 일 11:55:43 2010} : 결제 : 마스터에서 v2.6.31로 이동
24bc734 HEAD @ {수 1 월 20 일 수요일 11:44:42}} : 당기기 : 빨리 감기
964fe08 HEAD @ {월 2009 년 10 월 26 일 15:29:29} : 결제 : 4a6908a3a050aacc9c3a2f36b276b46c0629ad91에서 이동 
4a6908a HEAD @ {월 2009 년 10 월 26 일 14:52:12} : 결제 : 마스터에서 v2.6.28로 이동

다음과 같은 경우에도 유용 할 수 있습니다 --date=relative.

$ git reflog --date = relative
763008c HEAD @ {4 주 전} : 풀 : 빨리 감기
f6cec0a HEAD @ {6 주 전} : 풀 : 빨리 감기
e9e70bc HEAD @ {8 개월 전} : 풀 : 빨리 감기
836f48c HEAD @ {8 개월 전} : 체크 아웃 : 마스터에서 마스터로 이동
836f48c HEAD @ {8 개월 전} : 풀 : 빨리 감기
24bc734 HEAD @ {8 개월 전} : 체크 아웃 : 74fca6a42863ffacaf7ba6f1936a9f228950f657에서 마스터로 이동
74fca6a HEAD @ {8 개월 전} : 체크 아웃 : 마스터에서 v2.6.31로 이동
24bc734 HEAD @ {8 개월 전} : 풀 : 빨리 감기
964fe08 HEAD @ {11 개월 전} : 체크 아웃 : 4a6908a3a050aacc9c3a2f36b276b46c0629ad91에서 master로 이동
4a6908a HEAD @ {11 개월 전} : 체크 아웃 : 마스터에서 v2.6.28로 이동

마지막 참고 사항 : --all플래그 (실제로 git-reflog에 의해 이해되는 git-log 플래그)는 분기 이벤트를 명확하게 표시하는 ( refs/간단히 대신에) 알려진 모든 ref에 대한 reflog를 표시합니다 HEAD.

git reflog --date = local --all
860e4e4 심판 / 헤드 / 마스터 @ {2010 년 9 월 19 일 23:00:30} : 커밋 : 두 번째.
17695bc refs / heads / example_branch @ {2010 년 9 월 20 일 월요일 00:31:06} : 지점 : HEAD에서 생성

3
매우 흥미로운. +1. 물론 이것은 gc.reflogexpire며칠 안에 이루어집니다.
VonC

2
@VonC — 바로 당신입니다. gc.reflogexpire의 기본값은 90 일입니다.
Aaron

1
드디어! 자식 자체가 "branch : Created from HEAD"라고 대답합니다. git CAN의 찾기 어려운 "브랜치"항목은 생성 날짜와 시간으로 추적됩니다. 감사합니다. +1 상. 그러나 gc.reflogexpire 일은 어떻습니까? 원격 지사에서 어떻게해야합니까?
Motti Shneor

60

Pro Git § 3.1 Git Branching-지점이란 무엇인가 git 지점이 실제로 무엇인지에 대한 좋은 설명이 있습니다.

Git의 브랜치는 단순히 커밋에 대한 가벼운 이동 포인터입니다.

브랜치는 가벼운 포인터 일 뿐이므로 git은 히스토리 또는 생성 날짜에 대한 명확한 개념이 없습니다. "하지만 잠깐만, 물론 git은 내 지사 기록을 알고있다!" 글쎄요.

다음 중 하나를 실행하는 경우 :

git log <branch> --not master
gitk <branch> --not master

"브랜치의 히스토리"처럼 보이는 것을 볼 수 있지만 실제로는 "브랜치"에서 도달 할 수있는 커밋 목록이며 마스터에서는 도달 할 수 없습니다. 이것은 원하는 정보를 제공하지만 '분기'를 다시 마스터로 병합 한 적이없고 마스터를 '분기'로 병합 한 적이없는 경우에만 가능합니다. 당신 있다면 합병 후 차이의 역사는 붕괴됩니다.

다행스럽게도 여기에는 다양한 답변이 설명 된 것처럼 reflog에 원하는 정보가 포함되는 경우가 많습니다. 이것을 사용하십시오 :

git reflog --date=local <branch>

지점의 역사를 보여줍니다. 이 목록의 마지막 항목은 분기를 만든 지점 일 것입니다.

브랜치가 삭제 된 경우 'branch'는 더 이상 유효한 자식 식별자가 아니지만 대신 이것을 사용하여 원하는 것을 찾을 수 있습니다.

git reflog --date=local | grep <branch>

또는 Windows cmd 쉘에서 :

git reflog --date=local | find "<branch>"

reflog는 원격 브랜치에서 효과적으로 작동하지 않으며 로컬에서 작업 한 브랜치에서만 효과적입니다.


흠, 나는이 답변이 얼마나 유용한 지 잘 모르겠습니다. 나중에 더 공부해야합니다. 그러나 가치 있는 것은 짧고 게으른 부분적인 답변이 아닌 포괄적 인 무언가를 작성하려는 노력을 기울인 것이 분명했습니다. 그래서 확실히 좋습니다. 또한, 당신 분기보다 오래되지로서 만 한이의 reflog를 사용할 수 있음을 유의해야 gc.reflogexpire일이 뾰족한 아웃로, 이 답변 하고 이 답변 .

4
다른 답변의 reflog에 대한 모든 좋은 정보를 복제하고 싶지는 않지만 유용하다고 생각되면 gc.reflogexpire를 추가하십시오. 내 대답은 (1) 자식 분기가 무엇인지, 왜 "역사"가 다소 까다로운 지에 대해 더 명확하게 설명하고, (2) (3) 분기가 아닌 커밋을 표시하고 (4) 삭제 된 브랜치에 대한 참조 로그를 그 리핑합니다. 피드백 환영합니다.
yoyo

@Cupcake에게 감사합니다. 재미있게도 나는 원래 'branch'주위에 꺾쇠 괄호가 있었지만 대답 미리보기에서 전체 단어를 제거 했으므로 실수로 (잘못된) 인라인 html로 처리되었다고 가정했습니다.
yoyo

이 방법은 인 IntelliJ와의 Bitbucket을 통해 잘 작동git reflog --date=local <branch>
이삭이 웨더스

41

첫째, 지점이 gc.reflogexpire며칠 내에 생성 된 경우 (기본 90 일, 즉 약 3 개월) reflog에서 첫 번째 항목을 사용 git log -g <branch>하거나 git reflog show <branch>찾을 수 있습니다.이 이벤트는 생성 이벤트이며 다음과 같습니다 (for git log -g).

Reflog: <branch>@{<nn>} (C R Eator <creator@example.com>)
Reflog message: branch: Created from <some other branch>

누가 브랜치를 생성했는지, 얼마나 많은 작업을 수행했는지, 어느 브랜치에서 생성했는지를 알 수 있습니다 (물론 "HEAD에서 생성됨").

그것이 MikeSep이 그의 대답에서 말한 것 입니다.


둘째, 분기가 더 길고 gc.reflogexpire실행 한 경우 git gc(또는 자동으로 실행 된 경우) 생성 된 분기와 공통 조상을 찾아야합니다. 구성 파일을 살펴보십시오. branch.<branchname>.merge항목 이있을 수 있습니다.이 항목은 기반이되는 지점을 알려줍니다.

예를 들어 해당 분기가 마스터 분기에서 생성 된 경우 (마스터 분기에서 분기)를 알고있는 경우 다음 명령을 사용하여 공통 조상을 볼 수 있습니다.

git show $(git merge-base <branch> master)

git show-branch <branch> master대안으로 시도해 볼 수도 있습니다 .

이것이 바로 gbacon그의 답변에서 말한 것입니다 .


3
"git reflog show <branch>"는 잘 작동하며 분기가 생성 된시기를 매우 명시 적으로 보여줍니다. Treesh는 "git show --summary <treesh>"에 피드
paxos1977

1
'git log -g <branch>'는 나를 위해 일한 것입니다-많은 세부 사항. 이 중 하나를 사용하려면 지점에 있어야합니다.
Lidia

18

아직 git 명령을 확신하지 못하지만 참조 로그에서 찾을 수 있다고 생각합니다.

.git/logs/refs/heads/<yourbranch>

내 파일에 유닉스 타임 스탬프가있는 것 같습니다.

업데이트 : 로그를 인쇄 할 때 커밋 기록 대신 reflog 기록을 사용하는 옵션이있는 것으로 보입니다.

git log -g

분기를 만들었을 때도이 로그를 따를 수 있습니다. git logreflog에 항목을 작성한 조치를 작성한 날짜가 아니라 커밋 날짜를 표시합니다. 위의 경로에서 실제 reflog를 보는 것 외에는 아직 그것을 찾지 못했습니다.


12

이 시도

  git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)'

3
당신은 아마 %전에 필요할지도 모른다(refname)
Vor

1
@Vor 나는 변화를했다
biniam

나는 이것을 파이프 | cut -c 5- | sort -r |로 연결 한 다음 한 달 동안 grep을 통해 파이프로 연결하여 역순으로 나열합니다.
누 메논

2
@Noumenon : for-each-ref는 예를 들어 --sort='-committerdate'(역순으로 순서를 정하기 전에 '-'에주의하십시오) 를 추가하여 정렬 할 수 있습니다 .
Pete

9

사용하다:

git reflog

현재 폴더에 리포지토리의 모든 수명주기를 표시합니다. 처음에 나타나는 지점 이름 (아래에서 위로)은 작성된 소스입니다.

855a3ce HEAD@{0}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{1}: checkout: moving from feature-sut-46 to development
855a3ce HEAD@{2}: checkout: moving from feature-jira35 to feature-sut-46
535dd9d HEAD@{3}: checkout: moving from feature-sut-46 to feature-jira35
855a3ce HEAD@{4}: checkout: moving from development to feature-sut-46
855a3ce HEAD@{5}: checkout: moving from feature-jira35 to development
535dd9d HEAD@{6}: commit: insert the format for vendor specific brower - screen.css
855a3ce HEAD@{7}: checkout: moving from development to feature-jira35
855a3ce HEAD@{8}: checkout: moving from master to development

그 의미는 다음과 같습니다.

  • 마스터에서 지점 개발이 생성됩니다 (체크 아웃 -b).

  • 브랜치 피처 -jira35가 개발에서 생성됩니다 (체크 아웃 -b).

  • 브랜치 피처 -jira-sut-46은 개발에서 생성됩니다 (체크 아웃 -b)


2
그러나 날짜는 어디에 있습니까? 모든 지점을 여러 번 체크 아웃하는 것을 볼 수 있습니다. 이것은 각 브랜치가 처음으로 생성 된 것을 의미합니까?
Motti Shneor

4

이것은이 스레드를 발견하기 전에 생각해 낸 것입니다.

git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep '/master' | tail -1
git reflog show --date=local --all | sed 's!^.*refs/!refs/!' | grep 'branch:'

3

이 쇼에게 지점의 만든 날짜 명령 dev에서을main

$git reflog show --date=iso dev
$7a2b33d dev@{2012-11-23 13:20:28 -2100}: branch: Created from main

"지점 생성 날짜"... 90 일 미만인 경우. 가 생성 된 경우 보다 90 일, 그 정보는 제거 될 것이다. stackoverflow.com/a/3748722/6309 에서 위에서 언급 한 바와 같이 .
VonC

@Sazzad Hissain Khan 이것은 Git의 복잡한 부분으로 인해 약간 길을 잃은 기술이 아닌 사람들에게 '친숙한 치트 시트 팁'을 제공하고 싶을 때 우리를 위해 일했습니다.
Chris22

2

모든 지점에 대한 세부 정보를 얻으려면

for i in `git branch -r | tail -n +2 `;do git log --reverse $i|grep -A 2 -B 2 `echo $i | awk -F'origin/' '{print $2}'` |head -n 4; done

2

가장 좋은 방법을 찾았습니다.이 방법으로 만든 최신 지점을 항상 확인합니다.

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


1

이것은 나를 위해 그것을했다 : (10 년 후)

git log [--remotes] --no-walk --decorate

브랜치 생성 시간에 저장된 정보가 없기 때문에이 작업은 커밋 --no-walk날짜를 포함하여 각 브랜치의 첫 커밋 ( )을 표시합니다 . 를 사용하여 --remotes원격 지점에 대한이 지역의 지점을 위해 그것을 생략하거나.

다른 것을 만들기 전에 지점에서 적어도 한 번의 커밋을 수행했기 때문에 문서화를 위해 몇 개월 동안의 지점 만들기 (및 기능 dev-start 기능)를 추적 할 수있었습니다.

출처 : stackexchange의 AnoE


0

통사론: git reflog --date=local | grep checkout: | grep ${current_branch} | tail -1

예: git reflog --date=local | grep checkout: | grep dev-2.19.0 | tail -1

결과: cc7a3a8ec HEAD@{Wed Apr 29 14:58:50 2020}: checkout: moving from dev-2.18.0 to dev-2.19.0

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