명령 줄에 분기 계층 구조를 표시 하시겠습니까?


82

명령 줄에 분기 계층을 표시하는 방법이 있는지 궁금합니다. 예를 들어 다음 git branch과 같은 출력을 보는 대신을 사용하는 경우 :

* master
joes_work
refactoring
experiment

다음과 같은 출력이 표시됩니다.

* master
    joes_work
    refactoring
        experiment

이렇게하면 특정 분기가 분기 된 분기를 쉽게 확인할 수 있습니다. 트리 구조를 출력하는 특정 명령이 없더라도 어느 분기가 어느 분기에서 왔는지에 대한 정보를 출력하는 명령이 있습니까? perl 스크립트를 사용하여 출력 형식을 지정할 수 있습니다.


질문은 커밋, 분기 간의 관계와 관련이 없습니다. 그럼에도 불구하고 업스트림 브랜치 측면에서 그래프를 형성하는 관련없는 커밋을 가리키는 5 개의 브랜치를 가질 수 있습니다. git cli에서 답을 얻을 수있는 방법이 없다고 생각합니다.
Todd Freed

답변:


117

sehe의 솔루션은 멋져 보입니다. 여기에는 유사한 정보를 포함하는 것으로 보이는 다른 것이 있고, 형식이 다르며, git log를 사용하므로 커밋 정보도 포함합니다 (브랜치 이름을 무시하고 엉망으로 만들었습니다!).

git log --all --graph --decorate --oneline --simplify-by-decoration

* ae038ad (HEAD, branch2-1) add content to tmp1
| * f5a0029 (branch2-1-1) Add another
|/  
* 3e56666 (branch1) Second wave of commits
| * 6c9af2a (branch1-2) add thing
|/  
* bfcf30a (master) commit 1

예-더 유연하기 때문에 실제로 이것을 선호하지만 내 전화에서 입력하는 것은 고통 스러울 것입니다. 게다가 OP에 약간 과잉 일 가능성이 높습니다
sehe

2
@sehe : 별칭을 만들 수 있습니다. 나는 reeeaaally 좋은 비슷한 git log 별칭을 가지고 있으며 lg 별칭이므로 git lg.
Jorge Israel Peña

감사합니다 ctcherry, 이것은 정말 유용합니다 (두 번째로 필요했습니다). 할 수만 있다면 또 다른 찬성표를 줄 것입니다.
Rocky Sims

5
좋은! 나 git config --global alias.tree 'log --all --graph --decorate --oneline --simplify-by-decoration'에게주는 사용 합니다 git tree.
chetbox

29

시험

git show-branch
git show-branch --all

출력 예 :

bash$ git show-branch --all
! [branchA] commitA only in branchA
 * [branchB] commitB
  ! [branchC] commitC only in branchC
---------------------
+   [branchA] commitA only in branchA 
 *  [branchB] commitB
  + [branchC] commitC only in branchC
 *+ [branchC~1] commitB-1 also in branchC
 *+ [branchC~2] commitB-2 also in branchC
+++ [branchC~3] common ancestor
+++ [branchC~4] more common ancestors

4
git show-branch브랜치 목록뿐만 아니라 브랜치의 커밋 을 보여줍니다 .
svick

1
이것이 제가 찾고있는 것인지 잘 모르겠습니다. 가지에 커밋을 표시하는 것 같지만 내가 찾고있는 것은 모든 가지의 트리 뷰를 보는 방법입니다.
mellowsoon

나무는 왼쪽에서 오른쪽이 아닌 아래에서 위로 그려 지지만 괜찮습니다. 나뭇 가지가 부러진 것처럼 보이는 곳에서 해당 나뭇 가지에서 커밋이 누락되었습니다. 다른 브랜치와 동일하더라도 한 브랜치에서 커밋이 누락 될 수 있으므로 브랜치 이름을 표시하는 것만으로도 지나치게 단순화되는 경향이 있습니다.
tripleee

25

@ctcherry의 답변을 완성하고 싶습니다.

커밋을 한 사용자와 날짜도 볼 수있을 때가 좋기 때문에 다음 줄을 사용할 수 있습니다.

git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

그러나 이것은 꽤 긴 줄이며 암기하기 어렵 기 때문에 별칭을 사용할 수 있습니다. 터미널에서 이것을 사용해야합니다.

git config --global alias.lg "HERE GOES MY BIG LOG COMMAND LINE"


요약하려면 아래 행을 복사하여 터미널에 붙여 넣으십시오.

git config --global alias.lg "log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

그런 다음 git lg로그 기록 트리를 가져 오기 위해을 사용해야 합니다.

예: 여기에 이미지 설명 입력

src


1
답변에 색상 을 주셔서 감사합니다 !
dsz

13

gitkcommand를 입력하고 Enter를 누르기 만하면 됩니다.

나를 gitk위해 이것에 대한 가장 쉬운 해결책입니다. 명령 모드는 표시되지 않지만 다음과 같은 멋진 UI가 자동으로 채워집니다.

여기에 이미지 설명 입력


5

그것은 git의 관점에서 브랜치가 작동하는 방식이 아닙니다. branch에 커밋하고 분기 a를 생성 b하고 거기에서 작업 한 다음 다른 작업을 다시 수행하십시오 a.

A -- B -- D <-- a
       \
        \
          C <-- b

다른 방법으로했다면 구별 할 수 없습니다.

A -- B -- C <-- b
       \
        \
          D <-- a

내가 생각할 수있는 유일한 방법은 특정 브랜치가 어떤 브랜치에서 시작되었는지 알아 내기 위해 생각할 수있는 유일한 방법은 리플 로그이지만 이것은 신뢰할 수 없습니다 (90 일보다 오래된 항목은 일반적으로 삭제됨).


이것이 .git / logs / refs / heads의 파일에 적용되는지 알고 있습니까? 각 브랜치에 대한 파일이 있으며 브랜치의 첫 번째 줄에는 해당 브랜치의 출처가 표시됩니다.
mellowsoon

-2

어떻게이 별명에 대해 .gitconfig:

[alias]
branch-tree = !cd "$(git rev-parse --git-dir)/refs/heads" && tree

타임 스탬프 tree와 같이 명령이 지원 하는 항목에 따라 옵션을 제공 할 수도 있습니다 -D.


1
이것은 단지 엉터리 버전입니다 git branch. 질문은 분기 계층 구조를 보여주는 무언가를 원합니다-분기를 분기하는 분기 등 ...
Duncan Lock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.