在我们的项目中,我们有 3 个分支,master
、release
和 production
。其中 master
是我们的开发分支。这个想法是 release
分支不是持久的。 IE。它将被创建用于发布并在发布合并到 production
分支后删除。
在冲刺结束时,我们基于 release
创建一个新的 master
分支,并让团队 PR 审核此 release
分支以供批准。
然而,在批准过程中,一些在 master
上(现在也在 release
分支上)的提交实际上不应该合并到 production
分支。
例如在 master
上进行了以下提交:
commit-1
commit-2
commit-3
创建 release
分支后,我们在 release
分支上有相同的提交,但可能 commit-2
不应该发布。
commit-1
commit-2 <- remove for the 'release` branch
commit-3
如何安全地从 commit-2
分支中删除 release
,但仍保留在 master
分支上以便在未来版本中合并?
答案 0 :(得分:1)
这就是 git revert
的用途。只需直接在 commit-2
上恢复 release
,以否定它。实际上,您创建了一个新提交,其唯一目的是撤销现有提交的影响。
否定提交仅出现在 release
上,因此它仅影响 release
。这在历史上也很好;你实际上是在用你的历史描述形成这个版本的程序。
小例子。我首先创建您的三个提交(在 master 上):
$ echo a > a.txt
$ git add .; git commit -ma
$ echo b > b.txt
$ git add .; git commit -mb
$ echo c > c.txt
$ git add .; git commit -mc
现在我创建发布分支。意识到提交 b
不应成为此版本的一部分,我通过还原它来抑制它:
$ git branch release
$ git switch release
$ git revert 883ae
Removing b.txt
情况如下:
$ git log --oneline --graph --all
* 022f96f (HEAD -> release) Revert "b"
* 6a6acfe (master) c
* 883ae8f b
* a186a8a a
好的。在发布时,我们的文件看起来如何:
$ ls
a.txt c.txt
如您所见,创建 883ae8f
的 b.txt
的效果已从发布分支中删除。但与此同时,master 不受影响:
$ git switch master
Switched to branch 'master'
$ ls
a.txt b.txt c.txt