假如 Fork 来的仓库中文件的内容发生了变更,此时想要同步复刻上游仓库就无法通过 Fetch upstream(提取上游)下拉菜单一键实现了。具体情况表现为下拉菜单中只存在 Open pull request 选项而没有 Fetch and merge(提取并合并)。

要解决这个问题,需要用到 Git,它是一个免费开源的分布式版本控制器。

找到对应系统版本的安装包来安装 Git,安装完成后能找到三个相关工具,分别是 Git CMD、Git GUI 和 Git Bash,这里只需要用到 Git Bash


首次使用 Git Bash 需要先设置一个用户,这样远程仓库就能知道是谁对仓库做了修改。

git config --global user.name "Username"
git config --global user.email "email@example.com"

如果使用了 --global 选项,那么该命令只需要运行一次,之后无论在 Git 做任何操作, Git 都会使用该信息。若想针对特定项目使用不同的用户名与电子邮件时,可以只在那个项目目录下运行没有 --global 选项的命令来配置。

接着使用 git clone 从现有 Git 仓库中拷贝需要同步复刻的项目。

git clone <repo> <directory>

这里的 <repo> 就是远程仓库地址,可以在 Github 仓库页面的 Code - Clone 选项中找到,一般使用 HTTPS 链接即可;而 <directory> 则是选择该仓库在本地存放的路径。

仓库成功克隆到本地之后,就可以开始同步复刻上游仓库的命令了,在 Git Bash 中依次输入如下命令:

# 拉取上游仓库的更改
git fetch upstream

# 检查你的项目的默认分支(通常是 main)
git checkout main

# 合并上游的更改
git merge upstream/main

这时命令行便会输出存在冲突的文件,通常表现为:

CONFLICT (content): Merge conflict in path/to/file.txt
Automatic merge failed; fix conflicts and then commit the result.

接下来需要做的,就是在本地用文本编辑器打开存在冲突的文件,仔细检查该文件的内容,Git 已经用符号标记出了冲突的位置,从 <<<<<<< HEAD======= 是未修改之前文件内容,而从 =======>>>>>>> upstream/main 则是上游仓库修改之后的内容。

选择想要保存的内容,然后删除其余被标记的内容,标记符号也要一并删除,最后别忘记保存。

回到 Git Bash,依次输入如下命令来提交更改后的文件,并将本地仓库全部推送到远程仓库。其中 xxx 是对于此次提交修改的说明,依据情况填写即可。

git add path/to/file.txt
git commit -m "xxx"
git push

最后在 Github 仓库页面便可以检查到这次通过 Git Bash 的修改,同时 Fetch upstream 菜单中应该会提示 No new commits to fetch. Enjoy your day! 代表同步复刻已经全部完成。


封面来源:絵描き娘の作業部屋2021 | 佐倉おりこ@単行本発売中 #pixiv https://www.pixiv.net/artworks/89286307

Stay hungry, Stay foolish.