source

모든 변경된 파일이 부모 중 한 명과 동의하더라도 결합된 diff 출력으로 병합 커밋을 "git show"하는 방법은 무엇입니까?

manysource 2023. 6. 29. 20:13

모든 변경된 파일이 부모 중 한 명과 동의하더라도 결합된 diff 출력으로 병합 커밋을 "git show"하는 방법은 무엇입니까?

것을 한 후, "단순" 병합(complete merge) 후,git show보통은 다음과 같은 것만 보여줍니다.

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

의 경우에는 왜하면경, 의우합병냐병,우git show에서는 상위 버전 중 하나와 일치하는 파일을 생략하는 결합된 diff 형식을 사용합니다.

복합 디프 모드에서 모든 차이를 계속 표시하도록 Git을 강제하는 방법이 있습니까?

하고있다git show -m(새 버전과 모든 부모 버전 간에 각각 쌍별 차이 사용) 차이를 표시하지만 결합 모드에서처럼 각 열에 +/-로 표시된 차이를 갖는 것을 선호합니다.

커밋 메시지를 확인합니다.

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

선을 주의하십시오.

Merge: fc17405 ee2de56

그 두 명의 커밋 ID를 가져가서 그들을 되돌립니다.따라서 원하는 차이를 얻기 위해 다음을 수행합니다.

git diff ee2de56...fc17405

변경된 파일의 이름만 표시합니다.

git diff --name-only ee2de56..fc17405

이를 추출하기 위해 Gitconfig에 다음을 추가할 수 있습니다.

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

그런 다음 다음 작업을 수행하여 사용합니다.

git exportfiles ee2de56..fc17405 /c/temp/myproject

더 나은 솔루션(@KrisNuttycombe가 언급):

git diff fc17405...ee2de56

병합 커밋의 경우:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

든변화를보위해기주에 모든 합니다.ee2de56의커서 에도수 있는할의 할 수 .fc17405해시의 정보에 된 것과 . 병합 정보에 표시된 것과 동일합니다.Merge: fc17405 ee2de56

또한 두 개 대신의 점에 주목하세요!

변경된 파일 목록의 경우 다음을 사용할 수 있습니다.

git diff fc17405...ee2de56 --name-only

병합하기 전에 HEAD가 하나의 커밋으로 설정된 분기를 만들 수 있습니다.그러면 다음을 수행할 수 있습니다.

git merge --squash testing

병합되지만 커밋되지는 않습니다.그러면:

git diff

병합 커밋에 참석한 경우 다음과 같은 차이가 표시됩니다.

git diff HEAD~1..HEAD

병합 커밋에 참석하지 않은 경우 HEAD를 병합 커밋으로 대체합니다.이 방법은 가장 간단하고 직관적인 것 같습니다.

여기서 대답한 것 같습니다. https://public-inbox.org/git/7vd392ezhx.fsf @http.siamese.dyndns.org/

그래서 비슷한 방식으로, 달리는 것은

git diff --cc $M $M^1 $M^2 $(git merge-base $M^1 $M^2)

에서는 부모 및 병합 기반에 기록된 상태와 비교하여 $M의 상태를 설명하는 결합된 패치를 보여주어야 합니다.

그냥 'git show -c $ref'만 있으면 될 것 같습니다.8e4a59의 Git 저장소에서 이를 시도하면 결합된 diff(2열 중 하나에 +/-문자)가 표시됩니다.git-show 매뉴얼에서 언급한 것처럼 'git diff-tree'를 사용해야 하므로 이러한 옵션은 유용한 것으로 보입니다.

위와 같이 병합 커밋이 0e1329e5인 경우 이 병합에 포함된 diff를 다음과 같이 얻을 수 있습니다.

git diff 0e1329e5^..0e1329e5

이것이 도움이 되길 바랍니다!

당신의 경우에는 그냥 하면 됩니다.

git diff HEAD^ HEAD^2

또는 해시를 사용하여 커밋할 수 있습니다.

git diff 0e1329e55^ 0e1329e55^2

diff-tree 명령을 -c 플래그와 함께 사용할 수 있습니다.이 명령은 병합 커밋에서 변경된 파일을 표시합니다.

git diff-tree -c {merged_commit_sha}

Git-Scm에서 -c 플래그에 대한 설명을 받았습니다.

이 플래그는 병합 커밋이 표시되는 방식을 변경합니다(즉, 명령에 또는 --stdin이 지정된 경우에만 유용함).부모와 결과 사이의 쌍별 차이를 한 번에 하나씩 표시하는 대신 각 부모의 차이와 병합 결과를 동시에 표시합니다(이는 -m 옵션이 수행하는 작업).또한 모든 부모로부터 수정된 파일만 나열됩니다.

저는 병합의 커밋에 대해 다양한 작업을 수행하는 범용 접근 방식을 구축했습니다.

1단계: 편집하여 git에 별칭 추가~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

2단계:~/.githelpersbash 함수 정의:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

3단계: 이익!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

여기에는 아마도 개선의 여지가 많을 것입니다. 저는 성가신 상황을 극복하기 위해 이것을 재빨리 정리했습니다.내 bash 구문 및/또는 논리를 언제든지 조롱하십시오.

아니요, 이 작업을 수행할 방법이 없습니다.git show하지만 가끔은 확실히 좋을 것이고, git 소스 코드에서 구현하는 것이 비교적 쉬울 것입니다(결국, 당신은 그것이 외부 출력이라고 생각하는 것을 제거하지 말라고 말하면 됩니다). 그래서 그렇게 하기 위한 패치는 아마도 git 유지보수자들에게 받아들여질 것입니다.

하지만 원하는 것이 무엇인지 주의하십시오. 지점을 3개월 전에 분기된 한 줄 변경 사항과 병합하면 여전히 본선과 큰 차이가 있으므로 이러한 완전한 차이는 거의 도움이 되지 않습니다.그래서 깃이 보이지 않는 겁니다.

언급URL : https://stackoverflow.com/questions/5072693/how-to-git-show-a-merge-commit-with-combined-diff-output-even-when-every-chang