Git을 사용하여 한 분기에 있지만 다른 분기에는없는 모든 커밋을 표시하십시오.


465

오래된 지점이 있는데 삭제하고 싶습니다. 그러나 그렇게하기 전에이 지점에 대한 모든 커밋이 특정 지점에 다른 지점으로 병합되었는지 확인하고 싶습니다. 따라서 다른 브랜치에 적용되지 않은 현재 브랜치에 대한 모든 커밋을보고 싶습니다 (또는 일부 스크립팅이 불가능한 경우 적용되지 않은 한 브랜치의 모든 커밋을 어떻게 볼 수 있습니까? 다른 지사에게?].


두 브랜치 사이에 누락 된 커밋을 나열하려면 compare-branches.py bitbucket.org/aakef/compare-git-branches를
Bernd Schubert

답변:


321

아마 그냥 원해

git branch --contains branch-to-delete

이것은 "branch-to-delete"에서 커밋을 포함하는 모든 브랜치를 나열합니다. "삭제 삭제"이상을보고하면 분기가 병합 된 것입니다.

당신의 대안은 실제로 rev-list 구문 일뿐입니다. 예를 들어 git log one-branch..another-branch모든 것이 one-branch필요한 모든 것을 보여줍니다 another-branch.

현재 git show-branch위치를 확인하는 방법 으로 관심이있을 수도 있습니다 .



1
'보고하는 경우 분기가 병합되었습니다'라는 줄을 잘못 해석 할 수 있습니다. git branch --contains some-branch만 반환 하면 some-branch무언가를 반환하지만 병합 되지 않은 것입니다.
혼란

5
참고 git log foo..bar바의 최신 foo는의 최신하지만, 시간에 더 뒤로에서 누락되지 않은 다른 커밋의 커밋을 보여줍니다. foo가 아닌 bar의 모든 것을 보려면 @jimmyorr의 솔루션을 사용해야합니다.
Paul A Jungwirth

555

어떤 커밋이 한 브랜치에 있지만 다른 브랜치에는없는 커밋 목록을 보려면 git log를 사용하십시오.

git log --no-merges oldbranch ^newbranch

