git:安装+命令行(创建仓库+版本回退+撤销/删除操作)
git安装
安装系统:centos7.9
一、yum安装git
# 安装
yum install -y git
# 查看版本
git version
# git version 1.8.3.1
二、源码安装最新版本git
1.下载最新版本的git地址:https://mirrors.edge.kernel.org/pub/software/scm/git/
#wget -O /root/git-2.24.4.tar.gz https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.24.4.tar.gz
2.编译安装、配置环境变量
# 安装依赖
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
# 解压,并切换到解压目录
tar -zxf /tmp/git-2.24.4.tar.gz -C /tmp/
cd /tmp/git-2.24.4
# 预编译,检验相关依赖,设置安装路径
./configure --prefix=/usr/local/git
# 编译安装
make && make install
3.配置环境变量
# 删除已有的 git(即之前可能Yum下载过的)
yum remove git
# 配置环境变量
vim /etc/profile
# GIT_HOME
GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin
# 刷新
source /etc/profile
#验证
git --version
git version 1.8.3.1
安装系统:Windows
网址:Git - Downloading Package (git-scm.com)
然后一步一步点击,默认安装就可以了。安装好后,在桌面鼠标右键会出现两个新的选择(一个是Git bash、一个是Git GUI),
选择Git GUI后,会出现一个bash界面,其中的常用命令就是bash命令+git命令,界面如图。
使用方式都一样,底层都是Git命令来实现。
Git命令使用
一、使用用户和邮箱标识。
1.在Git软件安装完毕后,需要做的第一步就是需要以"用户名"和"邮箱"来做一个标识,因为git是一个分布式版本控制系统,需要以此来区分。
其中:
这时引出的命令 git config global/system/local '用户' '邮箱' --global 使用全局配置文件(用户级别,即该机器上的所有git仓库都会使用这个配置,优先级次之) --system 使用系统配置文件(系统级别,优先级最低) --local 使用本地仓库配置文件(仓库级别,优先级最高)
实例:
--global全局(不用进入到某个仓库再执行,其配置文件在"~/.gitconfig")
#git config --global user.name ""
#git config --global user.email ""
--local(进入指定的仓库后,执行该命令即可,其对应的标识会记录到当前仓库的".git/config"文件中)
#cd 指定仓库目录下
#git config user.name "用户名"
#git config user.email "邮箱"
其中
git 仓库级别(local)对应的配置文件是当前仓库下的.git/config 。
git 用户级别(golbal)对应的配置文件是用户宿主目录下的~/.gitconfig。
git系统级别(system)对应的配置文件是git安装目录下的 /etc/gitconfig。
对于git来说,配置文件的权重是仓库>全局>系统。Git会使用这一系列的配置文件来存储你定义的偏好,它首先会查找/etc/gitconfig文件(系统级),该文件含有对系统上所有用户及他们所拥有的仓库都生效的配置值。接下来Git会查找每个用户的~/.gitconfig文件(全局级)。最后Git会查找由用户定义的各个库中Git目录下的配置文件.git/config(仓库级),该文件中的值只对当前所属仓库有效。
二、创建git版本仓库和使用。
关git版本仓库:版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
创建版本仓库(git init)
1.创建仓库的目录 #mkdir /d/Git/test 2.进入该目录下,执行git init将其变成git可以管理的版本仓库 #cd /d/Git/test #git init
建立git版本仓库
这时候你当前test目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。如图
首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。
三、关于git的一些常用命令概图及讲解:
( 1 ):版本仓库的建立和版本的提交
下列涉及到的命令
$git init
$git add
$git commit
$git status (主要是查看暂存区,同名文件只保留最新的状态,即新git add会覆盖之前的git add状态)
$git diff
1.首先,建立一个文件"num.txt"
$echo "1231414" >/d/Git/test/num.txt (注意,这样添加内容,在git add时会提示替换些格式)
2.将num.txt文件添加到暂存区。
$git add num.txt
翻译:警告:在num.txt中,LF将被CRLF替换;该文件将在您的工作目录中有它原来的行尾;
$cat num.txt
$git add num.txt (再执行一遍,若没有任何提示,说明添加成功)
3.查看git状态
$git status
4.把num.txt文件提交到本地仓库
$git commit -m 'num.txt版本1'
5.提交后再查看状态"git status",查看是否还有未提交的文件
6.将"版本1"文件上传到本地仓库后,在num.txt原文件上进行修改。
7.修改后,在还未添加到暂存区时,查看此刻状态(该文件是modfied,已修改状态),但还未提交。
8.查看这里两个文件的不同之处(git diff)
关于git diff git diff <file> # 比较当前文件和暂存区文件差异 git diff git diff <id1><id1><id2> # 比较两次提交之间的差异 git diff <branch1> <branch2> # 在两个分支之间比较 git diff --staged # 比较暂存区和版本库差异 git diff --cached # 比较暂存区和版本库差异 git diff --stat # 仅仅比较统计信息
$git diff num.txt
9.将新修改的num.txt再次提交到本地仓库中。(注意:不管是加到暂存区,还是本地仓库,原文件都依然存在)
$git add num.txt
$git commit -m 'num.txt版本2'
( 2 ):版本回退
下列版本回退涉及到的命令
$git log $git reset --hard $git reflog
1.将num.txt文件再次进行修改,为了方便版本回退时进行对比,版本回退回退的是已经提交(git commit)到本地仓库的版本。
显示提交日志信息:git log (git log 命令需要在本地仓库目录下执行),若不在"git init"生成的目录下执行,则会报错
使用$git log ,显示详细信息
使用$git log --pretty=oneline,只显示"哈希值"和其提交时填写的"提交注释"
关于git log
例:可能经常用到的 显示最近两周的更改文件gitk。 “--”是必要的,以避免与名为gitk的分支混淆 $ git log --since="2 weeks ago" -- gitk
只显示"哈希值"和其对应提交时的"提交注释"
$git log –pretty=oneline --since,--affter - 仅显示指定时间之后的提交(不包含当前日期) --until,--before - 仅显示指定时间之前的提交(包含当前日期) $ git log --before={3,weeks,ago} --after={2018-04-18}
版本回退
回退所有内容到当前版本:$git reset --hard HEAD
回退所有内容到上一个版本:$git reset --hard HEAD^ 那么如果要所有内容回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推,即$git reset --hard HEAD^
那如果要回退到前100个版本的话,使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:$git reset --hard HEAD~100 即可。
回退到指定版本:$git reset --hard "版本号"
回退hello.php文件的版本到上一个版本:$git reset --hard HEAD^ hello.php
git reset --hard origin/master # 将本地的状态回退到和远程的一样
HEAD 说明:
-
HEAD 表示当前版本
-
HEAD^ 上一个版本
-
HEAD^^ 上上一个版本
-
HEAD^^^ 上上上一个版本
-
以此类推...
由上可知,当前最新的git commit版本为"num.txt版本2"。如图
所有的历史信息显示如上,最新版本为"num.txt版本2",这也是当前版本;切不可错误理解为当前目录下的未提交过的版本为最新版本。
当回退到上一个版本时,实际上就是回退到"num.txt版本1"。如图:版本1内容
关于版本回退: 回退理解误区:在仓库目录下修改文件后,发现修改文件错误,想"回退"到未修改之前的状态,于是使用git reset --hard HEAD^版本回退。
回退后发现,回退的是未修改之前状态的上一个版本。(即在实例中:"num.txt版本2"提交后,未提交新的版本。
又继续在num.txt文件上进行修改,然后发现想回退到"num.txt版本2",于是使用了git reset --hard HEAD^,使用后发现竟然回退到了"num.txt版本1"。
实际:在git commit提交到本地仓库的版本中,距离当前时间最近的一个版本为最新版本,版本回退是以最新版本为基础开始回退。
即回退到上一个版本,实际上是回退到了最新版本的上一个版本,也就是代码仓库中,版本从"num.txt版本2"回退到了"num.txt版本1"。
如果是要回退到当前版本的话,即使用$git reset --hard HEAD。即回退到"num.版本2"。
回退后再查看历史记录信息$git log
如果想再次回退到最新的版本呢?即回退到"num.txt版本2"。
$git reflog 查看所有的历史版本记录(之后又测试玩提交了"版本3333"。)
回退到版本注释为"num.txt版本2"的版本
$git reset --hard "版本号"
$git reset --hard c73f9f1,如图
可以看到,已经恢复到"num.txt版本2"了。
( 3 ):撤销和删除
撤销
即当文件被修改,还未被commit提交到版本仓库时,可以使用该撤销命令来撤销错误的文件内容。
如,当前为"num.txt版本2"的内容,然后向其中添加内容后,如图
然后查看状态,观看画圈的部分"放弃工作目录中的更改"
使用命令$git restore num.txt = 或使用命令$git checkout -- num.txt (这两个命令效果一样)
注意:$git checkout -- num.txt中,必须添加"--",如果没有 -- 的话,那么命令变成创建分支了。
注意:该文件目前未$git add num.txt,即还未添加到暂存区。
若添加到暂存区后,还未commit到仓库,又在原文基础上进行了修改,想要撤销到"添加到暂存区"后的状态。(同理,使用如上两个命令即可恢复)。即可以这么理解,撤销动作,撤销后恢复到的状态为"添加到暂存区后的状态";若未添加到暂存区,则恢复到最新commit版本后的状态。
删除
关于删除操作,一般情况下删除目录文件的话"rm -rf 文件",即可。此刻执行"$git status"发现有红色字体"deleted:文件名"
此时若想恢复则使用"$git checkout -- 文件"或"$git restore 文件",这里有两种情况:
- 情况一:若删除文件时,未将该文件add到暂存区,那么恢复只能从版本库中恢复之前的版本(即若有修改,修改无法恢复)。
- 情况二:若删除文件前,将该文件add到暂存区,那么恢复后的文件是从暂存区中取出的,状态是删除前的文件(若有修改,修改保留)。
若想彻底删除文件,则在执行"rm -rf 文件"命令后,还需要再执行"git add 文件"此刻"$git status"后发现"delted:文件名"字体会变为绿色,此时再执行"$git checkout -- 文件"或"$git restore 文件",则会报错文件不存在,此时已经无法恢复,只可以从暂存区git commit到本地仓库。
简单理解删除恢复:当删除文件后,若$git status 发现"deleted:文件名"是红色的,则可以恢复(但要区分情况);若"deleted:文件名"是绿色的,则无法恢复,只能通过回退版本来减少损失。
总结:使用删除命令前,为了保证安全,最好先将文件git add到暂存区。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统