Git - 如何保留标记中的更改,但恢复标记的分支中的更改?

Git - how to keep a change in a tag, but revert the change in the branch that was tagged?

我有一个执行以下步骤的 Jenkins 作业。

  1. 结帐发布分支
  2. 修改分支上的几个文件
  3. 在本地提交修改后的文件,但不推送
  4. 标记分支
  5. 检查标签
  6. 建造

正如您从步骤 3 中看到的那样,修改后的文件不应该被推送回 master,它们应该只存在于用于构建的标签上。

由于Git 标签只是指向提交的指针,我必须在标记之前提交修改后的文件,但我不希望修改后的文件被推回原处。

修改后的文件应该只存在于构建的标签中。 我想我的问题确实是

should I be cutting a build branch from the release branch, modifying the files, committing, tagging the branch, pushing the tag, and throwing away the build branch?

或者,

follow the existing process and revert the commit that modified the files on my local branch of the release branch, and push that?

两者都不应该做。

如果提交不是分支的一部分,则不应将其作为分支的一部分。

在分支上提交,然后撤消它,这是不必要的复杂。它有效,并给出正确的结果,但如果你能从一开始就做正确的事,就不要先做错事再改正。

相反,不要签出该分支。检查分支指向的提交。如果你想用分支名结账,一个简单的方法是git checkout branch~0。这给你留下了一个分离的 HEAD,没有附加到任何分支。然后您可以修改文件、创建提交、标记并推送标记。

你那里的过程肯定很奇怪。我知道您可能必须执行一些需要 运行 的预构建步骤才能成功构建所有内容,但这些更改必须作为标签提交和推送似乎很奇怪。如果您有这种需求,则表明预构建过程进行了一些实质性更改(您需要跟踪),因此也许您应该花一些时间来改进您的构建过程,这样您就不再需要它了。

话虽这么说,但实际上要还原与构建相关的提交,因此影响正常的历史记录似乎有点混乱。构建过程尽管很奇怪,但永远不应该影响正常的开发流程,并且在历史记录中添加提交(一个修补某些东西,一个恢复相同的东西)听起来确实不是一个好主意。特别是因为理论上你可以 运行 进入构建服务器将这些提交和 运行 推入冲突的情况 - 你不希望那样。

所以我会坚持保持分支原样,并临时添加预构建提交并给它一个标签。正如您所说的那样,标签只是指向提交的指针,分支实际上是相同的,当您已经有指向提交的标签时,没有必要影响分支。

基本上,构建过程需要做的是:

# update remote and reset to the current release
git fetch origin
git reset --hard origin/release

# pre-build patching

# add and commit
git commit -a -m 'Build 1234 from 2015-05-28'

# create tag
git tag -a build-1234 -m 'Build 1234 from 2015-05-28'

# push the tag (only!)
git push origin build-1234

# build and ship

请注意,我从不谈论那里的分支机构;你只是忽略了你在一个。当您更新它时(作为 git commit 的一部分),您永远不会告诉任何人,只会直接推送标签。在下一次构建中(假设您没有在每次构建时完全丢弃环境),您将从 git reset --hard 中获得最新的更改,丢弃您的临时提交(该标记仍指向它).

假设您还没有推送分支,您可以使用 git rebase -i 有选择地删除您不再需要的提交。只要标记存在,标记引用的提交就会存在。

如果你已经推送了分支,那么就git revert。还原提交实际上会添加新的提交,您的旧提交将保持不变。