ProgramingTip

Git을 사용하여 하나의 특정 브랜치에 * 오직 * 존재하는 모든 커밋을 표시하고 다른 브랜치 * 아무 ** 표시

bestdevel 2020. 10. 21. 21:15
반응형

Git을 사용하여 하나의 특정 브랜치에 * 오직 * 존재하는 모든 커밋을 표시하고 다른 브랜치 * 아무 ** 표시


가 주어지면 분기 해당 분기 에만 존재하는 커밋 목록을보고 싶습니다 . 에서 이 질문에 우리는 한 지점에 있지만 그 이상의 다른 지점을 지정하지 않은 한 어떤 커밋을 참조하는 방법에 대해 설명합니다.

이것은 약간의 숫자입니다. 나는 1 분기에 예정에있는 커밋보고 싶은 어떤 다른 지점.

유스 케이스는 일부 분기가 병합하고 직접 커밋되지 않는 분기점이 있습니다. "병합 전용"브랜치에서 직접 커밋이 이루어 졌는지 확인하는 데 사용됩니다.

편집 : 아래는 테스트 할 더미 git repo를 설정하는 단계입니다.

git init
echo foo1 >> foo.txt
git add foo.txt
git commit -am "initial valid commit"
git checkout -b merge-only
echo bar >> bar.txt
git add bar.txt
git commit -am "bad commit directly on merge-only"
git checkout master
echo foo2 >> foo.txt 
git commit -am "2nd valid commit on master"
git checkout merge-only 
git merge master

병합 전용 브랜치에서 직접 "병합 전용에서 직접 잘못된 커밋"이라고합니다.


우아한 솔루션을 찾았 습니다.

git log --first-parent --no-merges

물론 귀하의 예에서는 초기 커밋이 여전히 표시됩니다.

이 대답은 초기 커밋이 여전히 나타나기 때문에 대답하지 않습니다. 다른 한편으로 여기에 오는 많은 사람들은 그들이 찾고있는 답을 찾는 것입니다.


내 친애하는 친구 Redmumba의 의례 :

git log --no-merges origin/merge-only \
    --not $(git for-each-ref --format="%(refname)" refs/remotes/origin |
    grep -Fv refs/remotes/origin/merge-only)

... origin/merge-only원격 병합 전용 분기 이름은 어디에 있습니까? 로컬 전용 마이스의 repo, 대체 작업을하는 경우 refs/remotes/originrefs/heads, 그리고 대체 원격 지사 이름 origin/merge-only지역 지점 이름 merge-only, 즉 :

git log --no-merges merge-only \
    --not $(git for-each-ref --format="%(refname)" refs/heads |
    grep -Fv refs/heads/merge-only)

git log origin/dev..HEAD

이것은 당신의 브랜치에서 만들어진 모든 커밋을 보여줄 것입니다.


아마도 이것이 도움이 될 수 있습니다.

git show-branch


@Prakash 답변이 작동합니다. 명확성을 위해 ...

git checkout feature-branch
git log master..HEAD

기능 분기에 대한 커밋을 계획하지만 업스트림 분기 (일반적으로 마스터)는 준비하지 않습니다.


이 시도 :

git rev-list --all --not $(git rev-list --all ^branch)

기본적으로 git rev-list --all ^branch분기에없는 모든 개정을 계속 다음 저장소의 모든 개정을 가져오고 분기 에만 있는 개정 인 이전 목록을옵니다 .

@Brian의 댓글 이후 :

git rev-list의 문서에서 :

List commits that are reachable by following the parent links from the given commit(s)

따라서 git rev-list AA가 커밋 인 경우 와 같은 명령 은 A를 포함하여 A에서 도달 할 수있는 커밋을 제공합니다.

이를 염두에두고

git rev-list --all ^A

A에서 도달 할 수없는 커밋을합니다.

모든 git rev-list --all ^branch분기 끝에서 도달 할 수 있습니다. 분기의 모든 커밋을 제거하거나 다른 분기에만있는 커밋을 제거합니다.

이제 가자 git rev-list --all --not $(git rev-list --all ^branch)

git rev-list --all --not {commits only in other branches}

그래서 우리 all는 도달 할 수없는 목록 원합니다.all commits only in other branches

분기 에만있는 커밋 집합입니다 . 간단한 예를 들어 보겠습니다.

             master

             |

A------------B

  \

   \

    C--------D--------E

                      |

                      branch

여기서 목표는 다른 브랜치에없는 커밋 인 D와 E를 얻는 것입니다.

git rev-list --all ^branch B 만 주다

자, git rev-list --all --not B우리가 내려 오는 것입니다. 또한 git rev-list -all ^BB에서 도달 할 수있는 모든 커밋을 원합니다. 우리의 경우에는 D와 E입니다. 이것이 우리가 원하는 것입니다.

이것이 명령이 작동하는 방법을 설명하기를 바랍니다.

댓글 후 수정 :

git init
echo foo1 >> foo.txt
git add foo.txt
git commit -am "initial valid commit"
git checkout -b merge-only
echo bar >> bar.txt
git add bar.txt
git commit -am "bad commit directly on merge-only"
git checkout master
echo foo2 >> foo.txt 
git commit -am "2nd valid commit on master"

위의 단계 후, 당신 git rev-list --all --not $(git rev-list --all ^merge-only)이한다면 당신이 계획 커밋을 얻을 "bad commit directly on merge-only"것입니다.

그러나 단계의 마지막 단계를 수행 git merge master하면 명령이 예상 된 출력을 제공하지 않습니다. 현재 마스터의 추가 커밋도 병합 전용으로 병합되었으므로 병합 전용에없는 커밋이 없기 때문입니다. 그래서 git rev-list --all ^branch빈 결과를 제공하고, 따라서 git rev-list -all --not $(git rev-list --all ^branch)줄 것이다 모든 병합 만에 커밋.


허용되는 답변의 또 다른 변형은 master

git log origin/master --not $(git branch -a | grep -Fv master)

마스터 이외의 분기에서 발생하는 모든 커밋을 필터링합니다.

참고 URL : https://stackoverflow.com/questions/5720343/using-git-show-all-commits-that-exist-only-on-one-specific-branch-and-not-a

반응형