当前位置: 首页 > news >正文

从快到慢学习Git指令

Git是现在最流行的版本控制工具之一。无论是在开源社区还是企业软件开发中,Git都扮演着至关重要的角色。本文将根据不同的需求,分别提供快速上手和深入学习Git的指南。

如果你只想下载代码

如果你只是想下载GitHub或其他代码仓库的代码,那你只需要了解以下两个命令:

  • git clone: 从远程仓库克隆一个本地副本。例如,git clone https://github.com/username/repo.git会将仓库repo克隆到你的本地计算机。
  • git pull: 从远程仓库获取最新的修改并合并到本地。例如,在你克隆的仓库目录下运行git pull,就会将远程的最新修改拉取到本地并自动合并。

如果你需要使用Git进行简单的开发

如果你需要使用Git进行开发,并且你们维护的Git分支较为简单,那你需要了解以下命令以及一些基本的Git管理原则:

a. 你需要了解Git最基本的结构

在这里插入图片描述
workspace:工作区
staging area:暂存区/缓存区
local repository:版本库或本地仓库
remote repository:远程仓库

工作区存放着你电脑本地的代码。暂存区存放着你暂时放到一边的代码(当你暂时不希望你修改的一部分代码出现在你本地的代码中,但是后续可能又会用到的代码,即可使用暂存区先将其存起来)(可以理解为暂存区中的代码已经脱离了你代码原本存放的位置)。本地仓库存放着你已经提交了的代码是远程仓库与你本地代码间的桥梁。远程仓库为存放在服务器上的Git代码仓库,如github上的代码就是存放在github服务器上的,对你本机来说github服务器就是你本地的远程仓库。

b. 你需要简单了解Git的分支结构

你需要知道,Git的主要作用是对代码进行版本管理,其根本目的和作用就是管理你每一次对工程代码的修改,以方便出问题时对之前提交的代码进行分析,并进行回退;并且当你参与团队对一个项目进行开发时,可以保证你们团队成员之间写的代码不会出现冲突(比如你的代码被你伙伴修改了,然后当你/你同伴提交代码时Git就会阻止这种冲突的提交并提示你/你同伴)这样就能保证团队间开发的代码都是各种功能块的这样就保证了团队间能够 有序的进行代码的开发。

c. 你需要记住Git的这些基本指令

  • git init: 初始化一个新的Git仓库。在你的项目目录下运行git init,就会在该目录下创建一个新的Git仓库。
  • git status: 查看当前Git仓库的状态。这个命令会显示哪些文件被修改了,哪些文件还没有被提交。
  • git add: 将文件添加到暂存区。例如,git add file.txt会将file.txt添加到暂存区。
  • git commit: 将暂存区的修改提交到本地仓库。例如,git commit -m "Add new feature"会将暂存区的修改提交,并添加提交信息"Add new feature"。
  • git push: 将本地的修改推送到远程仓库。例如,git push origin main会将本地的main分支推送到远程仓库的main分支。
  • git fetch: 从远程仓库获取最新的修改,但不合并到本地。这个命令可以让你在合并前查看远程的修改。
  • git rebase: 将一个分支的修改合并到当前分支。例如,git rebase main会将当前分支的修改以main分支为基础进行合并。
  • git reset: 撤销修改。例如,git reset --hard HEAD~1会撤销最近一次的提交并删除工作区的改动。
  • git clean: 删除未跟踪的文件。例如,git clean -fd会删除所有未跟踪的文件和目录。
  • git restore: 撤销工作区的修改。例如,git restore file.txt会撤销file.txt在工作区的修改。
  • 你说得对,我漏掉了git revert这个重要的命令。让我来补充一下:
  • git revert: 撤销某次提交引入的改动,但不删除这个提交,而是生成一个新的提交来撤销更改。这个命令通常用于在公共分支上撤销一个已经推送的提交。例如,git revert HEAD会撤销最近一次提交引入的改动。

d. 你还需要了解一些Git管理的基本原则:

  • 提交应该是原子性的: 一次提交应该完成一个完整的改动。这使得代码更容易理解和回退。
  • 总是在提交前拉取: 在提交前运行git fetch and git rebase可以尽量减少合并冲突。
  • 妥善地使用分支: 利用分支可以让你的开发工作与主线开发分开,这可以减少冲突。
  • 写清晰的提交信息: 好的提交信息可以让其他人(包括未来的你)更容易理解这次提交的内容。

如果你需要使用Git进行复杂的开发

