分两种情况:
- 代码仓库管理者给你添加该仓库的写入权限,这样的话可以直接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 branch1Pull 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