2021年12月4日作成
GitのCombined Diffフォーマット
通常のコミットに対して
% git diff
すると、Unified Diffフォーマットで出力されます。 このフォーマットでは左側1文字目の文字をみることで、 その行が追加されたのか削除されたのか、を見わけることができます。
diff --git a/sys/src/cmd/auth/factotum/totp.c b/sys/src/cmd/auth/factotum/totp.c
index f32caa77..95202886 100644
--- a/sys/src/cmd/auth/factotum/totp.c
+++ b/sys/src/cmd/auth/factotum/totp.c
@@ -50,7 +50,7 @@ base32d(uchar *dest, int ndest, char *src, int nsrc)
tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
while(nsrc>=8){
for(i = 0; i < 8; i++){
- s = strchr(tab, src[i]);
+ s = strchr(tab, toupper(src[i]));
if(s == nil)
return -1;
u[i] = s-tab;
+の行は追加、-の行は削除、変更のない行はスペースです。
マージコミットの場合
Gitでマージしたとき、以下の3つが登場します。
- 共通の祖先(-1, --base)
- 自分たちの差分(-2, --ours)
- 相手側(マージするブランチ)の差分(-3, --theirs)
例えば、
% git switch main
% git merge other
と実行した場合、--baseはmainとotherの共通にある祖先、 --oursはmainの差分、--theirsはotherの差分となります。
マージまたはリベース時にコンフリクトが発生したとき、 通常のdiffとは異なり、左側の先頭2文字で状態を表現するフォーマットが使われます。
diff --cc sys/src/ape/lib/ap/plan9/_buf.c
index a2dea18c,67f3f9c6..00000000
--- a/sys/src/ape/lib/ap/plan9/_buf.c
+++ b/sys/src/ape/lib/ap/plan9/_buf.c
@@@ -349,7 -348,7 +404,13 @@@ select(int nfds, fd_set *rfds, fd_set *
}
mux->selwait = 1;
unlock(&mux->lock);
++<<<<<<< HEAD
+ fd = (uintptr_t)_RENDEZVOUS(&mux->selwait, 0);
++||||||| 338bd13f
++ fd = _RENDEZVOUS((uintptr_t)&mux->selwait, 0);
++=======
+ fd = _RENDEZVOUS((unsigned long)&mux->selwait, 0);
++>>>>>>> stable
if(fd >= 0) {
b = _fdinfo[fd].buf;
if(FD_ISSET(fd, &mux->rwant)) {
このフォーマットはCombined Diffフォーマットといって、 --oursに含まれる差分は1文字目、--theirsに含まれる差分は2文字目を使って表します。 また、どちらにも存在しない(新規の)差分を++で表現します。 上記例の場合、++となっているのはマージ失敗によりGitが追加した行ですね。
このコンフリクトを解消してコミットすると、また少し異なる表示になります。
diff --cc sys/src/ape/lib/ap/plan9/_buf.c
index a2dea18c,67f3f9c6..f6bd186a
--- a/sys/src/ape/lib/ap/plan9/_buf.c
+++ b/sys/src/ape/lib/ap/plan9/_buf.c
@@@ -349,7 -348,7 +348,7 @@@ select(int nfds, fd_set *rfds, fd_set *
}
mux->selwait = 1;
unlock(&mux->lock);
- fd = (uintptr_t)_RENDEZVOUS(&mux->selwait, 0);
- fd = _RENDEZVOUS((unsigned long)&mux->selwait, 0);
++ fd = (int)_RENDEZVOUS(&mux->selwait, 0);
if(fd >= 0) {
b = _fdinfo[fd].buf;
if(FD_ISSET(fd, &mux->rwant)) {
これも同様に、--oursの差分を1文字目、 --theirsの差分を2文字目を使って表しますが、 上記のdiffはマージした結果なので、
- --oursのブランチにあった行を削除
- --theirsのブランチにあった行も削除
- 代わりに、++の行を追加
このように編集すると、現在のブランチ内容と同じになる、という意味です。