git 常用操作

news2025/4/3 15:37:17

        Git 是一个分布式版本控制系统,用于项目开发中的版本控制。从本质上来讲Git是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。

         Git的核心部分是一个简单的键值对数据库(key-value data store)。 你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索(retrieve)该内容。Git管理的项目工作目录下的每一个文件只有这两种状态:已跟踪或未跟踪。

  • 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。

  • 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。

  • 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

        Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,Git会保存一个提交对象(commit object)。该提交对象会包含一个指向暂存内容快照的指针。不仅如此,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。

        Git将项目的存储分为4部分,每部分有自己作用,见下图所示:

0.创建Git仓库

$git init # 命令用于在目录中创建新的 Git 仓库。

在目录中执行 git init 就可以创建一个 Git 仓库了。

例如我们在当前目录下创建一个名为 runoob 的项目:
$ mkdir runoob
$ cd runoob/
$ git init
Initialized empty Git repository in /Users/tianqixin/www/runoob/.git/
# 初始化空 Git 仓库完毕。

# 现在你可以看到在你的项目中生成了 .git 这个子目录,这就是你的 Git 仓库了,所有有关你的此项目的快照数据都存放在这里。

1.配置用户名

要在此计算机开始使用Git,必须输入已经认证的用户名。用户名和电子邮件地址应与你在GitLab中使用的一致。

# 1.In your shell, add your user name:
$ git config --global user.name "your_username"

# 2.Add your email address:
$ git config --global user.email "your_email_address@example.com"

# 3.我们要求 Git 版本 1.9.5 以上,这一条设置的 push 方式,只是建议,一般可不设置
$ git config --global push.default simple  

# 4.让Git不要管Windows/Unix换行符转换的事
$ git config --global core.autocrlf false    

# 5.设置大小写敏感 
$ git config --global core.ignorecase false   

# 6. To check the configuration, run:
$ git config --global --list

# --global选项告诉Git,无论您在系统上做什么,都要始终使用这些信息。
# 如果省略--global或use--local,则配置仅适用于当前存储库 current repository

2.建立连接(credential)

配置SSH KEY
配置SSH Key主要是为了允许您的计算机和Code代码平台之间建立安全连接。

启动的Git中输入如下命令来生成ssh key:

$ ssh-keygen -t rsa -C "电子邮箱地址"

这个指令会要求你提供一个位置和文件名去存放键值对和密码,你可以点击Enter键去使用默认值。

用以下命令获取你生成的公钥

$ cat ~/.ssh/id_rsa.pub

复制这个公钥放到你的个人设置中的SSH Keys下,请完整拷贝从ssh-开始直到你的用户名和主机名为止的内容。
如果打算拷贝你的公钥到你的粘贴板下,请参考你的操作系统使用以下的命令:

$ clip < ~/.ssh/id_rsa.pub # windows

打开Code平台SSH KEY设置页面,直接将公钥粘贴到输入框中

3. 克隆代码

# 默认克隆项目的主分支,其他分支并没有被克隆到本地
$ git clone https://gitlab.com/gitlab-tests/sample-project.git

4. 查看分支

$ git branch #查看本地分支
$ git branch -r #查看远程分支
$ git branch -a #查看所有分支
$ git branch -vv #查看本地分支及追踪的分支

5. 创建分支

$ git branch newbranch #创建本地分支newbranch

$ git checkout -b newbranch  #创建并切换到新的分支.
这个命令是将git branch newbranch和git checkout newbranch合在一起的结果。

#将本地分支push, 就创建了远程分支
#创建本地分支(远程分支对应的分支)并切换到新建的本地分支
$ git checkout -b 本地分支名 origin/远程分支名 

# checkout远程的dev分支,本地创建名为dev分支,并切换到本地的dev分支
$ git checkout -b dev origin/dev #(举例)

