我最近从Bitbucket克隆了我的应用程序,并签出到了一个新的upgrading
分支,在那里我将应用程序从rails 5.0.0.1升级到了rails 5.1.6:
$ git checkout -b upgrading
我首先更新了我的Gemfile,我进行了捆绑包更新:
$ bundle update
从railsdiff网站和为此目的创建的新Rails 5.1.6应用程序中,我编辑了旧应用程序,添加或删除了代码,并删除或创建了文件,并编辑了迁移文件,指定了版本要继承的类。然后我在运行rails app:update
之前使用git提交了我的应用程序:
$ git add -A
$ git commit -m 'before rails app update'
$ rails app:update
需要进行的更改很少,然后我重置数据库并运行了整个测试套件:
$ rails db:migrate:reset
$ rails test
我为数据库设置了种子,启动了服务器并以图形方式测试了应用程序。一切都很好。最后,我提交了一个内容,切换到master分支,壁球合并了升级分支,最后做出了最后一个提交:
$ git add -A
$ git commit -m "work in progress"
$ git checkout master
$ git merge --squash upgrading
$ git commit -m "upgrade to Rails 5.1.6"
$ git push
一切都很好,除非我尝试删除upgrading
分支,因为操作失败:
$ git branch -d upgrading
error: The branch 'upgrading' is not fully merged.
If you are sure you want to delete it, run 'git branch -D upgrading'.
我只知道几个git基本命令,所以我不知道为什么会这样。我将不胜感激。
答案 0 :(得分:1)
如果可以的话,不必太担心。
git branch -d
是“害羞”的删除模式,对于任何可能丢失的东西都非常谨慎。使用您描述的操作,由于分支的所有提交现在都在您的master
上(即使已被压缩),也不会丢失任何工作。
话虽这么说,分支并不是一个很大的负担,保持分支“以防万一”以备后用(因为您压缩了提交并且以后可能想检查各个步骤以解决错误)的代价是磁盘空间可能很低。
您还可以在分支的顶端放置标签*,删除分支**,然后您将获得这些未压缩的提交以进行进一步检查(这再次表明了磁盘空间成本,但是也许更清晰)如果您希望分支机构列表中没有任何已完成的工作)。
*和git tag before-the-squash upgrading
**和git branch -D upgrading
答案 1 :(得分:1)
Git试图保护您避免丢失您所做的一切... Git检测到您没有合并在此分支上所做的工作(升级)
但是,正如您所说,您要删除,因为该过程失败了。因此,这意味着您确定要删除它,并删除在那里所做的所有操作。
为此,git还说了如何做。只需运行:
git branch -D升级
答案 2 :(得分:1)
问题是您将upgrading
分支与--squash
合并为master分支。压缩upgrading
分支上的提交会为您留下一个新的sha
来进行提交。由于有了这个新的sha
,git无法检测到该分支已与master合并,并且认为不是。您可以可以将您的upgrading
分支重新设置为全部为1个提交,然后将其合并为母版,而无需压榨。
这将导致单个提交被合并到master主机中,除非git会意识到以下事实:该分支确实已合并,因为分支的sha
实际上在master的历史中,并且不会您尝试删除upgrading
分支时遇到的问题。
如果您100%确定master确实从upgrading
分支进行了更改,则只需使用git branch -D upgrading
告诉git,您确实确定要删除该分支。
如果您希望在合并之前使upgrading
分支与master同步,并且在此过程中将提交压缩为1,则可以执行以下操作:
git rebase -i master
然后您可以选择要提交的内容。您可以挤压,拾取,修复等。这将为您提供一个整洁的upgrading
分支,可以毫无问题地合并到master中。