热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何往gitlab/github上游贡献代码

Git是一个开源的分布式版本控制系统,它能够记录每一次改动。一些概念仓库:git中以仓库为单位;每个项目对应一个仓库,如eayuntestRally、eayunteststack

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 ..." 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 的话,是这样:

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


推荐阅读
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • 本文介绍了如何在GitHub上设置多个SSH Key,以解决原有Key失效的问题,并确保不同项目使用不同的私钥进行安全访问。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在编译 PHP7 的 PDO MySQL 扩展时,可能会遇到 `[mysql_driver.lo]` 错误 1。该问题通常出现在 `pdo_mysql_fetch_error_func` 函数中。本文详细介绍了导致这一错误的常见原因,包括依赖库版本不匹配、编译选项设置不当等,并提供了具体的解决步骤和调试方法,帮助开发者快速定位并解决问题。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文深入探讨了RecyclerView的缓存与视图复用机制,详细解析了不同类型的缓存及其功能。首先,介绍了屏幕内ViewHolder的Scrap缓存,这是一种最轻量级的缓存方式,旨在提高滚动性能并减少不必要的视图创建。通过分析其设计原理,揭示了Scrap缓存为何能有效提升用户体验。此外,还讨论了其他类型的缓存机制,如RecycledViewPool和ViewCacheExtension,进一步优化了视图复用效率。 ... [详细]
author-avatar
个信2602907025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有