【发布时间】:2016-08-22 19:07:46
【问题描述】:
博览会
这是我经常遇到的情况。我们团队在发布分支中做的第一件事是从版本中删除-SNAPSHOT 后缀。我们会根据需要进行最后一刻的更改,有时这包括进行大修复。我在下面制作了一个相同的 git log 来显示这一点。 (在问题的最后会显示更详细的日志,以帮助更好地解释。)
* ea88c23 (release/1.0.0) Fix an embarrasing bug
* 5fe35e1 Drop SNAPSHOT in prep for release
| * 34433c6 (HEAD -> master) Add important features
| * fe41d3b Bump version to 1.1.0-SNAPSHOT
|/
* 8dcfc4f Add greet feature
* 0337c4c Bump version to 1.0.0-SNAPSHOT
* 775277d Inital commit
基本上发生了什么
- 项目正在进行中
- 发布分支被切断
- 并行...
- 发布分支上的版本已更改
- 活动开发分支上的版本已更改
- 并行继续...
- 在发布分支上修复了一个错误
- 在活动开发分支上添加了一项功能
问题
现在,我如何将这些更改从发布分支 (release/1.0.0) 分支返回到活动开发分支 (master) 干净地? 我有下面有几个潜在的解决方案,没有一个是非常有利的。
天真的方法
git checkout master
git merge release/1.0.0
# Fix conflicts manually
请记住,此示例已简化为少量提交,并且版本仅位于单个文件中,但实际上可能存在许多更改和与版本有关的许多文件;因此,将release/1.0.0 合并到master 并修复由于版本更改引起的冲突的幼稚方法更加困难和烦人。
稍微不那么天真的方法
git checkout master
git merge release/1.0.0
git checkout --ours */pom.xml
如果 POM 文件中的所有更改都是版本,那很好,但这很危险,因为除了版本之外,pom 文件中可能还有其他更改。当然,为了安全起见,您可以在 git checkout --ours */pom.xml 之前执行 git diff,但这仍然很烦人。
樱桃采摘
我不完全了解如何挑选,但我了解它的作用。这种方法的一个优点是很容易忽略一个你总是不想要的提交,但缺点是你最终会得到很多额外的提交,这不一定是坏的,但看起来很糟糕。
也许这是最好的方法,我只是紧张而已。似乎有时您会发现单个提交的问题(无论出于何种原因)并追查它影响事物的位置,但如果它是精心挑选的(或从樱桃挑选的),那么您可能会错过一些景点。
更完整的日志
* ea88c23 (release/1.0.0) Fix an embarrasing bug
| diff --git a/file b/file
| index e98206a..8ab686e 100644
| --- a/file
| +++ b/file
| @@ -1 +1 @@
| -Hell, World!
| +Hello, World!
* 5fe35e1 Drop SNAPSHOT in prep for release
| diff --git a/pom.xml b/pom.xml
| index f755149..3eefcb9 100644
| --- a/pom.xml
| +++ b/pom.xml
| @@ -1 +1 @@
| -1.0.0-SNAPSHOT
| +1.0.0
| * 34433c6 (HEAD -> master) Add important features
| | diff --git a/file2 b/file2
| | new file mode 100644
| | index 0000000..e6afbe7
| | --- /dev/null
| | +++ b/file2
| | @@ -0,0 +1 @@
| | +Import features
| * fe41d3b Bump version to 1.1.0-SNAPSHOT
|/
| diff --git a/pom.xml b/pom.xml
| index f755149..5902d52 100644
| --- a/pom.xml
| +++ b/pom.xml
| @@ -1 +1 @@
| -1.0.0-SNAPSHOT
| +1.1.0-SNAPSHOT
* 8dcfc4f Add greet feature
| diff --git a/file b/file
| new file mode 100644
| index 0000000..e98206a
| --- /dev/null
| +++ b/file
| @@ -0,0 +1 @@
| +Hell, World!
* 0337c4c Bump version to 1.0.0-SNAPSHOT
| diff --git a/pom.xml b/pom.xml
| new file mode 100644
| index 0000000..f755149
| --- /dev/null
| +++ b/pom.xml
| @@ -0,0 +1 @@
| +1.0.0-SNAPSHOT
* 775277d Inital commit
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..176a458
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e69de29
【问题讨论】:
-
您可以完全避免这个问题,方法是从 Git 标签自动派生版本,而不是硬编码(因此必须提交)。
-
@OliverCharlesworth 不是每个提交都被标记,也许我误解了你的意思。
-
您将分支上的第一个提交标记为“1.1.0-rc”,然后将最终提交标记为“1.1.0”。然后,您从
git describe派生版本,这通常由插件处理(至少在 Gradle 中,不确定 Maven 生态系统中提供了什么)。 -
@OliverCharlesworth 这是什么 gradle 插件?这可能值得研究。
标签: git maven version-control