缘起
本人主题使用 hexo-theme-butterfly: 🦋 A Hexo Theme: Butterfly ,但是在此基础上又做了一些自定义。用过一段时间之后,作者的源仓库可能更新了很多没有的功能。之前的时候,每次都是手动 compare 并合并的,但是实践了两次之后,发现存在以下问题:
- 每次升级十分耗时
- 自己定义的功能在合并时可能丢失或遗漏
鉴于此,本文尝试使用一种较为智能的方式解决以上问题。
TL,DR
要想将源仓库(origin repo)合入(dest repo)中,那么可以将(origin repo)伪造成(dest repo)仓库的一个分支,然后合并到(dest repo)仓库中的指定分支(本文为 dev)。
工作流程
- 本地新建目录butterfly
- 克隆目标仓库git clone https://github.com/imoyao/hexo-theme-butterfly.git imoyao 
- 克隆源仓库git clone https://github.com/jerryc127/hexo-theme-butterfly.git 
- 将源目录(jerryc)作为远程仓库添加到目标仓库(imoyao),并命名为jerrycgit remote add jerryc ../jerryc 
- 从源仓库下载数据到本仓库$ git fetch jerryc remote: Enumerating objects: 139, done. 
 remote: Counting objects: 100% (137/137), done.
 remote: Compressing objects: 100% (28/28), done.
 remote: Total 58 (delta 45), reused 43 (delta 30)
 Unpacking objects: 100% (58/58), done.
 From ../jerryc
 * [new branch] dev -> jerryc/devgit fetch 
 Git - git-fetch Documentationgit-fetch - Download objects and refs from another repository 
 git fetch 是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。而 git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。 
- 查看此时仓库信息 - $ git log 
 commit 88b1cc553ce3c2b5e53dccb2ff259ddb078c333b (HEAD -> dev, origin/dev, origin/HEAD)
 Author: Jerry <***@gmail.com>
 commit 88b1cc553ce3c2b5e53dccb2ff259ddb078c333b (HEAD -> dev, origin/dev, origin
 /HEAD)
 Author: Jerry <***@gmail.com>
 Date: Sat Nov 21 00:27:01 2020 +0800
 # 省略内容
 commit 88b1cc553ce3c2b5e53dccb2ff259ddb078c333b (HEAD -> dev, origin/dev, origin
 /HEAD)
 Author: Jerry <***@gmail.com>
 Date: Sat Nov 21 00:27:01 2020 +0800
 # 省略内容
 commit 7f03c3f71696fde1f1d3f1e969844ecde3d7f805
 Author: Jerry <***@gmail.com>
 Date: Tue Nov 3 22:20:16 2020 +0800
 # 省略内容
 ```plain
 7. 将源仓库下载下来的 dev 分支作为新分支 checkout 到目标分支`updatedev`
 ```bash
 git checkout -b updatedev jerryc/dev- Switched to a new branch 'updatedev' 
 Branch 'updatedev' set up to track remote branch 'dev' from 'jerryc'.- 此时分支状态 - $ git branch - dev # 我的开发分支 
 master # 我的主分支
 * updatedev # 作者和我的fetch之后的分支
- 切换到我的 - dev分支- git checkout dev - 此时分支状态 - $ git branch - * dev 
 master
 updatedev
- 合并 - fetch的分支代码到我的- dev分支- $ git merge updatedev - Updating 88b1cc5..dc1c7c5 
 Fast-forward
 _config.yml | 6 +-
 languages/default.yml | 6 +-
 languages/en.yml | 2 +
 languages/zh-CN.yml | 4 +-
 # 中间省略
 source/css/_mode/readmode.styl | 19 +++--
 source/js/main.js | 91 ++++++++++++++++------
 source/js/utils.js | 13 +++-
 31 files changed, 374 insertions(+), 169 deletions(-)
 create mode 100644 layout/includes/third-party/newest-comments/twikoo-comment.pug- 补充:如果遇到如下报错: - fatal: refusing to merge unrelated histories 
 那么可以- git merge时加上- --allow-unrelated-histories后缀:- git merge repo1 --allow-unrelated-histories 
