在git中删除合并的分支安全吗
假设我们在分支中开发了一个特性,认为它是完整的,将它合并为主功能并删除分支。后来在这个特定的特性中发现了bug,有人去重置全局存储库上的头部(您不应该这样做)。现在,我们可以修复这个bug,但是不再有分支,整个功能都丢失了。是否有方法恢复这些更改,合并后保留功能分支一段时间是否总体上是个好主意?您可以使用reflog恢复所有提交。请参阅下面的链接 链接摘录:在git中删除合并的分支安全吗,git,github,merge,Git,Github,Merge,假设我们在分支中开发了一个特性,认为它是完整的,将它合并为主功能并删除分支。后来在这个特定的特性中发现了bug,有人去重置全局存储库上的头部(您不应该这样做)。现在,我们可以修复这个bug,但是不再有分支,整个功能都丢失了。是否有方法恢复这些更改,合并后保留功能分支一段时间是否总体上是个好主意?您可以使用reflog恢复所有提交。请参阅下面的链接 链接摘录: 例如,考虑下面的回购: $ git show-ref -h HEAD 7c61179cbe51c050c5520b4399f7b14
例如,考虑下面的回购:
$ git show-ref -h HEAD
7c61179cbe51c050c5520b4399f7b14eec943754 HEAD
$ git reset --hard HEAD^
HEAD is now at 39ba87b Fixing about and submit pages so they don't look stupid
$ git show-ref -h HEAD
39ba87bf28b5bb223feffafb59638f6f46908cac HEAD
现在头部向后移动1个提交。让我们看看git是否知道已删除的提交
$ git reflog
39ba87b... HEAD@{0}: HEAD~1: updating HEAD
7c61179... HEAD@{1}: pull origin master: Fast forward
[... lots of other refs ...]
现在我们有了我们的SHA1:7c61179。如果我们想立即将其应用回当前分支,则执行git合并将恢复提交:
$ git merge 7c61179
Updating 39ba87b..7c61179
Fast forward
css/screen.css | 4 ++++
submit.html | 4 ++--
2 files changed, 6 insertions(+), 2 deletions(-)
此命令将恢复丢失的更改,并确保头部指向提交。从这里你可以继续正常工作 是的,通常最好将功能分支保留一段时间,至少在您100%确定永远不会返回之前 它不会伤害任何东西,也不会占用任何资源。分支只是指向提交的小便签。它在
git
中的唯一作用是防止垃圾收集器无法恢复地删除它指向的提交(及其祖先)
对于您当前的场景,我只需创建一个分支(或标记),指向有错误版本的master
,然后将master重置回合并点后面。然后您就全部设置好了-git
不会自动删除您原本“丢失”的分支,您可以在准备好后返回
当然,如果您想从它生成一个“真正的”分支,您需要在合并之前在分支端找到提交,然后执行git branch mybranch
,这可能是最佳选择。示例
使用释放分支。比如说,当您在项目开发中达到一个重要的里程碑时(完成并合并了一个新特性),您就可以进入生产环境
创建一个标记
git tag -a v1.0.0 -m "v1.0.0"
现在,假设您继续工作并开始使用一个新功能,过了一段时间后,您意识到有一个bug与您以前合并的功能一起引入。合并并删除后如何返回到它
让我们回到合并新功能时创建的标记
git checkout v1.0.0
我们不能直接提交到标签,但我们可以从中创建一个新的分支(发布分支)
现在我们可以应用热修复,然后将更改添加并提交到分支
git add <file> <file>
git commit -m "<hot fix message>"
为了保持整洁,我们还将在此时删除发布分支
git branch -d rb1.0.0
假设在合并之前,提交历史是这样的。 将
功能
合并到主功能
后,它变成了这样。
现在分支功能
已被删除,情况如下。
正如我们所看到的,尽管ref功能
已经消失,但是功能
的提交历史仍然存在。branch ref只是一个变量,它存储从那时到现在指向的提交的sha1散列
M
是在将功能
合并到主
时创建的合并提交(仅当它是真正的合并,非快进合并时)。它有两个父级,D
第一个父级,它指向master
,而F
第二个父级,它指向feature
。如果我们将master
合并到feature
并创建M
,那么F
是第一个父级,而D
是第二个父级
第一个父项可以通过M^
引用,第二个父项可以通过M^2
引用
现在,如果要重新创建分支ref功能
,假设M
的值为af234342
,则可以运行git分支功能af234342^2
。而且还会是这样。
合并一段时间后保留要素分支总体上是个好主意吗
视情况而定。有些人认为保留所有曾经存在的更改是很好的,包括所有提交和所有分支、标记等。毕竟,这些都是项目的宝贵遗产。它不会伤害任何东西或占用任何资源,它占用认知资源,当你注意到你的回购有79个分支时,你会有一种古老的“WTF”感觉,有些可以追溯到六个月前。为什么回购协议中的分支机构数量会占用认知资源?“通常切断分支机构只会释放出一个非常小的、不可预测的空间。”这是在,我同意@Anoe的说法,它不会伤害任何东西或占用任何资源。没有人有一个克隆仍然包含合并提交?更新了答案。谢谢你的指导。
git checkout master
git merge rb1.0.0 -m "Merged <hot fix message>"
git branch -d rb1.0.0