教你顺滑升级6.x版本的NexT主题

how-to-update-hexo-theme-next

因为之前有很长一段时间没有更新,所以博客使用的 NexT 主题已经从 6.3.0 更新到了 6.4.1。
而作为一个新世纪的好青年,我们自然是要像早上八九点钟的太阳,时时刻刻对新鲜事物保持兴趣。
于是我便积极地想要将主题升级到最新版本,过程也很简单,话不多说,请看全文٩(๑❛ᴗ❛๑)۶

概述

这篇文章主要说的是从 hexo-theme-next 6.x 版本升级到最新版本(文章发布时为6.4.1)的过程。
如果你的 hexo-theme-next 版本处于 5.x 版本,请到这里查看官方文档→从 NexT v5.1.x 更新
官方文档中提到了使用 Hexo 数据文件特性 来解决更新时可能遇到的冲突错误,但是我在使用该方法时觉得不如使用 git 的某些功能来绕过这样的问题,直接解决更新时的冲突错误,平滑更新。
所以与其说这篇文章在教大家如何升级 hexo-theme-next 版本,倒不如说在教大家如何使用 git 的某些功能。
此处推荐大家安装 Visual Studio Code,这个工具能够非常方便地为大家提供代码冲突时的帮助。
本文中升级 hexo-theme-next 版本时所使用到的环境和工具如下:

* Windows 10 1803
* Visual Studio Code 1.27.2 (user setup)
* node-v8.11.2-x64
* git version 2.17.1.windows.2
* hexo-v3.7.1
* NexT.Muse v6.3.0
* 善于观察的眼睛一双

重要提示!!!
如果你对 Git 这个源代码管理工具不是很熟悉,或者对自己的操作心里没底:
请将整个博客的目录备份!!!
请将整个博客的目录备份!!!
请将整个博客的目录备份!!!
好的,让我们开始升级(  ´-ω ・)▄︻┻┳══━一

升级NexT版本

我们可以通过在博客根目录执行以下命令来升级到最新的 hexo-theme-next 版本:

$ cd themes/next
$ git pull

其中,第一条命令的功能是进入到 next 主题的目录中,因为我们是要升级这个主题的版本,接下来的操作都要在这个目录中完成。
而第二条命令在这里是从最初克隆这个主题的仓库获取最新的数据并 自动尝试合并到当前所在的分支
如果你在执行完这两条命令之后没有任何报错,那么恭喜你!!!你的更新已经成功了!!!
然而,除非你特意将配置文件分离(实质上使用了 Hexo 数据文件特性),否则一般情况下,你都会遇到类似这样的情况:

$ git pull
remote: Counting objects: 273, done.
remote: Compressing objects: 100% (43/43), done.
remote: Total 273 (delta 127), reused 134 (delta 111), pack-reused 117
Receiving objects: 100% (273/273), 86.19 KiB | 125.00 KiB/s, done.
Resolving deltas: 100% (167/167), completed with 67 local objects.
From https://github.com/theme-next/hexo-theme-next
ffde8fe..9ec34d3  master     -> origin/master
* [new tag]         v6.4.0     -> v6.4.0
* [new tag]         v6.4.1     -> v6.4.1
error: Your local changes to the following files would be overwritten by merge:
        _config.yml
Please commit your changes or stash them before you merge.
Aborting
Updating ffde8fe..9ec34d3

其中的报错的信息为:

error: Your local changes to the following files would be overwritten by merge:
        _config.yml
Please commit your changes or stash them before you merge.

这部分内容告诉我们,我们本地有一个文件 _config.yml 经过了修改,和远程仓库的内容不一样造成了冲突,如果强行合并,则本地文件会被覆盖。
并且提示我们,让我们在合并之前先将修改提交(commit)或者储藏(stash)。
如果你和我遇到了一样的情况,那么请继续阅读,这部分就是本文的重点,下一章节中,我将和大家分享我处理这个问题的详细流程,也即是我们升级的过程。

处理升级时的冲突

在这一章节中,我们将要解决升级 NexT 主题时出现的冲突问题,并且实质性地完成版本升级的过程。
我们需要多次使用 git 命令来进行一系列操作,并且需要打开冲突的文件进行目视处理。

将修改储藏到暂存区

我们可以通过 git stash 这句命令将对主题文件的修改储存到本地的暂存区:

$ git stash
Saved working directory and index state WIP on master: ffde8fe Reverted #254 pull.

通过执行该命令的输出我们可以知道我们已经将修改储存到了本地的暂存区,接下来我们需要执行更新,请继续看下一章节

执行更新

我们现在需要再次使用 git pull 命令来获取最新的主题文件,别担心,这次不会再有上面的错误了:

$ git pull
Updating ffde8fe..9ec34d3
Fast-forward
.github/CONTRIBUTING.md                            |  54 ++
README.md                                          |  56 +-
_config.yml                                        |  56 +-
...
source/js/src/scrollspy.js                         | 195 +++--
source/js/src/utils.js                             | 175 +++--
66 files changed, 1158 insertions(+), 1941 deletions(-)
delete mode 100644 layout/_partials/share/jiathis.swig
...
delete mode 100644 source/css/_common/components/third-party/jiathis.styl

再次执行 git pull 命令后我们可以看到类似以上的输出,这样我们的主题就已经更新完成了。
那么现在,我们需要将之前的配置恢复到新版本的主题当中,即从暂存区取出修改过的内容,请继续看下一章节

