단 하나의 지점에 대한 커밋 기록을 얻는 방법?


128

에서 새 브랜치 my_experimentmaster만들고 여러 커밋을 했다고 가정 해 보겠습니다 my_experiment. git logwhen on을 수행하면 my_experiment이 분기에 대한 커밋뿐만 아니라 분기가 생성 master되기 전에 이루어진 커밋도 볼 수 있습니다 my_experiments.

my_experiments지점의 생성에 도달 할 때까지 지점 에 대한 모든 커밋의 기록을 보는 것이 매우 유용합니다. 사실상 그 지점의 진정한 기록입니다. 그렇지 않으면 커밋이 my_experiments브랜치에 있었는지 여부를 로그를 살펴볼 때 명확 하지 않습니다.

Git으로 이것을 할 수있는 방법이 있습니까?

답변:


139

범위 를 사용하여 그렇게 할 수 있습니다 .

git log master..

my_experiment지점을 체크 아웃 한 경우 곳 비교합니다 master에에있다 HEAD(끝 my_experiment).


3
좋아 너무 빨리 말했다. 그것은 나의 간단한 예를 위해 그것을했다. 그러나 이제 다른 사람의 실제 저장소를보고 있는데이 명령을 올바르게 사용하려면 현재 지점이 어떤 지점에서 만들어 졌는지 알아야합니다. 어쩌면 gitk에서 이것을 말할 수 있어야하지만 그것은 나에게 분명하지 않습니다. 이견있는 사람?
Marplesoft

@Marplesoft 이해하기가 복잡 할 수 있습니다. 이 질문을 참조하십시오 .
alex

어떻게 작동하는지 간단히 설명해 주시겠습니까? git log master..힘내에게 무엇을 말합니까?
tonix

2
@tonix 범위 작동 방식 ( master..) 에 대한 자세한 내용은 답변의 링크를 참조하십시오 .
alex

7

git merge-base명령은 공통 조상을 찾는 데 사용할 수 있습니다. 따라서 my_experiment가 아직 마스터로 병합되지 않고 my_experiment가 마스터에서 작성된 경우 다음을 수행 할 수 있습니다.

git log --oneline `git merge-base my_experiment master`..my_experiment

당신은 첫 번째 커밋, 추가의 부모 포함하려면 ^--first 부모 : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
에릭 라보

7

참고 : 해당 로그를 마지막 n 커밋 (예 : git log -3과 같은 마지막 3 커밋)으로 제한하는 경우 'n'과 분기 사이에 공백을 두어야합니다.

git log -3 master..

Git 2.1 (2014 년 8 월) 이전에는이 ​​실수 : git log -3master..실제로 현재 분기의 마지막 3 개의 커밋 (여기서는 my_experiment)을 무시하고 master한계를 무시합니다 ( my_experiment커밋이 하나만 포함되어 있으면 3 개가 나열되고 그 중 2 개가 있음 master)

참조 e3fa568 커밋 에 의해 (Junio C 하마노 gitster) :

개정 : " git log -<count>"를보다 신중하게 구문 분석

이 잘못 입력 된 명령 행은 단순히 " master" 를 무시 하고 현재로부터의 커밋 두 개를 표시합니다 HEAD.

$ git log -2master

전체 문자열을 정수로 파싱하지 않고 " 2master"를 공급하기 때문 atoi()입니다.

strtol_i()대신 도우미 기능을 사용하십시오 .


1

당신은 사용할 수 있습니다 git log --oneline


이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
DebanjanB 2016 년

1

귀하의 목적에 맞는 옵션은 git log --online --decorate입니다. 이를 통해 확인 된 커밋과 스토리 라인에있는 각 분기에 대한 맨 위 커밋을 알 수 있습니다. 이렇게하면 리포의 구조와 특정 분기와 관련된 커밋을 잘 볼 수 있습니다. 나는 이것을 읽는 것이 도움 될 것이라고 생각 합니다.


0

나는 이것이 매우 늦다는 것을 알고 있습니다 ... 그러나 여기에 당신이 찾고있는 것을 얻을 수있는 (간결하지 않은) oneliner가 있습니다 :

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • 우리는 git show-branch(경고를 보내기) 로 지점 이름과 상대 위치가있는 커밋을 실제 지점 상태에 나열 /dev/null합니다.
  • 그런 다음 브랜치 안에 분기 이름을 가진 것들만로 유지하십시오 grep -E "\[$BRANCH_NAME".
  • (별이있는 분기, 별이없는 에코)를 사용하여 실제 $BRANCH_NAME를 얻을 수 git branch | grep -E '^\*' | awk '{ printf $2 }'있습니다.
  • 결과에서로 시작하는 중복 라인을 제거합니다 tail -n+2.
  • 그리고, 우리는 fianlly 모든 이전 제거하여 출력을 정리 [$BRANCH_NAME]로를 sed -E "s/^[^\[]*?\[/[/".
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.