如何往gitlab/github上游贡献代码
Git 是一个开源的分布式版本控制系统,它能够记录每一次改动。
一些概念
仓库:git 中以仓库为单位;每个项目对应一个仓库,如 /eayuntest/Rally、/eayuntest/stack 是 eayuntest 下的两个不同的仓库;
分支:git 中可以建不同的分支,但一般会有一个主分支,默认是 master,使用 git 时一般是在各个分支上进行开发,最终合并到主分支上;
上游:没有确切的定义,可以理解为某一个项目的公共仓库,大家都要向这个仓库贡献代码,那么就要将这个仓库作为各自的上游
至少要学会使用的几个 Git 命令
git clone
将一个仓库克隆到某个目录。更多可以参考 man git-clone。
举个栗子:
# git clone ssh://git@10.10.10.170:2222/lhx/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
git status
查看当前 git 的状态,可以知道目前在哪个分支上、是否有改动等。更多可以参考 man git-status。
继续举个栗子:
# git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
git add
将改动添加到 git 缓存区。更多可以参考 man git-add。
还要举个栗子:
# echo 'I am a test repo' >> README.md
# git add README.md
# git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: README.md
#
git commit
上面 git add 只是将改动添加到缓存区,并没有真正的提交,仍然可以随意改动。git commit 将改动提交,并记录改动的提交信息。更多可以参考 man git-commit。
依旧举个栗子:
# git commit -s
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@coffee-rally.(none)')
# git config user.email 'xxxx@eayun.com'
# git config user.name 'xxxx'
# git commit -s
[master (root-commit) 30454ce] Add README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md
git push
上面的 git commit 提交,只是在本地进行了提交,还需要推送到远程的仓库中,因此需要 git push 来完成。更多可以参考 man git-push。
再来举个栗子:
# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 254 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@10.10.10.170:2222/lhx/test.git
* [new branch] master -> master
到这里,对一个仓库进行提交的工作已经完成。但是,由于 git 是分布式的,你本地的内容和远程的内容并不一定是一致的,因此你还需要去同步远程仓库的内容,这就是下面几个命令可以完成的工作。
git fetch
下载远程分支的内容,但没有合并到本地分支中。更多可以参考 man git-fetch。
还是举个栗子:
# 远程的仓库做了一些改动,与我本地不一致,我要把它们下载下来:
# git fetch origin master
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ssh://10.10.10.170:2222/lhx/test
* branch master -> FETCH_HEAD
git merge
上面也说过,git fetch 只是下载内容,没有做合并,所以我们需要合并它们。
只能举个栗子:
# 就是将远程的分支,合并到本地分支:git merge [remote_branch] [local_branch]
# git merge origin/master master
Updating 875d8e2..a2fb8ab
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
git pull
其实 git pull = git fetch + git merge,平时只在把远程分支合并的时候用到。不过查到有说要少用 git pull,原因在这里: Git 少用 Pull 多用 Fetch 和 Merge,其实这是翻译成中文的,有兴趣可以看英文版: GIT: FETCH AND MERGE, DON’T PULL
又要举个栗子:
# 对于上面的改动,如果直接用 git pull 的话,是这样:
<code>
# git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ssh://10.10.10.170:2222/lhx/test
875d8e2..a2fb8ab master -> origin/master
Updating 875d8e2..a2fb8ab
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
git checkout
之前也介绍了,在 git 里面有分支的概念,那么怎么切换不同的分支呢?git checkout 就登场了。
也是举个栗子:
# 如果切换到某个已存在的分支:
# git checkout xxx
Switched to branch 'xxx'
# 如果分支不存在呢?那要切换过去,并且新建分支:
# git checkout -b coffee
Switched to a new branch 'coffee'
重要提示:开发过程中,要注意基于 master 分支去建新的分支,这样才能保证是在 master 的基础上进行的开发,不会有多余的内容提交。
git branch
分支相关操作的命令,可以列出、创建、删除分支,它与 git checkout -b 的区别就是,它新建了分支之后,不会切换过去。
惯例举个栗子:
# 列出分支:
# git branch -l
* coffee
master
test
# 列出所有分支:
# git branch -a
* coffee
master
test
remotes/origin/HEAD -> origin/master
remotes/origin/master
# 新建分支:
# git branch [branch_name]
# 删除分支:
# git branch -d test
Deleted branch test (was a2fb8ab).
如何提交pull request
举例一个场景:eayuntest 里有一个项目叫:Rally,我要为这个项目贡献代码。
在这里,/eayuntest/Rally 对我来说,是上游,是公共的代码,我是不能随意改动的
因此,我需要做的第一步,就是将上游的代码 Fork 到我的名下,像这样,点击fork:
fork后会在生成一个自己名下的库,比如:
现在,/eayuntest/Rally 就是我的上游,/lhx/Rally 就是我的仓库,我对 /lhx/Rally 随意做改动,都不会影响到 /eayuntest/Rally,那么,我们的首要目的已经达到了。
接下来,把 /lhx/Rally 克隆到本地,新建一个开发分支,不能在 master 上直接进行开发,因为 master 永远是跟上游同步的,我们也不能对它进行修改,否则同步就会出错。
# git branch -l
eayunstack-master
* lhx_rebuild_0904
某个功能的代码提交后,就可以去提 pull request 了:
编写 pull request 的信息后,可以点击提交:
这里,跳转到了上游的界面,reviewer 审查代码通过后,就可以把这个 pull request 合并到上游的 master 分支上:
到这里,提交 pull request 的工作已经完成了,就可以等着被 merge (接受了该提交)或者被 close(没有接受该提交)了。
但是,又要说一次,git 是分布式的嘛!如果你有一天发现,诶?上游更新了,我的代码跟上游不一样了,怎么办?
请继续往下看,我们要做同步的操作:
如何同步一个上游的 Fork
首先,虽然 fork 之后,/eayuntest/Rally 就是我的上游,但在本地仓库中,并不知道“上游”是什么,所以第一步,你要告诉你本地的仓库,你的上游是什么。
先看看目前我们跟踪的是什么仓库:
# git remote -v
origin ssh://git@175.25.23.162:10694/CoffeeChou/Rally.git (fetch)
origin ssh://git@175.25.23.162:10694/CoffeeChou/Rally.git (push)
目前只是跟踪了自己的仓库,这个仓库名称叫 origin(默认的),那么我们要把上游仓库加进来,起名字叫 upstream(惯例):
# git remote add upstream ssh://git@175.25.23.162:10694/eayuntest/Rally.git
这个时候再看我们所跟踪的仓库,就可以看到有上游了:
# git remote -v
origin ssh://git@175.25.23.162:10694/CoffeeChou/Rally.git (fetch)
origin ssh://git@175.25.23.162:10694/CoffeeChou/Rally.git (push)
upstream ssh://git@175.25.23.162:10694/eayuntest/Rally.git (fetch)
upstream ssh://git@175.25.23.162:10694/eayuntest/Rally.git (push)
当我们需要去同步上游时(一般是同步上游的 master,即我们为哪个分支做贡献),就用到前面说的命令:
要下载上游的内容到本地:
# git fetch upstream eayunstack-master
remote: Counting objects: 1, done.
Unpacking objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0)
From ssh://175.25.23.162:10694/eayuntest/Rally
* branch eayunstack-master -> FETCH_HEAD
说明一下,因为我是为上游 /eayuntest/Rally 的 eayunstack-master 贡献代码,所以我要同步的是这个分支的内容到我的 master 上。
合并之前,要确保自己在 master 分支上(我没有试过不在 master 上合并会怎么样,不过应该只要指定了合并的目的分支,应该不会有问题,保险的话还是切换吧),因为我们这里的 master 分支其实是 eayunstack-master,所以:
# git checkout eayunstack-master
Switched to branch 'eayunstack-master'
合并上游分支到本地分支:
# git merge upstream/eayunstack-master eayunstack-master
Updating 92266e9..0fde160
... ...
这个时候,可以看到有合并过来的提交,并没有被推送到远程的 /lhx/Rally 上:
# git status
# On branch eayunstack-master
# Your branch is ahead of 'origin/eayunstack-master' by 35 commits.
# (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
那么,最后,就只要将这些合并过来的提交推送到 /lhx/Rally 上就可以了:
# git push origin eayunstack-master
Total 0 (delta 0), reused 0 (delta 0)
To ssh://git@175.25.23.162:10694/lhx/Rally.git
92266e9..0fde160 eayunstack-master -> eayunstack-master
今天在上传代码时遇到一个问题,github网页显示上传的文件夹是置灰状态无法查看文件,上网查询才知道是文件夹中存在另一个.git,解决方法如下:
进入库目录,删除库缓存:
git rm -r --cached <出现问题的库文件路径>
删除后重新执行git add、git commit、git push操作,刷新网页就ok啦~~
如何往gitlab/github上游贡献代码的更多相关文章
- AI框架外部用户贡献代码
AI框架外部用户贡献代码 概述 飞桨是百度自主研发的一款开源的深度学习框架,是主流深度学习框架中首个完全国产化的产品,已经在农业.医疗.林业.科研.服务等领域成功应用.无论是已入职场的深度学习从业者. ...
- 如何在github上fork一个项目来贡献代码以及同步原作者的修改
[-] 如何贡献自己的力量 如何让自己的项目与原作者的项目保持同步 作为一个IT人,通过github进行学习是最快的成长手 段.我们可以浏览别人的优秀代码.但只看不动手还是成长得很慢,因此为别人贡献代 ...
- 花20分钟写的-大白话讲解如何给github上项目贡献代码
原文地址:http://site.douban.com/196781/widget/notes/12161495/note/269163206/ 本文献给对git很迷茫的新手,注意是新手,但至少会点基 ...
- 【转】如何在github上fork一个项目来贡献代码以及同步原作者的修改 -- 不错
原文网址:http://www.cnblogs.com/astwish/articles/3548844.html 作为一个IT人,通过github进行学习是最快的成长手段.我们可以浏览别人的优秀代码 ...
- GitHub上fork一个项目贡献代码以及同步原作者的修改【转】
如何贡献自己的力量 首先你总得有自己的github帐号吧,注册一个,非常简单,只需用户名,邮箱,密码,邮箱只是用来找回密码的,不做验证.因此注册后立即能用!比如我现在新注册一个叫JsLouvre的示范 ...
- (转)大白话讲解如何给github上项目贡献代码
转自:https://site.douban.com/196781/widget/notes/12161495/note/269163206/ 2013-03-30 22:53:55 本文献给对g ...
- 大白话讲解如何给github上项目贡献代码
本文献给对git很迷茫的新手,注意是新手,但至少会点基本操作,有点基本概念的新手,我不会从怎么用github和git是什么开始讲的.如果作为新手你看书又看不进去,原理又太复杂,又没有直接了当告诉我们怎 ...
- Pull Request的正确打开方式(如何在GitHub上贡献开源项目)
Pull Request的正确打开方式(如何在GitHub上贡献开源项目) GitHub的官方帮助如下: Fork A Repo: https://help.github.com/articles/f ...
- GitHub + VSTS 开源代码双向同步
GitHub已经是全球开源代码的大本营了,通过以下统计你可以看到仅仅javascript在github就有超过32万个活动的repo.很多开发人员都会把自己的一部分代码分享到github上进行开源,一 ...
随机推荐
- maven设置指定jdk版本
今天心血来潮准备折腾一下jeecg,去下载了一个maven版本的项目,既然下载了maven版的,当然就要配置好maven环境了. 因为之前简单学习过maven,当时使用的版本是3.3.9的,但是今天在 ...
- 读写json文件
def read_json(path): """return dict""" with open(path,'r+')as f: retur ...
- blg_统考,打印准考证 网页代码!
<html xmlns="http://www.w3.org/1999/xhtml"><head> <title>打印准考证</title ...
- 6_4 破损的键盘(UVa11988)<链表>
你用了一个有点坏掉的键盘打字,该键盘会自动按下”Home”键与“End”键,直到打完整个内容以前,你都没有发现到这个问题.本题给定键盘输出的字串(包含Home与End),请你输出该字串在屏幕显示的内容 ...
- sqlmap+burpsuit
sqlmap可以批量扫描burpsuit导出的requests日志文件,从而进行批量扫描是否存在SQL注入. 首先设置burpsuit记录代理的Requests 把记录的日志文件保存在sqlmap的目 ...
- linux下的apue.3e安装[Unix环境高级编程]
近期正在看<Unix环境高级编程>一书,目前看了20多页,书中 有几个c的例程,于是想着,也让它运行一下,看看是否跟描述相符,做开发人员本应该这样,于是敲了一部分代码,然后编译,发现并不能 ...
- 4、maven——构建生命周期
什么是生命周期? 构建生命周期是一组阶段的序列(sequence of phase),每个阶段定义了目标被执行的顺序,这里的阶段就是生命周期的一部分. 一个典型的Maven生命周期由一些几个阶段的序列 ...
- 分享Linux系统快速入门法
相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什么要学习Linux,有的人是因为兴趣 ...
- java泛型demo
1.泛型类 public class Dog<T> { private T age; public Dog(T age) { this.age = age; } public T getA ...
- ios 用touchend事件 pc用click touchend击穿
var clickEvent = (function() { if ('ontouchend' in document.documentElement === true) return 'touche ...