每次用到git,总会遇到一些问题,所以写这篇文章记录一下。
等fork完之后,你可以在自己的仓库中看到同名的项目,URL的形式:https://github.com/your_name/repo_name,如下是我fork的项目:
现在,随意更改这个项目都不会影响原来的项目。
clone项目
把fork的项目拉到本地:
// clone 到本地的 repo_name 目录 git clone https://github.com/your_name/repo_name repo_name
创建branch
进入仓库目录后,可以使用如下命令创建并切换到test分支
cd repo_name // 创建并切换到 test 分支 git checkout -b test
修改本地仓库,并commit
在这个test分支下经过一些修改后,需要先提交这些修改到本地仓库
// 查看修改 git status
status命令可以看到我们修改了哪些文件,使用diff命令将修改的文件和原文件对比,查看具体修改内容:
git diff README.md
可以看到我删除了一行,并加了一行,内容是一个>。
如果要撤销修改,可以ctrl+z(command+z),但status命令已经提示了,使用checkout命令可以撤销(discard)修改:
// 注意,是2个减号 git checkout — README.md
使用如下命令提交我们的修改:
// 添加所有修改、删除、新增的文件 git add -A // 或者,添加指定文件 git add README.md // 记下做了哪些修改,简明一点就行 git commit -m “修改说明”
将我们的项目和原始项目合并
前面已经说过,我们fork的项目不会影响到原始项目,同样,原始项目的更新也不会影响到我们的项目。现在,就会有这样一个问题,原始项目有很多人维护,每天都在更新,而我们的项目在修改完提交Pull Request时,已经落后原始项目好几个版本,这时提交就会有冲突,结果就会被拒绝。
为了解决这个问题,我们需要再添加一个remote配置,暂且叫它upstream,区别于origin,upstream用来同步本地仓库的。在默认情况下,clone完之后,git自动将origin指向我们自己的项目地址的,可以使用如下命令查看:
// 2个verbos查看远程仓库详细信息 git remote -vv
现在,添加upstream:
// 添加upstream git remote add upstream [[email protected]](mailto:[email protected]):repo_owner/repo_name.git
现在假设原始仓库更新并提交了很多次,我们本地代码已经落后很多,为了保持同步,可以通过如下命令拉取:
// 切换到master分支 git checkout master // 使用 rebase 模式拉取 upstream/master 上的更新 // 且与本地的 master 合并, 第一个 master 是远程分支,第二个是本地分支 git pull --rebase upstream master:master // 切换到前面建立的 test 分支 git checkout test // 使用 rebase 模式合并本地的 test 和 master 分支 git rebase master
当然,还可以通过如下方式:
// 切换到 master 分支 git checkout master // 获取 upstream 上的 master 分支 git fetch upstream master git checkout test //使用 rebase 模式合并本地的 test 和 upstream/master 分支 git rebase upstream/master
总的来说,所有本地的改动都不会直接在 master上面进行。通过新建upstream分支,可以把本地的master分支当作一个只负责从上游获取更新的分支,先将上游的master和本地的 master合并,此时,保证本地的master是上游的最新版本,再通过合并test和本地的master来完成本地改动的更新。
注意:使用rebase时应当小心一点,这会影响到已经提交的代码
推送(push)到远程仓库
完成修改和同步后,需要将本地修改的代码推送到github:
// 将本地 test 分支的代码 push 到 origin 的 test 分支 // 如果该分支不存在则会创建 git push origin test
发起合并请求(Pull Request)
代码提交后,登录到GitHub,页面上就会提示我们发起Pull Request:
删除test分支
我们的代码被合并之后,也不再修改,需要将test分支删除,如下:
// 1. 删除远程分支 git push origin —delete test // 2. 删除本地分支 git branch -d test
整个流程就是这样。
参考:
- http://www.ruanyifeng.com/blog/2015/12/git-workflow.html
- https://blog.zfanw.com/best-practice-contribute-on-github