병합 커밋에 대한 차이점을 "깃"으로 보여주는 방법은?
및 시 git show <commit-ish>되고 diffs 는가 합니다.
commit c0f50178901e09a1237f7b9d9173ec5d1c4936c
Merge: ed234b ded051
Author: abc
Date: Mon Nov 21 15:56:33 2016 -0800
Merge branch 'abc'
실제 커밋이 병합 로그에 있는 것은 이해하지만, 타이핑은 저장하고 싶습니다.diff in one을 표시하는 방법이 있습니까?
다음 중 하나를 사용합니다.
git show -m c05f017
git show --first-parent c05f017
git diff c05f017^ c05f017
질문에 근본적인 오류가 있습니다. 커밋은 차이가 아닙니다. 커밋은 스냅샷입니다.이것은 차이가 없는 구별처럼 보일 수 있습니다. 그리고 일부 커밋의 경우에도 그렇습니다.하지만 합병 커밋의 경우에는 그렇지 않습니다.
.git show(또는git log -p)는 커밋을 diff로 보여줍니다. 커밋의 스냅샷을 다른 것과 비교함으로써 그렇게 하고 있습니다.git diff명령어는 한 커밋을 다른 커밋과 비교합니다. (또는 커밋을 작업 트리, 인덱스의 내용, 또는 몇 가지 다른 조합과 비교할 수도 있습니다.)
일반 커밋의 경우 비교 대상이 무엇인지는 매우 명확합니다. 이 커밋의 스냅샷을 이전(즉, 상위) 커밋의 스냅샷과 비교합니다.그래서 그것이git show합니다(그리고git log -p됩니다): 실행됩니다.git diff부모 약속에서 이 약속으로.
그러나 병합 커밋에는 부모 커밋이 하나만 있는 것은 아닙니다.그들은 두명의 부모가 있습니다.1이것이 그들을 처음부터 "병합 커밋"으로 만드는 이유입니다. 병합 커밋의 정의는 적어도 두 명의 부모가 있는 커밋입니다.
1병합 커밋에는 세 개 이상의 부모가 있을 수 있습니다.이것들은 "문어 병합" 이라고 불립니다.하지만 특별한 일은 하지 않고 주로 과시용입니다. :-) 여기서는 무시하셔도 됩니다.
두 쪽이 해야 요?git show비교해 볼까요?
.git log -p기본적으로 선택하는 작업은 전혀 비교하지 않습니다.다양한 플래그를 추가하여 표시할 수 있습니다(아래 참조).
.git show기본적으로 선택하는 작업은 더 복잡합니다.이 두 니까님.git show먼저 "첫 번째 부모"와 비교한 2다음 두 번째 부모와 비교합니다.그런 다음 이 부분은 매우 중요합니다. 두 개의 디프를 결합하여 이른바 "결합 디프"를 생성합니다.
다음 절에서는 까다롭지만 매우 유용한 Git 구문에 주목하겠습니다.만약 당신이 커밋 아이디가 있다면 다음과 같이c05f017하고 "" 를 할 수 .^그 다음에는 부모 커밋을 지정합니다.선택적으로 다른 번호를 추가하여 어떤 상위 번호를 선택할 수 있습니다.정기적인 (합병이 아닌) 커밋의 경우에는 하나밖에 없습니다.c05f017^는 부모입니다.병합 커밋의 경우,c05f017^그리고.c05f017^1둘 다 첫번째 부모를 의미합니다.c05f017^2두번째 부모를 의미합니다.
2이것을 인용문에 넣게 된 이유는 우리가 잠시 후에 보게 되겠지만, Git에서 첫 번째 부모 아이디어가 특히 중요하기 때문입니다.다시 말해, 깃은 어떤 부모가 먼저냐에 가장 신경을 쓰고, 나머지는 그저 "나머지"일 뿐입니다.
복합 디프
결합된 diff 형식은 설명서에 설명되어 있지만, 여기에서는 특히 모호하게 만들기 위해 키 비트를 먼저 설명합니다.3
결합된 파일은 모든 상위 파일에서 수정된 파일만 표시됩니다.
즉, M을 병합 커밋이라 가정하고, M^1 대 M이 파일이라고 말합니다.mainline.txt그리고.common.txt둘 다 변했어요더 나아가 M^2와 M이 그 파일을 말하는 것을 가정하자.sidebranch.txt그리고.common.txt둘 다 변했어요결합된 diff만 표시되며 둘 다 생략됩니다.mainline.txt그리고.sidebranch.txt두 파일이 하나의 부모(각각)로부터만 수정되었기 때문입니다.(그렇다고 해도 Git은 약간의 차이만 보일 수 있습니다.common.txt.)
다른 부분을 계속 보고 있었기 때문에 문서에서 이것을 찾는 데 오랜 시간이 3걸렸습니다.
디프 분할하기
-moption—m은 아마도 여기서 merge를 의미합니다— 사실상 git이 merge를 "분할"하도록 지시합니다.즉, 각 부모에 대한 diff를 하나의 큰 diff로 결합하려고 하지 말고 각 부모에 대한 diff를 한 번에 하나씩 보여줍니다.
이것은 가끔 당신이 원하는 것입니다.할 수 있습니다.git diff두 부모 중 한 명을 반대하는 것(또는 아래 참조).
당신은 어떤 부모를 반대해야 합니까?
보통 정답은 "첫 번째 부모"입니다.
"최초 부모" 개념의 핵심은 Git이 병합 커밋을 할 때 그 시점에 있는 지점을 항상 최초 부모로 기록한다는 것입니다.다른 분기가 두 번째 상위 분기가 됩니다.
에 , 입니다.develop그리고 당신은 합쳐집니다.topic:
$ git checkout develop
$ git merge topic
Git은 현재 지점에서 새로운 커밋(부모 2명과의 병합 커밋)을 할 것입니다.develop. 병합 커밋의 첫 번째 부모는 다음의 정보였던 커밋이 될 것입니다.develop조금 전에두 번째 부모는 (여전히) 의 일각인 커밋이 될 것입니다.topic.
보통 합병이 어떤 결과를 가져오는지에 대해 관심이 많으시므로, 첫 번째 부모님과 비교해보면 알 수 있을 것입니다.그래서 보통은 그게 당신이 원하는 겁니다.로,git show다를 할 수 .git show --first-parent을 ' 을 '' git show (입니다와 .) 다.git show -m을 두 번 첫 은 첫 두 은 두 합니다. 합니다).
마찬가지로 실행할 수 있습니다.git log -p --first-parent서.--first-parentflag는 훨씬 더 중요한 영향을 미칩니다. 로그 작업은 사이드 브랜치의 커밋을 전혀 보지 않고 주(첫째 부모) 라인의 커밋만 봅니다.만약 당신의 Git가 2.31보다 더 오래되었다면, 당신은 여전히 필요합니다.-m그에도) 시)git log ,git show값:--cc따라서 이를 위해서 필요한 것은 아닙니다.-m이 것은 2 이 Git 2.31) 에서되었습니다.
간단한 명령은 다음과 같습니다.
git show HEAD -m
일반적으로 사용되는 다른 명령어를 반영한다는 점을 고려하면 기억에 좀 더 남을 수도 있습니다.
병합 결과 병합된 분기에 대해 변경된 모든 내용이 표시됩니다.
참고 항목 , 사용--diff-mergesGit 2.31(2021년 1분기)과 함께 도입되었습니다.
여기서 언급한 바와 같이, 이러한 솔루션은 다음과 같은 조합된 차이점을 보여줍니다.
git diff --cc $M $M^1 $M^2 $(git merge-base $M^1 $M^2)
: 에서"의 .diff --cc" 병합에 포함된 이름이 변경될 때 원래 경로를 표시하지 않았습니다.
Git 2.22(2019년 1분기)의 새로운 옵션은 원본 트리의 경로를 출력에 추가합니다.
git diff --cc --combined-all-paths $M $M^1 $M^2 $(git merge-base $M^1 $M^2)
log,diff-tree: 보탠다--combined-all-paths병합에 대한 결합된 diff 형식은 이름 바꾸기 또는 복사 탐지가 활성화된 경우에도 파일 이름 하나만 나열합니다.
예를 들어, 원시 형식의 경우 다음을 볼 수 있습니다.
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c ::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh ::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c에게 의
bar.sh의 이름을 요 원래 는 알 수가 없어요phooey.c부모님들 중 한 분 안에 있었어요반면 병합되지 않은 커밋의 경우 원시 형식은 원래 파일 이름(및 부팅할 이름 바꾸기 점수)을 제공합니다.
파일 합니다.--combined-all-paths함) 중 과 함께 해야 합니다.-c아니면--cc으로 구분된 파일 할 수 ) 에서만 할 수그러면 위의 출력이 다음과 같이 변환됩니다.
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c ::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh ::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c또한 패치 형식에서는 from/to 헤더를 변경하여 "from" 헤더를 하나만 갖는 대신 각 부모에 대해 하나씩 얻을 수 있습니다.
를 들어,에,--- a/phooey.c +++ b/phooey.c우리는 보게 될 것입니다.
--- a/fooey.c --- a/fuey.c +++ b/phooey.c
git show -c c0f501커밋과 결합된 차이를 표시합니다.c0f501d에 인쇄된 와 같이.git diff통폐합 중에
은 더 합니다.git show -m.
그러나 두 상위 항목(또는 문어 병합의 경우 두 상위 항목)에 대해 변경된 파일의 변경 내용만 표시합니다.예:파일이 있을 때f1그리고.f2고,됩니다.f2그리고.f3두 되며, 됩니다에서 만 해당됩니다. 변경 사항만 다음과 같습니다.f2이 명령에 의해 표시됩니다..f1그리고.f3표시되지 않습니다.따라서 전체 개요를 파악하려면 다음과 같은 방법을 사용해도 좋습니다.git show -m 전 git show -c.
예git show -c 문어 둘 파일에 됩니다.우,됩니다.
commit 3a9f99582921495f7c25e682d4af36d3407983f9 (HEAD -> master)
Merge: 33fb507 91c772b edf2d9c
Author: Foo Bar <foobar@example.net>
Date: Mon Mar 22 15:56:37 2021 +0100
Merge branches 'b1' and 'b2'
diff --combined b
index 4658c0c,a305e3c,2788b76..9c7beb1
--- a/b
+++ b/b
@@@@ -1,5 -1,5 -1,5 +1,7 @@@@
1
2
+ +a
3
++b
4
++ c
반해 는git show -m합니다는(는) 길고 을 제공합니다
git show -m 3a9f99582921495f7c25e682d4af36d3407983f9
commit 3a9f99582921495f7c25e682d4af36d3407983f9 (from 33fb5076fbbcc2d82aa0b877c959b8e4cc4f7b74)
Merge: 33fb507 91c772b edf2d9c
Author: Foo Bar <foobar@example.net>
Date: Mon Mar 22 15:56:37 2021 +0100
Merge branches 'b1' and 'b2'
diff --git a/a b/a
index 94ebaf9..775aea6 100644
--- a/a
+++ b/a
@@ -1,4 +1,5 @@
1
+a
2
3
4
diff --git a/b b/b
index 4658c0c..9c7beb1 100644
--- a/b
+++ b/b
@@ -1,5 +1,7 @@
1
2
+a
3
b
4
+c
commit 3a9f99582921495f7c25e682d4af36d3407983f9 (from 91c772b2c57ff9b4791b57712c26aefbd0c7e730)
Merge: 33fb507 91c772b edf2d9c
Author: Foo Bar <foobar@example.net>
Date: Mon Mar 22 15:56:37 2021 +0100
Merge branches 'b1' and 'b2'
diff --git a/b b/b
index a305e3c..9c7beb1 100644
--- a/b
+++ b/b
@@ -2,4 +2,6 @@
2
a
3
+b
4
+c
commit 3a9f99582921495f7c25e682d4af36d3407983f9 (from edf2d9c9a255a709875988278a4eda6f7072196e)
Merge: 33fb507 91c772b edf2d9c
Author: Foo Bar <foobar@example.net>
Date: Mon Mar 22 15:56:37 2021 +0100
Merge branches 'b1' and 'b2'
diff --git a/a b/a
index 94ebaf9..775aea6 100644
--- a/a
+++ b/a
@@ -1,4 +1,5 @@
1
+a
2
3
4
diff --git a/b b/b
index 2788b76..9c7beb1 100644
--- a/b
+++ b/b
@@ -1,5 +1,7 @@
1
2
+a
3
+b
4
c
모던 git에는 정교한 다른 옵션이 있습니다.
--diff-merges=(off|none|on|first-parent|1|separate|m|combined|c|dense-combined|cc|remerge|r), --no-diff-merges
Specify diff format to be used for merge commits.
Default is dense-combined unless --first-parent is in use, in which case first-parent is the default.
--diff-merges=(off|none), --no-diff-merges
Disable output of diffs for merge commits. Useful to override implied value.
--diff-merges=on, --diff-merges=m, -m
This option makes diff output for merge commits to be shown in the default format.
-m will produce the output only if -p is given as well. The default format
could be changed using log.diffMerges configuration parameter, which default value is separate.
--diff-merges=first-parent, --diff-merges=1
This option makes merge commits show the full diff with respect to the first parent only.
--diff-merges=separate
This makes merge commits show the full diff with respect to each of the parents.
Separate log entry and diff is generated for each parent.
--diff-merges=remerge, --diff-merges=r, --remerge-diff
With this option, two-parent merge commits are remerged to create a temporary
tree object -- potentially containing files with conflict markers and such.
A diff is then shown between that temporary tree and the actual merge commit.
The output emitted when this option is used is subject to change,
and so is its interaction with other options (unless explicitly documented).
--diff-merges=combined, --diff-merges=c, -c
With this option, diff output for a merge commit shows the differences from each of the parents
to the merge result simultaneously instead of showing pairwise diff between a parent and the result one at a time.
Furthermore, it lists only files which were modified from all parents. -c implies -p.
--diff-merges=dense-combined, --diff-merges=cc, --cc
With this option the output produced by --diff-merges=combined is further
compressed by omitting uninteresting hunks whose contents in the parents have
only two variants and the merge result picks one of them without modification.
--cc implies -p.
언급URL : https://stackoverflow.com/questions/40986518/how-to-git-show-the-diffs-for-a-merge-commit
'programing' 카테고리의 다른 글
| MariaDB: 권한이 없는 'root' 및 ' 둘 다(접근 거부 1044 및 1227) (0) | 2023.09.26 |
|---|---|
| 함수 소요시간 측정 : clock_gettime (0) | 2023.09.26 |
| Jquery를 사용하여 부모 디바의 ID 찾기 (0) | 2023.09.21 |
| 위도와 경도에서 완전한 주소를 얻는 방법은? (0) | 2023.09.21 |
| 악센트 문자를 '?'로 저장하는 MySQL - MariaDB (0) | 2023.09.21 |