合并期间忽略版本更改

时间:2016-08-22 19:07:47

标签: git maven version-control

博览会

这是我经常遇到的情况。我们团队在发布分支中所做的第一件事就是从版本中删除-SNAPSHOT后缀。我们根据需要进行最后一分钟的更改,有时这包括制作大修正。我在下面做了一个相同的git日志,显示了这一点。 (在问题的最后,会显示更详细的日志,这有助于更好地解释。)

* 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. 并行继续......
    • 发布分支上修复了一个错误
    • 在活动开发分支上添加了一项功能
  5. 问题

    现在,我如何将这些更改从发布分支(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 diff之前git checkout --ours */pom.xml安全,但这仍然很烦人。

    摘樱桃

    我不完全明白如何挑选,但我明白它的作用。这种方法的专家将是很容易忽略你总是不想要的一个提交,但是一个骗局是你最终会有很多额外的提交,这不一定是坏的但似乎很糟糕。

    也许这是最好的方法,我只是紧张不安。看起来有时你会发现一次提交问题(无论出于何种原因)并追捕它影响事物的地方,但如果它被挑选出来(或从樱桃采摘中)那么你可能会错过一些地方。

    富勒日志

    * 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
    

1 个答案:

答案 0 :(得分:0)

这似乎发生了很多,我在撰写问题时找到了解决方案。

从日志片段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