# 1.先拉取一个指定仓库中主分支到本地同名分支
$ git clone git@github.com:geometryolife/gld.git
# 进入项目的根目录
cd gld
# 默认克隆项目的主分支,其他分支并没有被克隆到本地
# 2.现在想再次拉取一个分支emm
$ git branch -a  #查看所有分支
# 3. 拉取另外一个分支到本地,同时切换到emm 分支
$ git checkout -b emm origin/emm
# 再次查看,emm 分支已经被拉取下来了,同时也切换到了 emm 分支
git branch -a

6. 切换分支

#切换本地分支
$ git checkout  branchname 

# 切换远程分支
# 该命令可以将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来。
# 并切换到新建的本地分支中。
$ git checkout -b dev origin/dev 


# 放弃所有工作区的修改
$ git status  # 比如查看工作区有两个被修改的文件
$ git checkout .  # 执行了命令后,放弃了所有的工作区的修改


# 放弃对指定文件的修改, 从缓存区里拉取的版本【不是工作区】还原本地无意修改的版本
$ git checkout –- filename


# 放弃工作区和暂存区的所有修改
$ git checkout -f

7.删除分支

$ git branch -d branchName #删除本地分支 branchName 
$ git push origin --delete branchName  #删除远程分支 branchName 

8.合并分支

#合并前要先切回要并入的分支,以下表示要把dev分支合并入master分支
$ git checkout master #切换到master分支
$ git merge dev #将dev合并到master分支

9.提交换行注释

#注释可以通过单引号来换行
$ git commit -m '
> 1.aaaaa
> 2.bbbb
'
$ git merge dev #将dev合并到master分支
$ git commit --amend #查看到刚刚的log信息为

10.添加和提交代码

#第一步:查看当前的git仓库状态
$ git status
#第二步:更新全部,你可以提出更改(把它们添加到暂存区)
$ git add *
#第三步:添加注释,使用如下命令以实际提交改动
# 你的改动已经提交到了 HEAD,但是还没到你的远端仓库。
$ git commit -m "更新说明"
#第四步:先git pull --rebase,拉取当前分支最新代码
# 建议使用rebase操作会更好一点,这样可以线性的看到每一次提交,并且没有增加提交节点。
# 不加--rebase 特定情况下会出现冲突
$ git pull --rebase
#第五步:push到远程master分支上,执行如下命令以将这些改动提交到远端仓库:
git push origin master

#git push origin master的意思就是上传本地当前分支代码到远程master分支。
#git push 是上传本地所有分支代码到远程对应的分支上

# 关于提交的其它说明
git push -u origin master #如远程仓库为空需加上-u这个参数
git push origin master

加了参数-u后,以后即可直接用git push代替git push origin master
意思就是我们不用在后面加 origin + 要提交的分支名 ,直接 git push 即可

但是前提是第一次提交需要加 -u参数后, 后面的提交就直接可以 git push

如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:

git push --force origin master
  • git pull = git fetch + git merge FETCH_HEAD # merge 多用户提交时可能会导致冲突
  • git pull --rebase =  git fetch + git rebase FETCH_HEAD    #无冲突的问题
  • git add . 会把本地所有untrack的文件都加入暂存区,并且会根据.gitignore做过滤,
  • 但是git add * 会忽略.gitignore把任何文件都加入

11.查看log

$ git log #查看提交历史记录
$ git log --oneline #以精简模式显示
$ git log --pretty=oneline #以精简模式显示,即一个压缩后的每一条提交记录只占一行的输出
$ git log --author=bob #只看某一个人bob的提交记录
$ git log --name-status # 看看哪些文件改变了
$ git log --help #log更多的信息

12.撤销操作

$ git status #查看add 中的文件 
$ git reset HEAD #默认是上一次add 里面的全部撤销了 
$ git reset HEAD XXX.js #对某个文件进行撤销了

13.查看remote地址,远程分支,还有本地分支与之对应的关系等信息

$ git remote show origin

14.在本地删除远程不存在的分支

$ git remote prune origin

15.其它

#查看已安装的git版本
$ git --version 

