分两种情况:
- 代码仓库管理者给你添加该仓库的写入权限,这样的话可以直接push
- 如果不能直接push(大多数情况),采用经典的
fork & pull request
来提交代码,下面讲述这种情况
fork
首先需要fork这个项目, 进入项目页面, 点击右上角的 Fork按钮
git clone
clone到本地:
git clone https://github.com/yourname/project.git
添加原项目远程地址
使用 git remote -v 查看 origin 和 upstream 对应的是否正确:
- origin对应的应该是自己github的地址,即yourname/project
- upstream对应的应该是原项目的地址,即sourcename/project
$ git remote add upstream https://github.com/sourcename/project.git //设置原代码地址
$ git remote -v
origin git@github.com:breezet/ccextractor.git (fetch)
origin git@github.com:breezet/ccextractor.git (push)
upstream https://github.com/CCExtractor/ccextractor.git (fetch)
upstream https://github.com/CCExtractor/ccextractor.git (push)
获取原项目最新代码
git pull upstream master
创建分支
- 好了, 现在可以开始贡献我们的代码了 按照国际惯例, 我们一般不在 master 上提交新代码,
而需要为新增的功能或者fixbug
建立新分支, 再合并到master
上, 使用以下代码创建分支
git checkout -b branch1
现在我们可以在分支上更改代码了
- 假设我们已经添加了一些代码, 提交到代码库
git commit -a -m "new commit"
合并修改
一个常见的问题是远程的
upstream
有了新的更新,
从而会导致我们提交的Pull Request
时会导致冲突,
因此我们可以在提交前先把远程其他开发者的commit和我们的commit合并.使用以下代码切换到 master 分支:
git checkout master
- 使用以下代码拉出远程的最新代码:
git pull upstream master
- 切换回 branch1:
git checkout branch1
- 把 master 的 commit 合并到 branch1:
git rebase master
- 把更新代码提交到自己的 branch1 中:
git push origin branch1
Pull Request
- 可以在你的 github 代码仓库页面切换到 branches 页面点击 branch1 分支后点击 New pull request 按钮, 添加相关注释后提交.
- 或者,切换到 branch1 分支的代码仓库点击 Compare & pull request 按钮, 添加相关注释后提交.
Pull Request发送之后……
一旦你从自己的主题branch(例如branch1)推送了一条Pull Request,
那么在这条Pull Request被关闭之前,再次向这个branch里push代码,
所有的commits都会被自动追加到这个Pull Request后面(不需要再另开Pull Request)。
这个功能尤其有用,比如你最初提交的Pull Request里存在某些问题,项目维护者要求你打回去修改;
或者要求你给你的新feature添加一条相应的unit test(这种情况简直太常见了)。
只要追加commits到你的这个主题branch中即可。
Pull Request关闭之后
如果是已经被merge后关闭的Pull Request,你可以在页面的最下方找到一个“Delete this branch”的蓝色按钮。
这表明这个主题branch的历史使命已经完成(branch1的commit已经被合并到主项目中),可以安全地从远程库中删除了。
在本地库中亦可删除这个branch:
$ git branch -d fix-unicode-error