【问题标题】:Ignoring version changes during merges在合并期间忽略版本更改
【发布时间】: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

基本上发生了什么

  1. 项目正在进行中
  2. 发布分支被切断
  3. 并行...
    • 发布分支上的版本已更改
    • 活动开发分支上的版本已更改
  4. 并行继续...
    • 在发布分支上修复了一个错误
    • 在活动开发分支上添加了一项功能

问题

现在,我如何将这些更改从发布分支 (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


【解决方案1】:

似乎这种情况经常发生,我在写问题时找到了解决方案。

从日志来看,sn-p 5fe35e1 是我们想要在master 中的提交,它会导致我们出现问题。

* 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

让我们摆脱它!

git checkout release/1.0.0
git checkout -b port-to-1.1.0
git revert 5fe35e1
# Now port-to-1.1.0 has all the changes we want and none of the ones we don't
git checkout master
git merge port-to-1.1.0

你可能仍然有冲突,但你不会因为碰撞版本而有任何冲突。这种方法可以用来“摆脱”任何你不想要的提交。您的日志现在将如下所示。请记住,还原不会删除提交本身,它只是撤消单个提交引入的所有更改。您可以在下面看到5fe35e1 仍然存在。

*   6683b44 (HEAD -> master) Merge branch 'port-to-1.1.0'
|\
| * 81e9bf5 (port-to-1.1.0) Revert "Drop SNAPSHOT in prep for release"
| * ea88c23 (release/1.0.0) Fix an embarrasing bug
| * 5fe35e1 Drop SNAPSHOT in prep for release
* | 34433c6 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

【讨论】:

    猜你喜欢
    • 2013-12-01
    • 2013-02-20
    • 2022-10-05
    • 2016-01-12
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多