Git의 브랜치에서 변경 사항을 얻는 방법


264

현재 분기에서 분기 된 이후 분기에서 커밋 로그를 얻는 가장 좋은 방법은 무엇입니까? 지금까지 내 해결책은 다음과 같습니다.

git log $(git merge-base HEAD branch)..branch

에 대한 문서 자식-DIFF는 그 표시 git diff A...B에 해당합니다 git diff $(git-merge-base A B) B. 한편, 설명서 자식-REV-구문 분석은 그가 표시 r1...r2로 정의된다 r1 r2 --not $(git merge-base --all r1 r2).

왜 이것들이 다른가요? git diff HEAD...branch원하는 diff 를 제공하지만 해당 git log 명령은 원하는 것보다 더 많은 것을 제공합니다.

사진에서 다음과 같이 가정하십시오.

         x --- y --- z --- 분기
        /
--- a --- b --- c --- d --- e --- 머리

커밋 x, y, z가 포함 된 로그를 얻고 싶습니다.

  • git diff HEAD...branch 이 커밋을 제공합니다
  • 그러나 git log HEAD...branchx, y, z, c, d, e를 제공합니다.

내가 볼 수있는 목적으로 "git log"를 잘못 사용하고 있습니다. 아래에 내 답변을 추가했습니다.
PlagueHammer

답변:


186

개정 목록의 맥락에서 이를 정의하는 A...B방법이 git-rev-parse있습니다. git-log는 개정 목록을 가져옵니다. git-diff개정 목록을 가져 오지 않습니다-개정은 하나 또는 두 개가 필요 A...B하며 git-diff맨 페이지 에서 정의 된 방식을 의미하는 구문을 정의했습니다 . 경우 git-diff명시 적으로 정의하지 않았다 A...B, 다음 구문이 유효하지 않을 것이다. 점을 유의 git-rev-parse맨 설명 A...B은 "지정 범위"섹션에서와 개정 범위가 유효한 경우 해당 섹션의 모든 상황에서만 유효합니다 (즉, 개정 목록을 원하는 경우).

x, y 및 z 만 포함 된 로그를 얻으려면 git log HEAD..branch(3 개가 아닌 2 개의 점)을 시도하십시오 . 이것은와 동일하며 git log branch --not HEADHEAD에 있지 않은 모든 커밋을 의미합니다.


31
와우, 혼란 스럽습니다. "git diff HEAD..branch"를 사용하면 모든 커밋 (x, y, z, c, d, e)이 표시되지만 "git log HEAD..branch"는 내가 원하는 것을 정확하게 수행하고 x, y 만 표시합니다. , z! 이것은 "..."를 사용하는 것과 정반대입니다.
Greg Hewgill

22
git diff HEAD..branch와 동일합니다 git diff HEAD branch. 여기서 기억해야 할 핵심은 로그는 수정 목록 / 범위를 취하지 만 diff는 수정하지 않는다는 것입니다. 그래서 그들은 그들의 인수를 다르게 취급합니다.
Lily Ballard

4
git diff HEAD...branchgit log HEAD..branch
jchook

72
git cherry branch [newbranch]

master지점 에있을 때 정확하게 묻는 것 입니다.

나는 또한 매우 좋아한다 :

git diff --name-status branch [newbranch]

정확히 당신이 요구하는 것은 아니지만 여전히 같은 맥락에서 매우 유용합니다.


8
'git cherry'는 커밋 ID 목록을 출력합니다. 모든 커밋의 모든 변경 사항을 결합하여 단일 diff로 변환 할 수 있습니까?
Jonathan Hartley

1
git cherry실제로 매우 유용합니다. 감사합니다 :)
jkp

2
@JonathanHartley 커밋 ID 의 첫 번째마지막을 가져 와서 gif-diff:에 던지 git diff x..z거나 내 자신의 예입니다 git diff 13bc4d..8eda3a.
towi

3
분기 또는 newbranch 중 하나가 키워드이고 사용자 지정 분기 이름으로 대체되어야하는 명령에서 어떤 코드를 교체해야하는지 이해하기 어렵습니다.
pal4life

37

당신이보고 싶은 것은 나가는 커밋 목록입니다. 당신은 이것을 사용하여 이것을 할 수 있습니다

git log master..branchName 

또는

git log master..branchName --oneline

"branchName"이 "master"의 추적 분기로 생성되었다고 가정합니다.

마찬가지로 들어오는 변경 사항을 보려면 다음을 사용할 수 있습니다.

git log branchName..master

1
@ABB에서 branchName을 생략하면 기본값은 "head"이며,이 예에서는 사실상 branchName입니다.
PlagueHammer 1

25

이것은 내가 게시 한 답변과 유사합니다 : Git 푸시 미리보기

이러한 기능을 Bash 프로파일에 놓으십시오.

  • gbout-자식 분기 발신
  • gbin-자식 분기 수신

다음과 같이 사용할 수 있습니다.

  • 마스터 인 경우 : gbin branch1 <-이것은 master가 아닌 branch1에있는 것을 보여줍니다.
  • 마스터 인 경우 : gbout branch1 <-분기 1에없는 마스터에있는 것을 보여줍니다.

이것은 모든 지점에서 작동합니다.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

Alex V와 NDavis와 같은 몇 가지 대답과 비슷하지만 그중 어느 것도 동일하지 않습니다.

이미 해당 지점에있을 때

사용 :

git diff master...

다음은 여러 기능을 결합한 것입니다.

  • 매우 짧다
  • 실제 변화를 보여줍니다

최신 정보:

이것은 아마도이어야 git diff master하지만, 이것은 질문으로 지정된 커밋이 아니라 diff를 보여줍니다.


1
당신이 한 경우 git co master; git pull에는 분기를 생성하기 때문에, git diff master반드시 지정된 지점에서 커밋에 의해 도입 된 차이를 얻기 위해 많이 사용되지 않습니다.
guival

1
또는 브랜치를 명시 적으로 지정하려면 :에서 git diff <branch1>...<branch2>도입 한 변경 사항을 표시합니다 branch2.
Alex

10

파일 변경 사항을 보려면 거기에 -p를 던지십시오.

git log -p master..branch

별명을 만드십시오.

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

지점의 고유 커밋을 참조하십시오.

gbl

6

마스터 분기 이후 현재 분기의 로그를 보려면

git log master...

현재 마스터 상태 인 경우 마스터에서 분기 한 이후 다른 분기의 로그를 보려면

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3 점) 그러나 때때로 '='대신 '+'가 표시됩니다.


3 개의 점은 가지에 대한 첫 번째 커밋을 두 번 표시하지만 두 개는 그렇지 않습니다.
TJ Biddle

2

나는 찾았다

git diff <branch_with_changes> <branch_to_compare_to>

커밋 메시지뿐만 아니라 전체 diff를 얻으므로 더 유용합니다. 이미 지점에 있고 변경 사항을보고 싶은 경우 (예를 들어) 마스터에 변경된 사항을보고 싶은 경우 다음을 사용할 수 있습니다.

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