我试图从git标签A
和master
中生成补丁,然后将补丁作为单个提交应用到单独的分支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
中的单个提交来周期性地同步master
和B
。所以分支B
和master
没有共同的历史,而是对于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.2
和git rev-parse v3.4
让Git解析标签名称以提交哈希id。但是,无论哪种方式,我们都可以从实际的git diff
输出中得知,被比较的文件具有两个给定的blob哈希id。