设为首页 收藏本站
查看: 1030|回复: 0

[经验分享] 如何往gitlab/github上游贡献代码

[复制链接]

尚未签到

发表于 2018-1-11 23:54:25 | 显示全部楼层 |阅读模式
  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>
  
Omit --global to set the>  

  
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啦~~


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-434122-1-1.html 上篇帖子: 2、gitlab 新建项目 下篇帖子: gitlab 换机房后更改IP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表