如果你们的代码分支较为复杂,你就需要深入学习Git的一些特性。除了上述的命令,你还需要掌握以下命令:

  • git branch: 列出、创建或删除分支。例如,git branch会列出所有的本地分支。
  • git branch [branch_name]: 创建一个新的分支。例如,git branch new-feature会创建一个名为new-feature的新分支。
  • git checkout: 切换分支或恢复工作区文件。例如,git checkout new-feature会切换到new-feature分支。
  • git reset [commit]: 将当前分支的末端移动到指定的提交。例如,git reset HEAD~3会将当前分支的末端移动到前三个提交之前。
  • git diff: 显示两个提交或工作区之间的差异。例如,git diff HEAD~1会显示最近一次提交和上一次提交的差异。
  • git merge [branch_name]: 将指定的分支合并到当前分支。例如,git merge new-feature会将new-feature分支合并到当前分支。
  • git cherry-pick [commit]: 选择一个提交,合并到当前分支。例如,git cherry-pick abc123de会将提交abc123de合并到当前分支。
  • git rebase -i: 交互式地修改提交历史。这可以用来合并提交,修改提交信息,删除提交等。
  • git stash: 将当前工作状态保存起来,以便后续恢复。例如,git stash会保存当前的修改,然后将工作区恢复到上一次提交的状态。
  • git tag: 给某个提交打上标签,通常用于标记发布版本。例如,git tag v1.0会给当前提交打上v1.0的标签。
  • git submodule: 管理项目中的其他Git仓库,常用于引用其他项目的代码。
  • git bisect: 通过二分查找来定位引入Bug的提交。
  • git blame: 查看文件的每一行是由谁修改的。
  • git reflog: 查看操作日志,常用于恢复误删的提交。

除了这些命令,你还需要深入理解Git的一些原理和特性:

  • Git的数据模型: Git本质上是一个内容可寻址的文件系统,并在此基础上提供了版本控制功能。理解Git的数据模型可以帮助你更好地理解Git的操作。
  • 分支模型: Git的分支是轻量级的,创建和切换分支几乎是瞬间完成的。合理地使用分支可以使你的开发工作更有条理。常见的分支模型有Git Flow, GitHub Flow等。
  • 远程仓库: Git是一个分布式的版本控制系统,每个Git仓库都可以有多个远程仓库。了解如何管理远程仓库可以让你更好地与其他人协作。
  • Git钩子: Git提供了在特定事件发生时自动运行脚本的能力,这被称为"钩子"。钩子可以用于自动化测试,部署等任务。

下面是一些例子,展示了如何在实际开发中使用这些知识:

  1. 创建一个新的特性分支并合并到主分支:

    # 在main分支上
    git checkout main
    git pull
    git checkout -b new-feature# 在new-feature分支上进行开发
    git add .
    git commit -m "Implement new feature"# 切换回main分支
    git checkout main
    git pull# 合并new-feature分支
    git merge new-feature
    git push
    
  2. 修复一个Bug并将修复应用到多个分支:

    # 在main分支上
    git checkout main
    git pull# 创建一个修复Bug的分支
    git checkout -b fix-bug# 修复Bug并提交
    git add .
    git commit -m "Fix bug"# 切换到需要修复的分支,例如develop分支
    git checkout develop
    git cherry-pick fix-bug
    git push
    
  3. 使用Git钩子自动运行测试:

    .git/hooks目录下创建一个名为pre-commit的文件,内容如下:

    #!/bin/shnpm test
    

    给这个文件添加执行权限:

    chmod +x .git/hooks/pre-commit
    

    现在,每次你执行git commit时,都会先自动运行npm test。如果测试失败,提交将被中止。

未完待续。。。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何编写一个CMakeLists.txt文件(由简到难,较详细)
  • RS®ZN-Z8x 开关矩阵
  • 映客基于Apache SeaTunnel 打造高效的一站式数据集成平台
  • 自然语言处理顶会​​​​ACL 2024录用阿里云38篇论文,通义团队披露多项大模型前沿技术
  • html+css 实现hover 3D按钮特效
  • 王道数据结构 | 第五章 树与二叉树【未完成】
  • ubuntu 20.04 右键新建空白文档;输入即定位文件或文件夹,而非出现搜索框
  • 0813,引用,函数重载,内存布局叭叭叭
  • C++的内存管理是怎样的?
  • 最小二乘法求拟合曲线(中线)的斜率和截距:数据背后的温柔对话
  • Python实例化指南之对象创建与初始化的实用技巧详解
  • 前端踩坑DOMException: Failed to execute ‘querySelector‘ on ‘Document‘: ‘#091.....‘
  • MySQL的InnoDB的页里面存了些什么 --InnoDB存储梳理(三)
  • .NET 8 跨平台高性能边缘采集网关
  • leetcode日记(72)最大矩形
  • 345-反转字符串中的元音字母
  • CentOS 7 修改主机名
  • JavaScript设计模式系列一:工厂模式
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • PHP的类修饰符与访问修饰符
  • RxJS: 简单入门
  • 区块链将重新定义世界
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 算法之不定期更新(一)(2018-04-12)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 学习使用ExpressJS 4.0中的新Router
  • 一个JAVA程序员成长之路分享
  • 最简单的无缝轮播
  • 2017年360最后一道编程题
  • 阿里云移动端播放器高级功能介绍
  • ​io --- 处理流的核心工具​
  • # 数据结构
  • ###STL(标准模板库)
  • #pragma data_seg 共享数据区(转)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $forceUpdate()函数
  • (14)Hive调优——合并小文件
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)Google的Objective-C编码规范
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET C# 操作Neo4j图数据库
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 中的轻量级线程安全
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • [ C++ ] template 模板进阶 (特化,分离编译)