오래된 지점이 있는데 삭제하고 싶습니다. 그러나 그렇게하기 전에이 지점에 대한 모든 커밋이 특정 지점에 다른 지점으로 병합되었는지 확인하고 싶습니다. 따라서 다른 브랜치에 적용되지 않은 현재 브랜치에 대한 모든 커밋을보고 싶습니다 (또는 일부 스크립팅이 불가능한 경우 적용되지 않은 한 브랜치의 모든 커밋을 어떻게 볼 수 있습니까? 다른 지사에게?].
오래된 지점이 있는데 삭제하고 싶습니다. 그러나 그렇게하기 전에이 지점에 대한 모든 커밋이 특정 지점에 다른 지점으로 병합되었는지 확인하고 싶습니다. 따라서 다른 브랜치에 적용되지 않은 현재 브랜치에 대한 모든 커밋을보고 싶습니다 (또는 일부 스크립팅이 불가능한 경우 적용되지 않은 한 브랜치의 모든 커밋을 어떻게 볼 수 있습니까? 다른 지사에게?].
답변:
아마 그냥 원해
git branch --contains branch-to-delete
이것은 "branch-to-delete"에서 커밋을 포함하는 모든 브랜치를 나열합니다. "삭제 삭제"이상을보고하면 분기가 병합 된 것입니다.
당신의 대안은 실제로 rev-list 구문 일뿐입니다. 예를 들어 git log one-branch..another-branch
모든 것이 one-branch
필요한 모든 것을 보여줍니다 another-branch
.
현재 git show-branch
위치를 확인하는 방법 으로 관심이있을 수도 있습니다 .
git branch --contains some-branch
만 반환 하면 some-branch
무언가를 반환하지만 병합 되지 않은 것입니다.
git log foo..bar
바의 최신 foo는의 최신하지만, 시간에 더 뒤로에서 누락되지 않은 다른 커밋의 커밋을 보여줍니다. foo가 아닌 bar의 모든 것을 보려면 @jimmyorr의 솔루션을 사용해야합니다.
어떤 커밋이 한 브랜치에 있지만 다른 브랜치에는없는 커밋 목록을 보려면 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
^
여기에 접두사로 사용 하면 혼란 스럽습니다. 이와 관련하여 이는 해당 분기를 제외 함을 의미합니다. ^
접미사로 사용 하는 것은 해당 브랜치의 부모 커밋에 대한 상대 참조입니다.
gitk oldbranch ^newbranch --no-merges
(git 1.8.1.1로 테스트 됨). 참고로, 나를 위해 ^
포괄적 인 HEAD 커밋을 의미합니다 newbranch
.
newbranch가 아닌 oldbranch에는 커밋을 표시하려면 다음을 수행하십시오.
git log newbranch..oldbranch
이 커밋으로 diff를 표시하려면 (세 개의 점이 있음)
git diff newbranch...oldbranch
다음은 다이어그램 그림이있는 문서입니다 https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
newbranch
또는 에 있다면 oldbranch
, git log ..oldbranch
또는 git log newbranch..
각각 할 수 있습니다
..
심판의 이름 사이에 두 개의 점이있어서 도움 이되었습니다. 또한 --cherry-pick
두 가지에있는 커밋을 숨기는 옵션을 사용 했지만 한 분기에서 다른 분기로 체리 선택했기 때문에 다른 해시가 있습니다.
아직도 간단한 답변을 찾고있는 사람들은 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
diff
유틸리티를 사용하여 다양한 파일을 비교할 수 있습니다. 또는 임시 브랜치를 만들고 원래 브랜치에서했던 것과 비슷한 모든 커밋을 스쿼시 한 다음 이것을 사용하면 효과가 있다고 생각합니다.
여기에 게시 된 답변 중 일부는 원하는 것을 찾는 데 도움이되지만 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
jimmyorr의 답변 이 Windows에서 작동하지 않습니다. 다음 과 같이 사용하는 --not
것이 좋습니다 ^
.
git log oldbranch --not newbranch --no-merges
^
Windows에서 지원되지만 필요는 Windows에서, (다른) 인, 이스케이프 ^
: git log oldbranch ^^newbranch --no-merges
.
이 경우 하나의 (단일) 완전히이 지점 'A'로 통합 당신이 해당 분기 'B'를 원하는 경우, 예를 들어, 확인해야한다는 분기, 당신은 단순히 다음을 수행 할 수 있습니다 :
$ git checkout A
$ git branch -d B
git branch -d <branchname>
"지사를 HEAD에 완전히 병합해야합니다."
주의 : 분기 B가 A로 병합되면 실제로 삭제됩니다.
이 간단한 스크립트를 사용하여 병합되지 않은 커밋을 볼 수 있습니다
#!/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 를 사용할 수도 있습니다