如何在git中找到与意外冲突的合并?

时间:2014-12-09 13:13:19

标签: git merge

在下面的例子中,我在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为我执行这个逻辑吗?

0 个答案:

没有答案