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

开源社区Git操作

前言本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。Git入门教程请参考https://www
前言

本篇为大家总结社区多人合作常见的场景和对应的git操作命令。本篇非新手教程,阅读本篇前需具备Git基础知识。

Git入门教程请参考https://www.atlassian.com/git。

配置remote

开源社区操作需要我们的本地Git关联两个远程仓库:一个是开源项目的仓库,通常命名为upstream。另一个是我们自己Fork的项目,命名为origin。我们无权push到upstream,但能够push到origin。

开始多人合作前,需要配置好remote。

Remote配置命令

查看remote的详细配置:

# git remote -v
origin  https://github.com/xxxx/flink.git (fetch)
origin  https://github.com/xxxx/flink.git (push)
upstream        https://github.com/apache/flink.git (fetch)
upstream        https://github.com/apache/flink.git (push)

git remote命令也会显示remote配置,但是仅仅显示remote的名字。git remote -v显示的信息更为详细。

查看某remote的详细配置:

# git remote show 

添加一条remote配置:

git remote add 

删除一条remote配置:

git remote rm 

修改一条remote的名字:

git remote rename 

修改某个remote的URL:

git remote set-url 
更新fork项目的master分支

项目fork一段时间之后,fork出的项目master分支会远远落后于源项目的master分支。这时我们需要更新它。

方法1:使用rebase指令

rebase指令可以当前分支分叉的提交记录嫁接到另一个分支上。由于我们没有在本地master分支提交(没有分叉的提交记录),rebase相当于将本地master分支的指针指向upstream/master分支的HEAD。

# 更新upstream/master分支到本地
git fetch upstream master
# 切换到master分支
git checkout master
# 执行rebase
git rebase upstream/master
# 推送更新后的master分支到remote
git push origin master

方法2:删掉本地master重新创建

# 更新upstream/master分支到本地
git fetch upstream master
# 删除master分支
git branch -D master
# 重新checkout一个master分支
git checkout -b master upstream/master
# 设置master对应的remote分支为origin/master分支
# 可以忽略这一步,但是以后push的时候不能省略remote分支名
git branch -u origin/master
# 推送更新后的master分支到remote
git push origin master
修改remote tracking branch

通常我们使用git从remote分支checkout一个本地分支,git为自动为我们做关联。但有些情况我们需要修改他们的关联关系。可通过如下命令:

git branch -u /
强制push

如果我们对本地分支做出了修改,部分已存在的提交和remote 分支已经不同,这是如果我们直接推送,会报分支冲突,无法提交成功。

此时为了覆盖远程分支,我们需要执行强制推送命令,格式如下所示:

git push -f 
PR提交原则

不同开源项目的规范各种各样。下面只侧重于和git使用相关的部分。

添加规范的提交信息。需要按照社区的规范来。通常格式为:[ISSUE-ID][module] bug_description

git commit -m 'commit message'

确保一个提交解决一个问题。如果本地已经有一次提交,又需要修改的话,可以使用追加提交:

git commit --amend

修改源代码前必须从master创建一个分支,不要在master分支直接修改。

git checkout master
git checkout -b 
让自己的commit基于社区最新进度

这是一个很常见的场景:我们从master checkout一个工作分支,在上面做出修改。然而工期可能比较长,等我们想要合并到master分支的时候,发现master分支已经更新了。如果工作分支和master分支最新内容没有冲突,实际上不影响我们提交PR。但是我们想把master分支后来增加的commit拉过来到工作分支,让我们的commit基于master分支的最新commit,这样就可以验证我们的修改是否会影响到目前最新版本的功能。我们如何才能这么操作呢?

可以使用git的rebase指令,如下所示:

git fetch upstream master
git checkout working_branch
# 如果有冲突,需要解决
git rebase upstream/master
git push origin working_branch -f
整理提交记录

按照PR提交原则,一个issue必须严格对应一个commit。我们在本地操作的时候有可能没有按照这个要求。怎么才能整理这些冗余的commit呢?

Git的交互式rebase指令可以满足我们的要求。

# 从指定的commit开始rebase
git rebase -i 

之后会弹出一个文本文件,如下所示:

pick ab7ef11 1st commit
pick 8a638b2 2nd commit
pick c11b5bc 3rd commit
pick 3d88d16 4th commit

这个文件从上到下时间从早到晚的方式列出了需要rebase的commit。格式为指令 commit-id commit-message。上面例子的含义为按顺序依次保留这4个commit。这是默认行为,相当于什么也没做。我们需要做的是修改这个文本文件。比如修改指令,调整顺序等。

交互式rebase支持如下常用指令:

  • pick:保留该commit
  • reword:保留该commit,但修改commit message
  • squash:保留该commit的操作,但是压缩到前一个commit中,commit message和前一个commit的合并
  • fixup:保留该commit的操作,但是压缩到前一个commit中,忽略这个commit的message
设置某commit为branch的HEAD

这个操作的含义为快速移动某个分支的指针,让它指向特定的某个commit。实践中可以快速更改工作分支的内容。

git reset --hard可以让分支的HEAD强行指向某个commit。

git checkout 
git reset --hard 

或者是使用git branch -f命令:

git branch -f 

可以将指针强行指向

提取某commit到当前分支

开发过程中我们可能会建立一些临时的分支,用于单独验证某个改动。在验证完毕后,我们如何才能将其应用到真正的工作分支呢?

Git的cherry-pick正是用来完成这个任务。我们先获取到需要cherry-pick的commit的id,然后切换到工作分支,执行如下命令:

git cherry-pick 
学会使用tag

虽然git有branch这个概念,但是branch是“不稳定”的,意思是它的指针可以随时改变。如果一个commit对于我们具有特殊意义,比方说是对应某个发版版本。我们可以将这个commit起一个容易记住的别名。这个功能正是git tag。

tag的操作

标签的本地操作

查看所有的tag:

git tag

查看某个tag的详细信息:

git show 

为某个branch指针所在的commit创建tag:

git checkout 
git tag 

为某个commit创建tag:

git tag 

创建tag的同时指定tag描述信息:

git tag -a  -m "tag description" 

删除标签:

git tag -d 

标签的远程操作

推送指定的标签:

git push 

推送所有的标签:

git push  --tags

删除已推送的标签:

git tag -d 
git push origin :refs/tags/

推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
springzhe7943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有