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

【tips】Git使用指南

文章目录

  • 一、Git介绍
    • 1. 什么是Git
    • 2.Git对比SVN
    • 3.Git安装
  • 二.Git常用命令
    • 1. git config
    • 2. 初始化本地库
    • 3. 工作区、暂存区和版本库
    • 4. git add
    • 5. git commit
    • 6. git reset 与 git revert
      • git reset
      • git revert
  • 三. Git 分支
    • 1.初识分支
    • 2.创建分支
    • 3.切换分支
    • 4.合并分支
    • 5.删除分支
  • 四.远程仓库
    • 1.创建远程仓库
    • 2.添加仓库地址
    • 3.git push
    • 4.git clone
    • 5.git pull
  • 五.VScode集成Git
  • 六. gitignore

一、Git介绍

1. 什么是Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件

  • 版本控制

    版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术

  • 团队协作

    从单兵作战转换为团队开发

2.Git对比SVN

  • SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己的代码推送到中央服务器,集中式版本控制系统是必须联网才能工作

  • Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网,因为版本都在自己电脑上,可以离线工作

3.Git安装

git官网下载

打开 cmd 窗口,输入指令检查是否安装成功

git --version

 

二.Git常用命令

1. git config

Git 中有三层 config 文件,分别为系统、全局、本地,对于同一配置项,优先级为本地 > 全局 > 系统,每层配置都会覆盖掉上一层的配置

查看不同级别配置文件

# 查看系统config  \Git\mingw64\etc\gitconfig包含适用于系统所有用户和所有项目的值
git config --system --list# 查看当前用户(global)配置  C:\Users\Administrator.gitconfig
git config --global  --list# 查看当前仓库配置信息  git项目目录中的.git/config,适用于当前项目
git config --local  --list

设置用户标识,以区分不同的开发人员,可以和远程不同

# 设置全局配置 --global
git config --global user.email "you@example.com"
git config --global user.name "Your Name"# 设置本地用户标识
git config user.email "you@example.com"
git config user.name "Your Name"# 删除配置项
git config [--local|--global|--system] --unset section.key# 查看当前配置
git config --list# 查看某个配置项
git config user.name

2. 初始化本地库

cd hello/是进入文件夹,cd ..是返回上一级文件夹,ls显示当前文件夹下的普通文件,ls -a显示所有

git init

初始化后文件夹内会多一个 .git 的文件夹(这个文件夹是一个隐藏文件夹)

3. 工作区、暂存区和版本库

工作区

当前目录下的所有文件,.git不属于工作区

版本库

.git这个目录是本地版本库(本地仓库),分为暂存区和main

托管平台

  • 局域网(内网):gitlab
  • 公网(外网):gitlab、github、gitee 码云

将工作区的代码提交至暂存区(stage),确定没有问题后提交到主分支 main ,即历史区,这时才会生成提交记录

如果需要再次提交,可以将之前 main 中的提交撤回到暂存区,在暂存区中一次性提交至 main 中,总共生成一次记录,避免记录混乱

最后推送远程仓库

4. git add

使用 git add 指令将代码提交至暂存区

# 把文件夹下的单独文件 index.txt 放在暂存区
git add index.txt
# 把文件夹下的单独一个文件夹 assets 放在暂存区
git add assets/
# 把文件夹下所有的内容都放在暂存区
git add --all
# git add --all 简单的写法
git add .# 查看文件状态(绿色的表示在暂存区,红色的表示只在工作区)
git status# 查看文件内容
cat index.txt# 删除暂存区的文件
git rm --cached index.txt

5. git commit

使用git commit指令将暂存区的内容提交至历史区(版本库)

# 将暂存区的内容放到历史区(版本库),不加-m会进入vim模式,按i切换到insert模式,写注释(不要在#后面写,另起一行),然后按esc键,按:wq退出
git commit -m "message"# 跳过 git add, 将所有已被跟踪的文件更改提交到版本库
git commit -am "message"# 使用一次新的commit, 替代上一次提交,如果代码没有任何新变化, 则用来改写上一次commit的提交信息
git commit --amend -m "message"

使用 git log 指令查看版本信息

# 查看当前历史区版本信息,显示最顶端指针及以下的记录
git log
# 查看本地库所有的操作记录
git reflog

6. git reset 与 git revert

git reset

使用 git reset 版本编号 进行历史回退,回滚到对应的commit-id,共有如下三种命令方式:

--mixed:默认,可以不带该参数,回滚到所有git addgit commit命令执行之前,暂存区清空,全部到工作区

