병합 커밋에 숨겨진 변경 사항
병합 커밋은 변경 사항을 Git 로그 출력에서 자동으로 숨 깁니다. 곡괭이 와 후진은 모두 변화를 찾지 못했습니다. 그래서 내가 원하는 줄이 추가되고 나중에 제거되었고 그것을 제거 한 병합을 찾고 싶었습니다. 파일 git log -p -- path/file
히스토리가 추가 된 것만 보여주었습니다. 내가 찾은 가장 좋은 방법은 다음과 같습니다.
git log -p -U9999 -- path/file
변경 사항을 검색 한 후 "^ commit"을 역방향으로 검색하십시오. 첫 번째 "^ commit"은 파일의 마지막 행이 커밋 된 것입니다. 두 번째 "^ commit"은 사라진 후입니다. 두 번째 커밋은 제거한 것일 수 있습니다. 그만큼-U9999
파일 모두 최대 9999 선입니다 가정 (파일이 변경 될 때마다 후) 전체 파일 내용을 표시하기위한 것입니다.
무차별 대입을 통해 관련 병합을 찾습니다 (가능한 모든 병합 커밋을 첫 번째 상위와 비교하고 많은 커밋에 대해 실행)
git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less
(수정 필터를 더 제한하려고 시도했지만 문제가 발생하여 권장하지 않습니다. 내가 찾고 있던 추가 / 제거 변경 사항은 다른 시간에 병합 된 다른 지점에 있었으며 A ... B에는 포함되지 않았습니다. 변경 사항이 실제로 메인 라인에 병합 된 시점)
이 두 커밋으로 Git 트리 표시 (그리고 많은 복잡한 Git 히스토리가 제거되었습니다) :
git log --graph --oneline A B ^$(git merge-base A B)
(A는 위의 첫 번째 커밋, B는 위의 두 번째 커밋)
A의 역사와 B의 역사를 빼고 A와 B의 역사를 뺀다.
대체 버전 (일반적인 Git 히스토리 트리보다는 경로를보다 선형으로 표시하는 것으로 간주되지만 일반 git 히스토리 트리를 선호합니다) :
git log --graph --oneline A...B
두 개의 점이 아닌 세 개의 점-세 개의 점은 "r1 r2-$ (git merge-base --all r1 r2가 아님)를 의미합니다. 이것은 r1 (왼쪽) 또는 r2 (오른쪽) 중 하나에서 도달 할 수있는 커밋 세트입니다. "하지만 둘 다가 아닙니다." -출처 : "man gitrevisions"
git log -S<string> /path/to/file
-c
-cc