programing

Git - 특정 지점의 첫 커밋을 찾는 방법

procenter 2023. 9. 27. 20:51
반응형

Git - 특정 지점의 첫 커밋을 찾는 방법

다음 예제 트리:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

xxx 지점의 첫 커밋인 F를 찾고 있습니다.저는 다음과 같은 방법으로 가능하다고 생각합니다.

git log xxx --not master

마지막으로 나열된 커밋은 F여야 합니다.올바른 해결책인가요, 아니면 단점이 있을 수도 있나요?

스택 오버플로우에 대해서도 비슷한 질문이 있었다는 것은 알고 있지만, 그런 솔루션을 제안한 사람은 아무도 없고, 제대로 할지도 잘 모르겠습니다.

git log master..branch --oneline | tail -1

여기서 "branch"는 특정 분기 이름입니다.점 점은 지점이 마스터에게 없는 모든 커밋을 제공합니다.tail -1이전 출력에서 마지막 줄을 반환합니다.

git cherry master -v | head -n 1

cherry- 분기 업스트림(docs)에 존재하지 않는 현재 분기의 커밋을 표시합니다.업스트림(이 경우 마스터)은 현재 분기에서 파생된 점입니다.

-v- (SHA 대신) 커밋 이름을 표시합니다. - 장황합니다.

head- 인쇄하는 Unix 명령어n텍스트에서 줄 수

당신은 사용해야 합니다.merge-base이를 정확하게 해결하기 위해 설계된 기능:

git merge-base remotes/origin/<branch> develop 

분기(이전 분기)가 다시 마스터로 병합된 경우 예상 결과를 제공하지 않습니다.python 스크립트를 사용하여 초기 branch commit Id를 찾습니다.

git rev-list --첫째 부모 변경 집합

--첫째 부모는 병합 커밋을 볼 때 첫 번째 부모 커밋만 따릅니다.

상위 분기가 발견될 때까지 위 명령에서 변경 집합을 반복합니다.

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)
git cherry master -v | tail -1   

그러나 이것은 마스터에 없는 분기 xxx에 대한 첫 번째 커밋만 제공할 뿐 분기 xxx에 대한 첫 번째 커밋은 제공하지 않습니다.branch xxx가 삭제되거나 한 번 이상 다시 생성된 경우 후자는 어렵습니다.이 경우 다음을 시도해 볼 수 있습니다.

git reflog | grep checkout | grep xxx | tail -1   

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1

매우 간단합니다.이를 통해 피쳐 브랜치에서 첫 번째 커밋의 해시를 직접 가져올 수 있습니다.

git log <source_branch>..<feature_branch> --pretty=format:%h

이 명령어를 사용해봤는데 효과가 있었습니다.

git log <source_branch> <feature_branch> --oneline | tail -1

언급URL : https://stackoverflow.com/questions/18407526/git-how-to-find-first-commit-of-specific-branch

반응형