developer tip

Git-특정 브랜치의 첫 번째 커밋을 찾는 방법

copycodes 2020. 10. 17. 10:40
반응형

Git-특정 브랜치의 첫 번째 커밋을 찾는 방법


다음 예제 트리에서 :

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

xxx 지점의 첫 번째 커밋 인 F를 찾고 있습니다. 다음과 같이 가능하다고 생각합니다.

git log xxx --not master

마지막으로 나열된 커밋은 F 여야합니다. 올바른 솔루션입니까 아니면 단점이 있습니까?

나는 stackoverflow에 비슷한 질문이 있다는 것을 알고 있지만 아무도 그러한 솔루션을 제안하지 않았으며 내가 올바르게 수행하는지 확실하지 않습니다.


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

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


merge-base이 문제를 정확히 해결하도록 설계된 기능을 사용해야합니다 .

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

git cherry master -v | head -n 1

브랜치 (이전 브랜치)가 다시 마스터로 병합되어 예상 결과가 나오지 않는 경우 Python 스크립트를 사용하여 초기 브랜치 커밋 ID를 찾습니다.

git rev-list --first-parent changeset

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

상위 분기를 찾을 때까지 위의 명령에서 변경 집합을 반복합니다.

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 브랜치의 첫 번째 커밋은 제공하지 않습니다. 후자는 xxx 분기가 삭제 및 / 또는 한 번 이상 다시 생성 된 경우 어려울 수 있습니다. 이 경우 다음을 시도해 볼 수 있습니다.

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

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

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

반응형