在下面的例子中,我在master的头部产生了一个“奇怪”的合并 - 它改变了一个没有冲突的文件。 Git似乎不想告诉我我已经这样做了。
git init test
cd test
seq 1 5 > file1
git add file1
seq 6 10 > file2
git add file2
git commit -m root
git branch branch
sed -i 's/7/8/' file2
git commit -a -m '7++'
git checkout branch
sed -i 's/7/6/' file2
sed -i 's/3/4/' file1
git commit -a -m '7--; 3++'
git checkout master
git branch oldmaster
git merge branch
git checkout master file1
git checkout branch file2
git commit
显然,产生这个问题的过程是不寻常的,但假设我不是创造它的人,我怎么能找到它? git log没有用;它甚至没有显示我选择的哪些冲突:
git log -p --graph
* commit cde4ac55b4c60d5c5c7f36bae9d9cc34689b20c1
|\ Merge: 8689e18 f42deb9
| | Author: David Buckley <bucko@gambitresearch.com>
| | Date: Tue Dec 9 12:29:51 2014 +0000
| |
| | Merge branch 'branch'
| |
| | Conflicts:
| | file2
| |
| * commit f42deb9971ca05afbff11bb5dcc77650585c990b
| | Author: David Buckley <bucko@gambitresearch.com>
| | Date: Tue Dec 9 12:29:51 2014 +0000
| |
| | 7--; 3++
| |
| | diff --git a/file1 b/file1
| | index 8a1218a..6234030 100644
| | --- a/file1
| | +++ b/file1
| | @@ -1,5 +1,5 @@
| | 1
| | 2
| | -3
| | +4
| | 4
| | 5
| | diff --git a/file2 b/file2
| | index 1e1140b..63f0f17 100644
| | --- a/file2
| | +++ b/file2
| | @@ -1,5 +1,5 @@
| | 6
| | -7
| | +6
| | 8
| | 9
| | 10
| |
* | commit 8689e183d785af50dd2f92e3d7bed3b62507447f
|/ Author: David Buckley <bucko@gambitresearch.com>
| Date: Tue Dec 9 12:29:51 2014 +0000
|
| 7++
|
| diff --git a/file2 b/file2
| index 1e1140b..6f1177a 100644
| --- a/file2
| +++ b/file2
| @@ -1,5 +1,5 @@
| 6
| -7
| +8
| 8
| 9
| 10
|
* commit bb2a50a7164ffe79a2fc26d0008ca4fe26b07442
Author: David Buckley <bucko@gambitresearch.com>
Date: Tue Dec 9 12:29:51 2014 +0000
root
diff --git a/file1 b/file1
new file mode 100644
index 0000000..8a1218a
--- /dev/null
+++ b/file1
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/file2 b/file2
new file mode 100644
index 0000000..1e1140b
--- /dev/null
+++ b/file2
@@ -0,0 +1,5 @@
+6
+7
+8
+9
+10
问题在于头部的合并提交会将更改恢复为file1,但是git log并不表示发生了这种情况,或者甚至认为这种合并很有意思。
git blame无法看到reversion(它声称所有file1都可以归咎于初始提交),即使我将master合并到分支而不是反向。
我可以在这种情况下找到 通过使用'-m'强制每个父级的差异,但是在合并之前在两个分支上完成了大量工作的情况下,这是无用的 - 这种不寻常的变化将被双方的合理变化所淹没,并且每个父母的每一次“正常”变化都会重复。
显然,'git merge'可以在这里找到问题,因为提交与父母的区别在于单独合并不会提示。感觉差异输出的格式仅使用有问题的提交及其所有父项作为源信息。我希望它还考虑到所有父母的合并基础 - 并且在没有合并基础的情况下,提供类似于'-m'的输出。
我可以得到一些接近我想要的东西:
diff -u <(git diff oldmaster..master) <(git diff $(git merge-base oldmaster branch)..branch)
--- /proc/self/fd/11 2014-12-09 13:01:44.576808417 +0000
+++ /proc/self/fd/12 2014-12-09 13:01:44.576808417 +0000
@@ -1,10 +1,21 @@
+diff --git a/file1 b/file1
+index 8a1218a..6234030 100644
+--- a/file1
++++ b/file1
+@@ -1,5 +1,5 @@
+ 1
+ 2
+-3
++4
+ 4
+ 5
diff --git a/file2 b/file2
-index 6f1177a..63f0f17 100644
+index 1e1140b..63f0f17 100644
--- a/file2
+++ b/file2
@@ -1,5 +1,5 @@
6
--8
+-7
+6
8
9
和
diff -u <(git diff branch..master) <(git diff $(git merge-base oldmaster branch)..oldmaster)
--- /proc/self/fd/11 2014-12-09 13:02:05.680455766 +0000
+++ /proc/self/fd/12 2014-12-09 13:02:05.680455766 +0000
@@ -1,14 +1,14 @@
-diff --git a/file1 b/file1
-index 6234030..8a1218a 100644
---- a/file1
-+++ b/file1
+diff --git a/file2 b/file2
+index 1e1140b..6f1177a 100644
+--- a/file2
++++ b/file2
@@ -1,5 +1,5 @@
- 1
- 2
--4
-+3
- 4
- 5
+ 6
+-7
++8
+ 8
+ 9
+ 10
然而,第二项输出显然有些笨拙。
我可以说服git为我执行这个逻辑吗?