즉, newbranch에 없는 oldbranch의 모든 커밋에 대한 커밋 로그를 표시 합니다. 포함 및 제외 할 여러 분기를 나열 할 수 있습니다 (예 :

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2

참고 : Windows ^에서는 이스케이프 키이므로 다른 키로 이스케이프해야합니다 ^.

git log --no-merges oldbranch ^^newbranch

2
두 가지의 git compare commit을 찾고 있다는 것을 알았습니다.
사용자

25
이것이 바로 내가 찾던 것입니다. 그러나 ^여기에 접두사로 사용 하면 혼란 스럽습니다. 이와 관련하여 이는 해당 분기를 제외 함을 의미합니다. ^접미사로 사용 하는 것은 해당 브랜치의 부모 커밋에 대한 상대 참조입니다.
Joe Flynn

4
매우 유용한 감사합니다. 궁금합니다. 왜 --no-merges 플래그가 필요한가요? 분명히 그 커밋도보고 싶습니까?
Max MacLeod

2
이것으로 gitk를 사용하고 싶습니까? 간단히 사용하십시오 gitk oldbranch ^newbranch --no-merges(git 1.8.1.1로 테스트 됨). 참고로, 나를 위해 ^포괄적 인 HEAD 커밋을 의미합니다 newbranch.
Matt

2
@NazariiGudzovatyi-예, "-cherry-pick"이 있습니다. 문서 페이지
romeara

91

newbranch가 아닌 oldbranch에는 커밋을 표시하려면 다음을 수행하십시오.

git log newbranch..oldbranch

이 커밋으로 diff를 표시하려면 (세 개의 점이 있음)

git diff newbranch...oldbranch

다음은 다이어그램 그림이있는 문서입니다 https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges


의 Paul A Jungwirth의 의견을 참조하십시오 . 오래된 커밋에서 빠질 것 같습니다.
비참한 변수

2
오래된 커밋이 무엇을 의미하는지 잘 모르겠습니다. 이중 점은 기본적으로 Git에 한 커밋에서 도달 할 수 있지만 다른 커밋에서 도달 할 수없는 커밋 범위를 해결하도록 요청합니다. 여기 digram의 그림과 문서입니다 git-scm.com/book/en/v2/...은
법사

1
우리가 newbranch또는 에 있다면 oldbranch, git log ..oldbranch또는 git log newbranch..각각 할 수 있습니다
YakovL

jimmyorr의 솔루션은 저에게 효과적이지 않았지만 ..심판의 이름 사이에 두 개의 점이있어서 도움 이되었습니다. 또한 --cherry-pick두 가지에있는 커밋을 숨기는 옵션을 사용 했지만 한 분기에서 다른 분기로 체리 선택했기 때문에 다른 해시가 있습니다.
flawyte

58

아직도 간단한 답변을 찾고있는 사람들은 git cherry을 확인하십시오 . 커밋 해시 대신 실제 diff를 비교합니다. 그것은 체리 피킹 또는 리베이스 된 커밋을 수용한다는 것을 의미합니다.

먼저 삭제하려는 지점을 체크 아웃하십시오.

git checkout [branch-to-delete]

그런 다음 git cherry를 사용하여 주요 개발 지점과 비교하십시오.

git cherry -v master

출력 예 :

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

참고 : -v플래그는 SHA 해시와 함께 커밋 메시지를 포함합니다.

앞에 '+'가있는 행은 분기 간 삭제에 있지만 마스터 분기에는 없습니다. 앞에 '-'가있는 사람은 마스터에서 동등한 커밋을 갖습니다.

마스터가 아닌 커밋의 경우 체리 선택과 grep을 결합하십시오.

git cherry -v master | grep "^\+"

출력 예 :

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

나는 이것을 시도했지만 여전히 mb (주요 지점)에없는 fb (기능 지점)에 많은 커밋이 있다고보고합니다. 그러나 fb에 있고 git diff mb를 수행하면 차이가 없습니다. 나는 rebase를 사용하고 모든 것을 무너 뜨렸다. 나는 이것이 왜 그런지 확신하지만, 나는 단지 확신하고 싶다. 이 경우라면 가능하다면 스쿼시를 피할 것입니다. 나는 "잃어버린 정보 캠프"에 있습니다. 히스토리를 깨끗하게 유지하면서 정보를 잃지 않기 위해 병합 된 것처럼 병합을 표시 할 수있는 로그 표시 모드를 추가 할 수 있는지 궁금합니다.
Outis Von Nemo 2016

1
정확한 시나리오는 확실하지 않지만 여러 커밋을 하나로 묶어 커밋이 별도의 다른 지점과 비교하면 분명히 작동하지 않습니다. 이 경우 유닉스 diff유틸리티를 사용하여 다양한 파일을 비교할 수 있습니다. 또는 임시 브랜치를 만들고 원래 브랜치에서했던 것과 비슷한 모든 커밋을 스쿼시 한 ​​다음 이것을 사용하면 효과가 있다고 생각합니다.
Tim S

50

여기에 게시 된 답변 중 일부는 원하는 것을 찾는 데 도움이되지만 git branch 의 다음 하위 명령은 작업에 더 적합한 솔루션입니다.

--merged 는 HEAD에 완전히 포함되어 있기 때문에 안전하게 삭제할 수있는 모든 분기를 찾는 데 사용됩니다.

master하나는 다음과 같이 안전하게 제거 할 수있는 가지를 열거하는 명령을 실행할 수 있지만 다음과 같습니다.

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static

# There is also a flag to specify remote branches in the output
git branch --remotes --merged

16

jimmyorr의 답변 이 Windows에서 작동하지 않습니다. 다음 과 같이 사용하는 --not것이 좋습니다 ^.

git log oldbranch --not newbranch --no-merges

4
맞습니다, +1 그 그래도 참고 ^Windows에서 지원되지만 필요는 Windows에서, (다른) 인, 이스케이프 ^: git log oldbranch ^^newbranch --no-merges.
VonC 2016 년

3
구체적으로 말하자면 Powershell 콘솔의 Windows에서는 작동하지만 CMD에는 추가 "^"가 필요합니다.
Rod

7

이 경우 하나의 (단일) 완전히이 지점 'A'로 통합 당신이 해당 분기 'B'를 원하는 경우, 예를 들어, 확인해야한다는 분기, 당신은 단순히 다음을 수행 할 수 있습니다 :

$ git checkout A
$ git branch -d B

git branch -d <branchname> "지사를 HEAD에 완전히 병합해야합니다."

주의 : 분기 B가 A로 병합되면 실제로 삭제됩니다.


3

이 간단한 스크립트를 사용하여 병합되지 않은 커밋을 볼 수 있습니다

#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
#   git branch-notmerge <branchname>
#
# Setup git alias
#   git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')

분기 상태를 표시하는 도구 git-wtf 를 사용할 수도 있습니다


0

예를 들어 git cherry지점에서 모든 커밋을 선택 하는 데 사용하십시오 newFeature42.

자식 체리 -V 마스터 newFeature42


-5

풀 요청 생성 시작사용중인 git 호스팅 서비스를 통해 . 지점이 기본 지점으로 완전히 병합 된 경우 새 PR을 만들 수 없습니다.

실제로 풀 요청을 할 필요는 없으며 분기를 선택하는 첫 번째 단계 만 사용하십시오.

예를 들어, GitHub에서 :

비교할 것이 없습니다

병합 된 지점에 대한 PR을 만들 수 없습니다.

이것은 명령 줄에서 git을 사용하지 않지만 다른 비전적인 git 명령을 기억하려고 시도하는 대신 명확한 정신 모델로 다른 도구를 사용하는 것이 도움이되는 경우가 많습니다.

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