--soft:工作区不变,暂存区 = 原来的 + 回滚后和回滚前的版本差异

--hard:撤销工作区中所有未提交的修改内容,将所有工作区和暂存区的文件修改全部清空覆盖,不能找回

# 回退到上一次提交的版本
git reset --hard HEAD^# 回退到上上次提交的版本 hard 之前从历史区回退到工作区
git reset --hard HEAD^^
git reset --hard HEAD~2
git reset --hard reflog中显示的回退前那一次的地址(或者前面的6个字母)# soft从历史区回退到暂存区,比如注释写的不够详细可以回退到暂存区再写一下再推到历史区,或者修复了一个bug,把前面那个版本退回,将新代码推到暂存区,再一起推到历史区
git reset --soft HEAD^

head指针,表示当前指向的位置,head->main,每提交一次会向前一次,想回退版本让指针向回移动一次

回退后,此时git push会报错,因为本地库HEAD指向的版本比远程库要旧

使用-f参数强制推送

git push -f

git revert

"反做"某一个版本,撤销其中的commit-id并重新生成一个commit-id,以达到撤销该版本的修改的目的,本身不会对其他的提交commit-id产生影响,例如想要修改版本二,但不想影响版本三,则可用git revert修改版本二并生成新的版本四,不影响版本三

也就是说,撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交,版本会递增且不影响之前提交的内容

如果要推送到远程服务器使用git push即可

# 撤销前一次 commit
git revert HEAD# 撤销前前一次commit
git revert HEAD^# 撤销某一次commit,会让程序员修改注释,如果想要使用默认注释添加 -n 或 --no-commit 参数
git revert commit_id# 连续撤销多个commit
git revert -n commit_id_start..commit_id_end
# 或者下述写法
git revert -n commit_id_1
git revert -n commit_id_3

 

三. Git 分支

1.初识分支

git 在初始化的时候,会自动生成一个分支,叫做 main ,表示主要分支的意思

可以自己开辟出很多独立分支,每个功能是一个独立的分支

2.创建分支

使用 git branch 分支名称 指令开辟分支

# 开辟一个 login 分支
git branch login

查看当前分支情况

# 查看当前分支情况
git branch

前面有 * 号并且有高亮显示的,表示当前所处的分支

3.切换分支

使用 git checkout 分支名称git switch 分支名称指令来切换分支

建议使用switch命令,checkout是一个很底层的命令,可以完成很多事情,在特定情况下使用会造成困扰

# 切换到 login 分支
git checkout login
git switch login# 创建一个新分支并切换到该分支,保留main中所有文件
git checkout -b login
git switch -c login# 创建一个新分支并切换到该分支,删除所有跟踪文件
git switch --orphan login

按照分支将所有功能开发完毕后,只要把所有代码都合并到 main 主分支上就行了

4.合并分支

使用 git merge进行分支合并,将别的分支的内容合并到此时所处的分支上

# 切换到 main 分支
git switch main# 把 login 的内容合并到自己的分支
git merge login

当两个分支对同一个文件均进行过修改时,合并后会产生冲突,需要手动合并(出现master|MERGING的时候),这时打开文件把需要留的东西留下需要删的东西删掉,然后重新add和commit就可以了(合并后的还是只在main里面,login里面还是他原来的子功能)

5.删除分支

切换到别的分支,使用 git branch -d 分支名称 指令删除分支

# 先切换到别的分支
git switch main# 删除 login 本地分支
git branch -d login# 强制删除
git branch -D login# 有必要的情况下,删除远程分支
git push origin --delete login

 

四.远程仓库

1.创建远程仓库

在远程代码托管平台 github 中创建一个新仓库

2.添加仓库地址

使用 git remote add origin 仓库地址 地址添加远程仓库

# 添加仓库地址
git remote add origin <仓库地址># 删除仓库地址(比如第一次后面的地址写错了)
git remote remove origin

remote:远程

add:添加

origin:一个变量名(指代后面一长串的地址,即指代这个仓库,可以修改为别的名字)

3.git push

使用 git push 指令将历史区中的所有内容推送到远程仓库中

# 上传内容,推送到 main 分支
git push origin main# 如果当前分支与多个主机存在追踪关系,使用 -u 参数指定一个默认主机,后面可以不加参数使用 git push
git push -u origin main

第二次上传时,因为有刚才的记录,不需要再写 originmain ,会默认传递到 origin 这个地址的 main 分支上,如果需要推送到其他分支,需要加以说明