# 要查看本地未提交的更改与已拉取的最新版本之间的差异,比如手动更改了拉取的代码,但未提交更新
$ git diff


# 替换本地改动,
# 假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动
$ git checkout -- <filename>
# 此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。
# 已添加到暂存区的改动以及新文件都不会受到影响。

# 假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
$ git fetch origin #获取远程服务器的最新历史版本
$ git reset --hard origin/master # 本地分支指向它

# 如果想要删除仓库某个文件夹
# 第1步:先pull远程代码,保持同步
$ git pull --rebase

# 第2步:删除单个文件或文件夹
$ git rm 文件名 --cached  #删除文件
$ git rm -r 文件夹名 --cached # 删除文件夹

# 第3步:提交修改
$ git commit -m "备注信息"

# 第4步:推送
git push origin master

16.异常提交处理

git 执行git pull –rebase报错误如下:

error: Cannot pull with rebase: You have unstaged changes.
error: Additionally, your index contains uncommitted changes.

原因:如果有未提交的更改,是不能git pull的

解决:
先执行 git stash
再执行  git pull --rebase
最后再执行 git stash pop

参考资料

git 官方文档

git 中文文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XML配置文件、用来约束XML文档:DTD、Schema(类型更多)

上一章properties作为配置文件的内容好像还没讲&#xff1f; properties相对于XML的缺点&#xff1a;如果要运行多个方法&#xff0c;只能在properties配置文件里等号后面加逗号&#xff08;或指定符号&#xff09;隔开&#xff0c;然后再加值&#xff0c;这样累加下去会导致阅…

基于分布式数据库集群的大数据职位信息统计

目录 任务一&#xff1a; MongoDB 分布式集群关键配置信息截图&#xff08;启动参数文件、初始化参数文件、启动命令等&#xff09; ch0的参数文件配置&#xff1a; ​编辑 ch1的参数文件配置&#xff1a; ​编辑chconfig的参数文件配置&#xff1a; router的参数文件配置…

SpringSecurity整合Oauth2.0

SpringSecurity整合Oauth2.0一、概述与原理1.1 、OAuth2.0 是什么&#xff1f;1.2、OAuth2.0中角色解释1.3、OAuth2.0的4中授权模式1.3.1、授权码模式&#xff08;重点&#xff09;1.3.1.1 原理1.3.1.2 代码1.3.2、密码模式&#xff08;重点&#xff09;1.3.2.1 原理1.3.2.2 代…

开发运维(DevOps)自动化运维与持续交付企业级实战

一、网站部署流程 1、传统网站部署流程 传统的网站部署,大家在运维过程中,网站部署是运维的工作之一,网站部署的流程大致分为: 需求分析—原型设计—开发代码—提交测试—内网部署—确认上线—备份数据—外网更新-最终测试,如果发现外网部署的代码有异常,需要及时回滚…

[附源码]JAVA毕业设计心理健康系统(系统+LW)

[附源码]JAVA毕业设计心理健康系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

网络安全观察报告恶意软件观察

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

使用分页导入的方式把大量数据从mysql导入es

1、首先要有分页功能的代码 如何使用mybatis-plus实现分页&#xff0c;可参考 http://t.csdn.cn/ddnlk 2、要创建feign远程调用模块 可以参考 http://t.csdn.cn/gshFw 3、在feign模块中声明远程调用接口 1.在feign模块中创建一个接口&#xff0c;名字可以是你要调用的服务名&…

指定区域内实现多尺度、多维度2D图形随机填充(如圆、椭圆、多边形)之MATLAB实现

N久之前&#xff0c;咱在公众号中分享了如何用MATLAB实现在指定区域内随机填充圆&#xff0c;并将相关功能封装一个名为randCircle函数里面&#xff0c;其可实现的功能如下&#xff1a; (1) 设定是否允许填充圆相交、相切或独立存在 (2) 指定区域内圆的生成个数 (3) 设定是否允…

