git diff产生不正确的补丁



我试图从git标签Amaster中生成补丁,然后将补丁作为单个提交应用到单独的分支B(其最后提交标记为A)。

我相信git在生成补丁时缺少一些东西,导致它不能干净地应用。

文件it/my/application/Something.kt包含如下代码:

package it.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
import javax.inject.Singleton
typealias Something = Int
master

中的文件被重命名为other/my/application/Something.kt并更改为:

package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import org.slf4j.LoggerFactory
import javax.inject.Singleton
import javax.transaction.Transactional
typealias SomethingId = Int

注意:

  • package it.my.application被改为package other.my.application
  • import it.my.application.SomethingFacade被删除
  • 添加import javax.transaction.Transactional

查看补丁,这些是git为这部分代码生成的块:

diff --git a/src/main/kotlin/it/my/application/Something.kt b/src/main/kotlin/other/my/application/Something.kt
similarity index 91%
rename from src/main/kotlin/it/my/application/Something.kt
rename to src/main/kotlin/other/my/application/Something.kt
index ed24736..cb13606 100644
--- a/src/main/kotlin/it/my/application/Something.kt
+++ b/src/main/kotlin/other/my/application/Something.kt
@@ -1,10 +1,11 @@
-package it.my.application
+package other.my.application

import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import org.slf4j.LoggerFactory
import javax.inject.Singleton
+import javax.transaction.Transactional

typealias SomethingId = Int

如你所见:

  • package行更改被正确报告
  • Transactional进口的增加是正确报告的
  • 没有提到删除SomethingFacade行!

当尝试应用补丁git失败时,说"它不匹配"…

我尝试用-C 2/1/0生成补丁,但它们都以某种方式失败了(注意:我正在为整个目录生成单个补丁。与-C 0我相信这个文件工作,但无数其他文件没有)。

我可以做git apply --3way和手动修复的东西,但这样做的问题并没有得到实际捕获…结果是:

package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
import javax.inject.Singleton
import javax.transaction.Transactional
typealias SomethingId = Int

所以关于SomethingFacade的那行被留在后面。以下是该文件的合并输出:

Checking patch src/main/kotlin/it/my/application/Something.kt => src/main/kotlin/other/my/application/Something.kt...
error: while searching for:
package it.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import org.slf4j.LoggerFactory
import javax.inject.Singleton
typealias SomethingId = Int

error: patch failed: src/main/kotlin/it/my/application/Something.kt:1
Falling back to three-way merge...

git不应该生成:

--- a/src/main/kotlin/it/my/application/Something.kt
+++ b/src/main/kotlin/other/my/application/Something.kt
@@ -1,10 +1,11 @@
-package it.my.application
+package other.my.application

import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
-import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
import javax.inject.Singleton
+import javax.transaction.Transactional

typealias SomethingId = Int

或者像

--- a/src/main/kotlin/it/my/application/Something.kt
+++ b/src/main/kotlin/other/my/application/Something.kt
@@ -1,3 +1,3 @@
-package it.my.application
+package other.my.application

import io.micronaut.runtime.event.annotation.EventListener
@@ -4,7 +4,8 @@
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
-import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
@@ -7,10 +8,11 @@
import javax.inject.Singleton
+import javax.transaction.Transactional

typealias SomethingId = Int

?

为什么它简单地忽略SomethingFacade行?


附加信息(不确定是否相关):

A标签在master分支的前一个提交上,其内容与B分支的HEAD相同。B分支是在以前的master版本的基础上创建的,在以前的版本中,所有的提交都被压缩到一个提交中。

分支B的重点是它应该隐藏提交活动&原始提交的作者。我们通过将所有新提交压缩到B中的单个提交来周期性地同步masterB。所以分支Bmaster没有共同的历史,而是对于B的每个提交,都有一个内容相同的master的提交。我不确定这是否会造成git diff的问题…我已经成功地在其他代码库中使用了这种方法,没有出现任何问题。

要获得特定的diff输出,diff在这里比较的文件必须将这些特定文本作为输入。也就是说,git diff在这里比较的文件文件中没有中的import it.my.application.SomethingFacade

注意,您可以查看正在比较的两个文件,因为它们的blob哈希id是由index行给出的:

index ed24736..cb13606 100644

左侧文件为Git内部blobed24736,右侧文件为Git内部blobcb13606

(这两个不同的文件可能包含在许多不同的提交中,因为Git会删除每次提交中出现的提交副本。所以这里不知道哪些提交被比较;从git diff输出中我们所知道的是比较哪些blob对象。但是您的git diff命令通常会指定要比较的两个提交:

git diff <hash1> <hash2>
例如,这里的两个hash-e是所讨论的提交的哈希id。

如果你使用标签名,例如:

git diff v1.2 v3.4

如果您愿意,可以使用git rev-parse v1.2git rev-parse v3.4让Git解析标签名称以提交哈希id。但是,无论哪种方式,我们都可以从实际的git diff输出中得知,被比较的文件具有两个给定的blob哈希id。

最新更新