- 查看合并后代码 - $ git log 
 commit dc1c7c5efdbb92de10a44cec2e15d16b84823ce7 (HEAD -> dev, jerryc/dev, updatedev)
 Merge: 02af307 97fe932
 Author: Jerry Wong <***@gmail.com>
 Date: Mon Dec 7 21:17:09 2020 +0800
 # 省略内容
 commit 97fe932ad9c22fa4b5690d38b33242eed11742f0
 Author: 零度冷咖啡 <***@outlook.com>
 Date: Mon Dec 7 08:25:02 2020 +0800
 # 省略内容
 commit 01e7929c02a5fd018ab3171a381487a78f2df05c
 Merge: 7c3945f 02af307
 Author: 零度冷咖啡 <***@outlook.com>
 Date: Mon Dec 7 08:22:17 2020 +0800
 # 省略内容
 commit 02af3077e71d02071ad3c7e8b159149310597513
 Author: Jerry <***@gmail.com>
 Date: Sat Dec 5 22:28:54 2020 +0800
 # 省略内容
 commit 88b1cc553ce3c2b5e53dccb2ff259ddb078c333b (origin/dev, origin/HEAD)
 Author: Jerry <***@gmail.com>
 Date: Sat Nov 21 00:27:01 2020 +0800
 # 省略内容- 横向拼图参考 此处 
- 删除无用的 - fetch分支- updatedev- $ git branch -D updatedev - Deleted branch updatedev (was dc1c7c5). 
- 提交到远程仓库同样的道理,我们可以把Administrator@PC201803221826 MINGW64 /h/mycode/butterfly/imoyao (dev) 
 $ git add .
 Administrator@PC201803221826 MINGW64 /h/mycode/butterfly/imoyao (dev)
 $ git commit -m 'updatedev'
 On branch dev
 Your branch is ahead of 'origin/dev' by 4 commits.
 (use "git push" to publish your local commits)
 nothing to commit, working tree clean
 Administrator@PC201803221826 MINGW64 /h/mycode/butterfly/imoyao (dev)
 $ git push
 Total 0 (delta 0), reused 0 (delta 0)
 To https://github.com.cnpmjs.org/imoyao/hexo-theme-butterfly.git
 88b1cc5..dc1c7c5 dev -> devmaster分支与原作者保持同步。这个留给读者去实践练习。
更上一层楼
把我自己修改的合并到我的仓库中。
- 拷贝目录到同级目录
- 初始化为仓库(否则无法执行 git 合并)$ git init Initialized empty Git repository in H:/mycode/butterfly/masantu/.git/ 
- 在 masantu 仓库中 add 并 commit 代码作为一次提交git add . 
 git commit -m 'init mycode to repo'
- 添加远程仓库masantu并命名为masantu
 关于这条命令的解释Git - git-remote Documentationgit remote add [shortname] [url] 
 Add a remote namedfor the repository at . The command git fetch can then be used to create and update remote-tracking branches / . $ git remote add masantu ../masantu 
- 将masantu仓库的代码拉到imoyao仓库中$ git fetch masantu 
 warning: no common commits
 remote: Enumerating objects: 261, done.
 remote: Counting objects: 100% (261/261), done.
 remote: Compressing objects: 100% (259/259), done.
 remote: Total 261 (delta 18), reused 0 (delta 0)
 Receiving objects: 100% (261/261), 259.62 KiB | 1.08 MiB/s, done.
 Resolving deltas: 100% (18/18), done.
 From ../masantu
 * [new branch] master -> masantu/master
- 以 - masantu/master作为基准新建分支- upmst(updatemasantu 的简写)- $ git checkout -b upmst masantu/master 
 Switched to a new branch 'upmst'
 Branch 'upmst' set up to track remote branch 'master' from 'masantu'.- 此时分支状态 - $ git branch - dev 
 * upmst
 master
- 切换分支到 - dev- $ git checkout dev 
 Switched to branch 'dev'
 Your branch is up to date with 'origin/dev'.- $ git branch - * dev 
 upmst
 master
- 合并masantu分支到devgit merge upmst --allow-unrelated-histories CONFLICT (add/add): Merge conflict in source/js/utils.js 
 Auto-merging source/js/utils.js
 # 省略内容
 Auto-merging source/css/_global/function.styl
 CONFLICT (add/add): Merge conflict in package.json
- 手动解决冲突
- 测试(如果必要)并提交合并的代码
- 删除刚才的分支和添加的远程源git branch -D upmst 
 git remote remove masantu参考链接