[附源码]计算机毕业设计基于vuejs的文创产品销售平台appSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【面试题】说说 Promise是什么?如何使用

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前言 本文主要介绍和总结Promise的作用、使用方式和其对应的一些方法,供大家参考学习&#xff0c;如有写的不准确的地方欢迎大家指出&a…

Android 使用 jni Demo示例

Android 使用 jni Demo示例简介1. NDK的介绍1.1 NDK 简介1.2 NDK 特点2. JNI介绍2.1 JNI 简介2.2 为什么要有 JNI&#xff1f;3. NDK 与 JNI 的关系NDK下载及环境配置1. 使用Android studio SDK Manager下载2.配置NDK2.1 配置环境变量2.2 Android studio配置NDK示例Demo流程1.版…

RabbitMQ - 安装和使用

RabbitMQ - 安装和使用一. 安装二. RabbitMQ的简单使用2.1 创建交换机2.1.1 交换机类型2.1.2 持久化方式2.2 创建队列2.3 绑定交换机和队列2.4 SpringBoot整合2.5 另外一种监听写法一. 安装 一键安装&#xff1a; docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 …

rtl8221b+mcu,2.5g光纤收发器的开发备份

1、rtl8221b是一款2.5g的光电转换的phy 系统的构建如下 为了省成本&#xff0c;不用mac来对接其中的gmii接口直接接光模块 2、mdio和mdc由mcu的gpio来模拟&#xff0c;在csdn上有很多的文章来参考 mdio的参数如下 不想看英文可以参考下面的文章 MDIO(clause 22 与 clause 4…

Java基础之《netty(10)—Reactor三种模式》

一、单Reactor单线程模式 1、工作原理图 2、方案说明 &#xff08;1&#xff09;Select是前面I/O复用模型介绍的标准网络编程API&#xff0c;可以实现应用程序通过一个阻塞对象监听多路连接请求。 &#xff08;2&#xff09;Reactor对象通过Select监控客户端请求事件&#xf…

一元钱注册 chatGPT账号

文章目录打开 openai chatgpt 主页注册 chatGPT 账号找境外的电话号码激活账号查看服务价格账号注册充值成功参考视频 打开 openai chatgpt 主页 打开之前首先登录 vpn。但是使用 vpn 有可能还是会被告知 当前国家没有开放服务个人建议&#xff1a; 使用美国的 ip 地址我使用…

PIN TO PIN替代GM8775C|DSI转LVDS转换方案芯片CS5518|CS5518完全替代GM8775C

GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS 功能&#xff0c;MIPI 支持 1/2/3/4 通道可选&#xff0c;最大支持 4Gbps 速率。LVDS 时钟频率最高 154MHz&#xff0c; 最大支持视频格式为 FULL HD&#xff08;1920 x 1200&#xff09; CS551…

网络安全观察报告

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

测评报告:文件导入哪家强?

文件导入哪家强&#xff1f; 引子 最近业务上遇到一个场景&#xff0c;需要将一个/多个文本文件导入到与其结构对应的表中。功能需求比较简单&#xff0c;大部分的关系数据库基本都支持这个功能。基于上面的场景把手头上的几款开源数据库和国产数据库的文件导入功能进行了性能对…

【通信基础】TTL、RS232、RS485

TTL1、TTL简介RS2321、RS232基本概念2、DB9串口定义及接线参考3、RS232经典电路4、特点RS4851、RS485简介2、特点3、传输距离4、经典电路5、传输差分电平信号TTL 1、TTL简介 TTL的英文全称是Transisor-Transisor Logic. 翻译过来就是晶体管与晶体管之间的逻辑电路。 TTL电平信…

78.【大二实训--《宿舍管理系统》】

大二实训--《宿舍管理系统》1.在JSP中&#xff0c;如果想要获取后端传过来的数据2.在Dao层我们用数据库的属性给实体类赋值的时候3.在一个Servlet中&#xff0c;如果想要使用多个Service4.字符串yyyy-mm-dd格式转换为Date型5.在设置实体类的时候&#xff0c;属性名开头一定要小…