从暂存区取出修改

我们现在要通过执行 git stash pop 这句命令来从暂存区取出修改,我们可以得到类似以下的输出:

$ git stash pop
Auto-merging _config.yml
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

        modified:   _config.yml

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (3b73b30...4b77e8e)

其中,modified: _config.yml 这一行用红色标注了出来,说明这个文件在取出修改进行自动合并时被修改了。
如果你看到了以上的输出,那么你的更新到此就已经成功啦~
但如果你在执行 git stash pop 这句命令后,更加不幸地看到了输出是类似下方的内容:

$ git stash pop
Auto-merging _config.yml
CONFLICT (content): Merge conflict in _config.yml

那么说明自动合并无法为你自动解决这些冲突,需要你手动进行处理。
事到如今,我们距离成功已经是临门一脚,那么让我们趁热打铁,继续看下一章节

解决冲突

我们在主题文件夹下找到 _config.yml 这个文件,在其中我们可以非常容易地看到类似以下的不同:

<<<<<<< Updated upstream
enable: false # When enable is set to be true, leancloud_visitors is recommended to be closed for the re-initialization problem within different leancloud adk version.
appid:  # your leancloud application appid
appkey:  # your leancloud application appkey
notify: false # mail notifier , https://github.com/xCss/Valine/wiki
verify: false # Verification code
placeholder: Just go go # comment box placeholder
avatar: mm # gravatar style
guest_info: nick,mail,link # custom comment header
pageSize: 10 # pagination size
visitor: false # leancloud-counter-security is not supported for now. When visitor is set to be true, appid and appkey are recommended to be the same as leancloud_visitors' for counter compatibility. Article reading statistic https://valine.js.org/visitor.html
=======
enable: true
appid:  U7aB9evsRQXXqCqnPXG3cCjS-9Nh9j0Va # your leancloud application appid
appkey: 38D4FiUTxAYvTNaoAuF9Rm8G          # your leancloud application appkey
notify: true                              # mail notifier , https://github.com/xCss/Valine/wiki
verify: true                              # Verification code
placeholder: ヾノ≧∀≦)o来啊,快活啊!          # comment box placeholder
avatar: hide                                # gravatar style
guest_info: nick,mail,link                # custom comment header
pageSize: 10                              # pagination size
visitor: false                            # leancloud-counter-security is not supported for now. When visitor is set to be true, appid and appkey are recommended to be the same as leancloud_visitors' for counter compatibility. Article reading statistic https://valine.js.org/visitor.html
>>>>>>> Stashed changes

在以等号分隔的上方是这次 git pull 拉取到的内容,而下方就是我们对该文件修改后的内容,很显然,这两部分内容因为不一样的特别多,自动合并无法确定哪些可以覆盖,所以产生了冲突。
如果你使用了类似于 VS Code 这样的工具,一般你打开这个文件都会让你选择哪一部分进行保留,这也是推荐大家使用这样工具的原因。
当然了,不使用这种工具,你也可以直接目视内容,然后删除不需要的内容,保留原本修改过的内容即可,修改后变回了这样:

...
enable: true
appid:  U7aB9evsRQXXqCqnPXG3cCjS-9Nh9j0Va # your leancloud application appid
appkey: 38D4FiUTxAYvTNaoAuF9Rm8G          # your leancloud application appkey
notify: true                              # mail notifier , https://github.com/xCss/Valine/wiki
verify: true                              # Verification code
placeholder: ヾノ≧∀≦)o来啊,快活啊!          # comment box placeholder
avatar: hide                                # gravatar style
guest_info: nick,mail,link                # custom comment header
pageSize: 10                              # pagination size
visitor: false                            # leancloud-counter-security is not supported for now. When visitor is set to be true, appid and appkey are recommended to be the same as leancloud_visitors' for counter compatibility. Article reading statistic https://valine.js.org/visitor.html
...

然后我们再次在主题根目录执行 git pull 这句命令,可以看到类似这样的输出:

$ git pull
Already up to date.

恭喜恭喜!我们的升级终于成功完成!

总结

总体来说,使用这样的命令能够让大家不需要重新整理配置,并且可以在升级时审阅你使用到特性的更新部分,并手动选择需要更新的内容。
我觉得这样的更新方式更加能够让人清楚地知道自己到底更新了什么,做了什么。
甚至,在更新的过程当中,会发现很多新的功能,能够进行添加。
当然了,这篇文章中对 git 的使用只能算是皮毛而已,如果有什么不正确的,或者需要补充的,或者有什么疑问,请大家在下方的评论中给我指出呀~

PS. 这篇文章应该是 Hexo 系列的最后一篇文章了,我朋友问我为什么还不写站点 SEO 的文章。
因为我觉得大家可以搜索到很多类似的相关文章,我对 SEO 的了解不是很全面,写出来的文章相比于他们就像洗文一样,所以打算在经过详细了解和尝试之后在后续推出一篇相关的文章。
另外!!!!!!!
我的站点已经出现在hexo-theme-next的 Github 主页 README 中 Live Preview 列表中啦!!!
多多点击啦!✿✿ヽ(°▽°)ノ✿
写完了文章,今天也是棒棒哒~(。≧3≦)ノ⌒☆

坚持原创!欢迎各位客官给我打赏买小饼干吖!✿✿ヽ(°▽°)ノ✿
0%