您应该如何为源代码管理中的旧标签创建补丁?
How should you create a patch for an older tag in source control?
假设我大约一年前发布了我的软件版本,并在 Git 中将其标记为 2.3。
所以我一直在添加功能和修复错误,在您知道之前,该软件现在已经是 3.0 版了。但是现在我的软件 2.3 版有一个错误,需要修复的人还没有准备好升级到 3.0 版。
就 Git 而言,在不更改 Git 存储库历史记录的情况下管理将补丁应用到 2.3 和创建软件版本 2.3.1 的最佳方法是什么。
例如,我无法签出 2.3 版,应用补丁,然后将其标记为 2.3.1 并向上推送,因为那样会创建一个新的头部。
开发人员通常如何管理对旧版本软件的支持?
编辑
好的,所以我听从了@AnoE 的建议,现在我的工作流程如下,用于修补以前的版本。欢迎指教。
git checkout v2.3.0
// Make code changes
git add -A
git commit -m "Fixed a bug in old app"
// Do something to verify the changes work on a different environment
git checkout -b v2_3_1
git tag -a v2.3.1 -m "Fixed small bug."
git push origin v2_3_1
git push --tags
我必须创建 b运行ch 的原因是标签不会显示在我们的存储库托管解决方案 Kiln 上。我不知道 Bitbucket 或 Github 等其他提供商是否会显示没有关联 b运行ch 的标签,或者这是否只是 Git 存储方式的副作用。该标签在我 运行 git tag -l
时在本地显示,但在网络上不可见 UI。在我推高 b运行ch 和标签后,我刚刚删除了 b运行ch,它在 Web UI.
上正确显示了
git push --delete v2_3_1
如果有人能解释为什么会发生这样的事情,我们将不胜感激。
签出 2.3 版,应用补丁,将其标记为 2.3.1 正是您要做的。
创建一个新的头(而不是一个新的分支)不是问题,这就是 git 的目的。请注意 "HEAD" 在 git 中没有结构意义,它之所以脱颖而出,是因为它是您当前工作目录中处于活动状态的一个提交。 Git 仅在结构上关心提交,并且您可以根据需要拥有任意数量的 "top-level" 提交。
所以:
git checkout 2.3 # gives you a "detached HEAD"
git checkout -b dev_2.3 # a new branch, more for convenience
...modify files...
git add ... ; git commit ...
git tag 2.3.1
git branch -D dev_2.3 # get rid of it if you have a feeling that you won't be comming back soon
请记住,分支和标签在 git 中都没有什么特别之处。它们只是指向提交的便利贴。以这种方式制作一个(可能是临时的)分支只是更方便一点,因为如果您正在做的向后移植涉及不止一次快速提交,您可以轻松切换 to/from 它。
在 Git 中有两种处理发布的方式:标签和分支。
标签的一个论点是它们是不可变的(你只能 delete/recreate 它们,而分支可以不断增长),但是,我倾向于使用分支而不是标签 原因如下:
- 如果您必须根据标签修补版本,那么您最终会得到 一些版本是标签,一些版本是分支。这可能会造成混淆,尤其是当您必须第二次打补丁时。这一次,您将检查第一个补丁分支,因此如果您必须为不熟悉 Git 的人制作补丁程序,这可能会很棘手。
- 通常,git(Gitlab、BitBucket 等)的工具有一个页面列出分支并比较提交 ahead/behind,使用分支作为参考。虽然可以对标签做同样的事情,但它不像分支那样容易,因为您必须手动 select 每个标签。当您想确保在旧版本上完成的补丁在最新版本中存在时,这特别有用
- 修补不会(需要)创建新分支。通常,补丁不会导致向后兼容性问题,因此您也可以只向分支 release_2.3 添加提交(并将 pom 从 2.3.0 更新到 2.3.1)而不是创建只为补丁创建一个新分支,无论如何使父分支无用(除非某些客户不想要补丁!)
有人可能会争辩说标签允许避免创建分支和 "pollute" 带有不再使用的发布分支的存储库,但这是一个小缺点,考虑到 "pollution" 将来自众所周知,补丁可以和发布一样多:)
编辑:您完全可以避免使用分支并使用 100% 标签,但是,如果您必须修补旧版本,您将不得不变基并重写历史记录,这是我不推荐的做法
假设我大约一年前发布了我的软件版本,并在 Git 中将其标记为 2.3。
所以我一直在添加功能和修复错误,在您知道之前,该软件现在已经是 3.0 版了。但是现在我的软件 2.3 版有一个错误,需要修复的人还没有准备好升级到 3.0 版。
就 Git 而言,在不更改 Git 存储库历史记录的情况下管理将补丁应用到 2.3 和创建软件版本 2.3.1 的最佳方法是什么。
例如,我无法签出 2.3 版,应用补丁,然后将其标记为 2.3.1 并向上推送,因为那样会创建一个新的头部。
开发人员通常如何管理对旧版本软件的支持?
编辑
好的,所以我听从了@AnoE 的建议,现在我的工作流程如下,用于修补以前的版本。欢迎指教。
git checkout v2.3.0
// Make code changes
git add -A
git commit -m "Fixed a bug in old app"
// Do something to verify the changes work on a different environment
git checkout -b v2_3_1
git tag -a v2.3.1 -m "Fixed small bug."
git push origin v2_3_1
git push --tags
我必须创建 b运行ch 的原因是标签不会显示在我们的存储库托管解决方案 Kiln 上。我不知道 Bitbucket 或 Github 等其他提供商是否会显示没有关联 b运行ch 的标签,或者这是否只是 Git 存储方式的副作用。该标签在我 运行 git tag -l
时在本地显示,但在网络上不可见 UI。在我推高 b运行ch 和标签后,我刚刚删除了 b运行ch,它在 Web UI.
git push --delete v2_3_1
如果有人能解释为什么会发生这样的事情,我们将不胜感激。
签出 2.3 版,应用补丁,将其标记为 2.3.1 正是您要做的。
创建一个新的头(而不是一个新的分支)不是问题,这就是 git 的目的。请注意 "HEAD" 在 git 中没有结构意义,它之所以脱颖而出,是因为它是您当前工作目录中处于活动状态的一个提交。 Git 仅在结构上关心提交,并且您可以根据需要拥有任意数量的 "top-level" 提交。
所以:
git checkout 2.3 # gives you a "detached HEAD"
git checkout -b dev_2.3 # a new branch, more for convenience
...modify files...
git add ... ; git commit ...
git tag 2.3.1
git branch -D dev_2.3 # get rid of it if you have a feeling that you won't be comming back soon
请记住,分支和标签在 git 中都没有什么特别之处。它们只是指向提交的便利贴。以这种方式制作一个(可能是临时的)分支只是更方便一点,因为如果您正在做的向后移植涉及不止一次快速提交,您可以轻松切换 to/from 它。
在 Git 中有两种处理发布的方式:标签和分支。
标签的一个论点是它们是不可变的(你只能 delete/recreate 它们,而分支可以不断增长),但是,我倾向于使用分支而不是标签 原因如下:
- 如果您必须根据标签修补版本,那么您最终会得到 一些版本是标签,一些版本是分支。这可能会造成混淆,尤其是当您必须第二次打补丁时。这一次,您将检查第一个补丁分支,因此如果您必须为不熟悉 Git 的人制作补丁程序,这可能会很棘手。
- 通常,git(Gitlab、BitBucket 等)的工具有一个页面列出分支并比较提交 ahead/behind,使用分支作为参考。虽然可以对标签做同样的事情,但它不像分支那样容易,因为您必须手动 select 每个标签。当您想确保在旧版本上完成的补丁在最新版本中存在时,这特别有用
- 修补不会(需要)创建新分支。通常,补丁不会导致向后兼容性问题,因此您也可以只向分支 release_2.3 添加提交(并将 pom 从 2.3.0 更新到 2.3.1)而不是创建只为补丁创建一个新分支,无论如何使父分支无用(除非某些客户不想要补丁!)
有人可能会争辩说标签允许避免创建分支和 "pollute" 带有不再使用的发布分支的存储库,但这是一个小缺点,考虑到 "pollution" 将来自众所周知,补丁可以和发布一样多:)
编辑:您完全可以避免使用分支并使用 100% 标签,但是,如果您必须修补旧版本,您将不得不变基并重写历史记录,这是我不推荐的做法