# 第二次上传
git push

4.git clone

使用 git clone 仓库地址指令将远程仓库中的内容克隆一份到本地,默认克隆main主分支

可以克隆别人的 公开 的仓库,也可以克隆自己的仓库

# 克隆仓库主分支
git clone <仓库地址># 克隆远程指定分支
git clone -b <分支名> <仓库地址>

5.git pull

与远程仓库关联后,如果代码有他人进行更新,可以使用git pull获取最新代码

# 拉取远程 main 最新代码到本地分支 main 并进行合并
git pull origin master
git pull

如果远程和本地都有修改,再pull就会产生冲突,和当前一样手动合并,然后add,commit,push

提交分支git push origin login,再git pull origin login拉取,不会和主分支合并

对于bugfix分支,应该是切到master分支然后merge合并,然后把他删掉。如果已经将bugfix推上去了,可以用

git push origin :bugfix用空覆盖,将远程的bugfix分支删除

用fork把他人的项目整到自己的github上,然后对这个项目修改(clone……),然后pull后点pull request,如果作者批准并且merge就可以上到他的项目里

 

五.VScode集成Git

VSCode内置版本控制机制,并自带对Git和Github的支持,可以安装插件以支持其他控制软件,如SVN等,可以在其中进行可视化 git 管理

 

六. gitignore

在一些项目中,我们不想让本地仓库中所有文件都上传到远程仓库中,因为其中有一些测试文件、配置文件、依赖文件等,内容太大,并且我们只想展示源代码,则可以写一个.gitignore文件,将不需要推送的文件进行自动忽略

git 忽略规则匹配语法:

  • 空行不匹配任何文件,可作为分隔符,可用反斜杠转义
  • 如果本地仓库文件已被跟踪,那么即使在 .gitignore 中设置了忽略,也不起作用
  • .gitignore 文件也会被上传的到远程仓库,所以同一个仓库的人可以使用同一个.gitignore 文件
  • 对于一个项目,可以在最上层设置.gitignore文件,也可以在各个文件夹中设置,所以有根目录和当前目录指令的区别
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
# 开头的是注释# 忽略根目录下的 bin 文件
/bin# 忽略当前路径下的 bin 文件夹
bin/# 忽略当前路径下的.c文件,不忽略子目录中的.c文件
/*.c# 忽略 bin 文件夹下的.c文件,不忽略子目录中.c文件
bin/*.c# 忽略所有.log文件
*.log# 忽略/bin, a/bin, a/b/bin等
**/bin# 忽略a/b, a/x/b, a/x/y/b等
a/**/b# 不忽略 bin 目录下的 run.sh 文件
!/bin/run.sh# 忽略当前路径的 config.php 文件
config.php

相关文章:

  • 【Java程序设计】【C00383】基于(JavaWeb)Springboot的水产养殖系统(有论文)
  • web渗透测试漏洞流程:红队目标信息收集之批量信息收集
  • 计算机网络——数据链路层(数据链路层功能概述)
  • 【智能算法】飞蛾扑火算法(MFO)原理及实现
  • React系列之React版本时间线和主要更新
  • GIS与Python机器学习:开创地质灾害风险评价新纪元
  • 精品凉拌菜系列热卤系列课程
  • HarmonyOS 应用开发案例
  • Python学习之-基础语法
  • 一文搞懂大疆机场kmz航线和图新地球导出的kmz的区别
  • 音视频处理 - 音频概念详解,码率,采样率,位深度,声道,编码
  • XGB-24:使用Scikit-Learn估计器接口
  • Python中lambda函数使用方法
  • Java | 自由落体与反弹距离计算
  • mysql的单表、多表查询和数据类型
  • cookie和session
  • httpie使用详解
  • Java多态
  • Map集合、散列表、红黑树介绍
  • MD5加密原理解析及OC版原理实现
  • Promise面试题2实现异步串行执行
  • SpingCloudBus整合RabbitMQ
  • Unix命令
  • 缓存与缓冲
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 从如何停掉 Promise 链说起
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​虚拟化系列介绍(十)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (12)Hive调优——count distinct去重优化
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • *上位机的定义
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core Swagger 过滤部分Api
  • .NET Core 中插件式开发实现
  • .net framework4与其client profile版本的区别
  • .NET Framework杂记
  • .NET/C# 使用反射注册事件
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .Net小白的大学四年,内含面经
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [CQOI 2011]动态逆序对