2013-03-29 4 views
6

나는 오픈 소스 프로젝트에서 병합을 연구하기위한 연구를하고있다.Git 저장소에서 충돌이 발생한 모든 병합을 찾으려면 어떻게해야합니까?

나는 최근에 How can I find all the commits that have more than one parent in a Git repository?에게 물었고 매우 좋은 답변을 얻었습니다.

이제는 충돌이있는 커밋 만 찾으려면 쿼리를 좁혀 야합니다.

충돌로 인해 동일한 파일이 두 개의 커밋 커밋에서 수정되었음을 의미합니다.

또한 git 또는 bash (grep, awk?) 명령을 사용하면 동일한 작성자가 두 작성자가 수정 한 커밋 만 제공하는 경우 매우 유용합니다.

아이디어는 자동으로 해결할 수없는 커밋을 찾는 것입니다.

그렇다면 어떻게하면 git 저장소에서 충돌이있는 모든 병합을 찾을 수 있습니까?

+0

, 내가 너무 의욕에 같은 질문을했다 : http://stackoverflow.com/questions/15707690/how-can-i-find-all-the-merges-that-had - 수 쿠지 보관소 – macrobug

답변

4

일단 병합 커밋이 만들어지면 병합 수행 방법에 대한 정보가 유실됩니다. git merge은 전략 모양 및 전략 별 옵션과 같이 충돌 모양에 영향을주는 다양한 옵션을 허용하기 때문에 중요합니다. 그러나 에 병합을 발견하는 합리적인 경우를이 기본 병합 옵션과 충돌 시키면 병합 강제 실행, 병합 커밋 실행, 병합 다시 작성 및 플래그 지정 자식 보고서.

참고 :이 스크립트는 여러 커밋을 체크 아웃하고 모든 반복에서 git reset --hardgit clean -fdx까지 실행합니다. git에서 알 수없는 중요한 파일이없는 체크 아웃에서만 실행하십시오! 아무도 관심이 경우

#!/bin/bash 

old_branch=$(git symbolic-ref --short HEAD) 
for commit in `git rev-list --merges HEAD` 
do 
    # find the parents of the merge commit 
    parents=$(git log -1 --format=%P $commit) 
    fst=${parents%% *} 
    rest=${parents#* } 
    # check out the first parent 
    git checkout -q $fst 
    # merge with the rest of them 
    git merge --no-commit $rest >/dev/null 2>&1 
    # if there are any conflicts, print the commit and abort the merge 
    if git ls-files --unmerged | grep -q '^'; then 
    echo $commit 
    git merge --abort 
    fi 
    # get rid of changes so the next checkout doesnt complain 
    git reset -q --hard 
    git clean -fdxq 
done 
git checkout -q $old_branch 
+0

감사합니다. user4815162342! 이것은 내가 필요한 것입니다. – macrobug

관련 문제