[Skill]俩小时掌握多人协同开发中的git使用方法

2024-04-16 08:48

本文主要是介绍[Skill]俩小时掌握多人协同开发中的git使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习网站

https://git-scm.com/book/zh/v2
https://learngitbranching.js.org/

基础

# 提交commit
git commit -m "msg"# 创建并切换到分支
git checkout -b bugFix# merge分支
git checkout -b bufFix
git commit
git checkout master
git commit
git merge bugFix # 把bugFix分支merge到master上

image.png

git checkout -b bugFix
git commit
git checkout master
git commit
git checkout bugFix
git rebase master

image.png

高级

移动分支
# 使用提交记录上的标签(哈希值)来指定提交记录
git checkout C4
git checkout HEAD^
git checkout HEAD~4# 强制移动master分支
git branch -f master HEAD~3
撤销变更

git reset通过把分支记录回退几个提交记录来实现撤销改动。但是这种方法对大家一起使用的远程分支是无效的。需要使用git revert。

git reset HEAD~1
git revert HEAD

移动提交记录

将本地分支的指定commit工作复制到其他分支上
git cherry-pick C2 C4

image.png

交互式的rebase
git rebase -i HEAD~4

杂项

只取一个提交记录

适用于bufFix中有多个无效提交记录(比如打印debug日志),我们只需要取一个提交记录到主分支上即可。

git rebase -i 和 git cherry-pick均可实现。

增加标签

tag可以指向某个提交记录的标识,比如软件发布新的大版本,或者修正一些重要的bug或者是增加了某些新特性。

git tag v1 C1
git describe

用于帮助你在提交历史中移动了多次后找到方向。

# 语法:
git describe <ref>
# <ref>是任意能被git识别成提交记录的引用,如果你没有指定的话,git会以你目前所检出的位置(HEAD)。
# 输出结果:
<tag>_<numCommits>_g<hash>
# tag表示离<ref>最近的标签,numCommits表示这个ref和tag之间相差有多少个提交记录,hash表示你所指定的ref所表示的提交记录哈希值的前几位。当ref提交记录上有某个标签时,只输出标签名称。
多分支全都rebase到master上
多个父节点时

使用git checkout HEAD^1中的^符号可以指定第几个父节点。
而且^~操作符支持链式操作:

git checkout HEAD~1^2~3

远程仓库

克隆远程仓库
# 克隆远程仓库
git clone

image.png

获取远程仓库更新

当远程仓库(虚线)更新了C2和C3两次提交时,本地仓库可以通过git fetch将C2和C3更新下载到本地仓库,同时本地的o/master分支也会更新。

需要注意的是,此时本地的master分支并不会更新。也就是git fetch并不会更新本地的master分支,只会更新本地的o/master指针。

image.png

更新前:
image.png
更新后:
image.png

git pull

相当于先git fetch获取远程仓库o/master更新后merge到本地的master分支上。

注意当本地分支和远程分支有分歧时也可以使用。

image.png

git push
  • 将更新传递到远程仓库,远程仓库更新master分支
  • 本地的远程分支o/master也会更新
偏离的工作

举个例子,当你完成自己的功能开发后,你的同事写了一堆提交并且改变了许多你功能中使用的API,这些改变使得你新开发的功能不可用,但是他已经将代码推送到远程仓库上了。此时如果git是不会允许你执行git push的,你只能先合并远程最新的代码,然后才能提交你的工作。

git fetch
git rebase o/master
git push

另外,我们也可以使用merge

注意,使用rebase相比于pull可以使得提交历史更简洁。

  1. 使用前本地master和远程master有分歧
    image.png

  2. 使用pull时:

  • 本地master同步远程master的更新
  • 本地的o/master更新和远程master一致
    image.png
  1. 使用fetch和rebase时:
  • 首先fetch更新o/master远程分支
    image.png
  • 其次rebase会将C3的改变加在o/master
    image.png

git pull --rebasefetchrebase的缩写。

良好的开发规范
  1. 工作完成后快速地更新本地master分支并推送到远程仓库
# 拉取远程分支更新并将更新推送到本地master
git pull --rebase
# 推送本地更新到远程
git push
  1. 一个小例子
  • 本地开发了多个功能,全部开发完成
    image.png

  • 更新o/master分支

git fetch
  • 将不同功能rebase到o/master分支上
git rebase o/master side1
git rebase side1 side2
git rebase side2 side3

image.png

  • 更新本地master分支并上传到远程仓库
git rebase side3 master
git push 
  1. 相同的工作用merge完成

注意,使用rebase可以让你让你的提交历史更加干净,但是缺点是你会丢失你的部分提交历史,虽然我个人感觉是意义不大的提交历史(在快速迭代开发中)。仁者见仁,智者见智。

image.png

git checkout master # 回到本地master分支
git pull # 更新本地master分支
git merge side1
git merge side2 
git merge side3
git push
跟踪远程分支

mastero/master分支是相互跟踪的,是在我们克隆远程仓库时指定的。

# 法1:
git checkout -b totallyNotMaster o/master
# 法2:
git branch -u o/master totallyNotMaster
git push的参数
# 切换到本地的master分支,获取所有的commit,再到远程仓库origin中找到master分支,将远程仓库中没有的提交记录都添加上去
git push origin master
# 将本地的某个分支推送到远程中的另一个分支
git push origin <source>:<destination>
# 注意这里的destination也可以是一个新建的分支
git fetch的参数
# 一方面git fetch只会下载远程的提交记录从而更新`o/master`,但不会更新本地的非远程分支。
# 另一方面我们可以通过<source>:<destination>来设置fetch的传输来源和目的地。其中source指的是远程仓库的位置,而destination指的是本地仓库的位置。
# 如果git fetch没有任何参数,那么它会下载所有的提交记录到各个远程分支中,即更新所有的远程分支
git push和git fetch的空参数
# 删除远程的foo分支
git push origin :foo# 在本地创建新分支bar
git fetch origin :bar
git pull参数

git pull不带任何参数就是fetch和merge的组合,首先更新本地的远程分支,然后再merge你抓取到的提交记录。

git pull origin foo相当于:

git fetch origin foo
git merge o/foo

git pull origin bar~1:bugFix相当于:

git fetch origin bar~1:bugFix
git merge bugFix

需要注意的是,git pull更新的是我们的检出位置,而不是一定更新本地master分支。

比如在pull之前,我们的HEAD在本地分支bar上:

image.png

当我们使用git pull之后:

git pull origin master

image.png

这篇关于[Skill]俩小时掌握多人协同开发中的git使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908328

相关文章

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf