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

Git 使用笔记

参考链接:

创建版本库 - Git教程 - 廖雪峰的官方网站

Git使用教程,最详细,最傻瓜,最浅显,真正手把手教 - 知乎

命令使用

cd f:        切换目录到 F 盘

cd gitCxl        切换目录到 gitCxl 文件夹

mkdir gitCxl        创建新文件夹 gitCxl

pwd        打印当前目录

git init        将当前目录设置为git可管理的仓库

git add readme.txt        将 readme.txt 添加到暂存区

git commit -m "提交说明"        把暂存区内的所有文件提交到仓库

常用的 git commit 参数和选项:

  • -m <message> 或 --message=<message>
    • 直接在命令行上指定提交信息(commit message)。这是最常用的参数之一,因为它允许你快速附加一条描述性消息来解释更改。
  • -a 或 --all
    • 自动将所有已跟踪文件的更改(包括那些没有被 git add 明确添加到暂存区的文件)提交。这通常用于快速提交所有更改,但请注意,它不会添加新文件到仓库中。
  • -v 或 --verbose
    • 在提交时显示差异(diff)和提交信息。这有助于在提交前再次确认更改。
  • --amend
    • 修改最近的提交。这允许你更改最近的提交信息或添加更多更改到该提交中,而不是创建一个新的提交。
  • --signoff 或 -s
    • 在提交信息中添加一个签名行(Signed-off-by),这通常用于表示你同意某些开发准则或协议。
  • --no-verify
    • 绕过提交前的钩子(hook)脚本。Git 允许你在提交前运行自定义脚本以检查代码风格、测试等。使用此选项可以跳过这些检查。
  • --allow-empty
    • 允许创建一个空的提交(即没有更改的提交)。这通常用于记录项目状态或触发某些构建/部署流程。
  • --allow-empty-message
    • 允许提交一个空的提交信息(即不附带任何描述)。通常,Git 会阻止这种提交以防止无意义的提交记录。
  • --template=<file>
    • 使用指定的文件作为提交信息的模板。这可以帮助你遵循特定的提交信息格式或包含额外的信息。
  • --author=<author>
    • 指定提交的作者信息。这通常用于修复错误的作者信息或代表其他人提交更改。
  • --date=<date>
    • 指定提交的日期和时间。这可以用于调整提交的时间戳,但通常不建议这样做,因为它可能会混淆项目的历史记录。

git status        查看是否还有文件未提交(状态)

git diff readme.txt        查看readme.txt文件内的改动

git log        查看从近到远的提交日志(历史记录)

git log --pretty=oneline        只查看提交说的注释信息

————

回退到上一个版本:git reset --hard HEAD^

回退到上上个版本:git reset --hard HEAD^^

回退到前100个版本:git reset --hard HEAD~100

注:

--hard会回退到上个版本的已提交状态,

--soft会回退到上个版本的未提交状态,

--mixed会回退到上个版本已添加但未提交的状态。

————

cat readme.txt        查看readme.txt的内容(实验发现是本地文件的内容,不是仓库中文件的内容)

git reflog        获取版本号;

git reset --hard 版本号        回退到版本号对应的那个版本

git diff HEAD -- readme.txt        查看工作区和版本库里面最新版本的区别

初始创建版本库

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

注意:git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

cd 是 "change directory" 的缩写,意为“切换目录”;

mkdir 是 "make directory" 的缩写,用于创建新目录(文件夹)

pwd 是 "print working directory" 的缩写,意为“打印当前工作目录”,用于显示当前的目录

git init 把当前的这个目录变成 git可以管理的仓库

git add readme.txt 版本库gitCxl目录下记事本文件 readme.txt添加到暂存区里面去(没有任何提示,则说明已经添加成功)。

git commit 告诉Git,把文件提交到仓库 (-m后" "里的内容为本次提交的注释说明)。

git commit命令执行成功后会告诉你:

  • 1 file changed:1个文件被改动(我们新添加的readme.txt文件);
  • 2 insertions:插入了两行内容(readme.txt有两行内容)。

git status查看是否还有文件未提交

  • 黄色:说明没有任何文件未提交;
  • 蓝色:告诉我们 readme.txt 文件已被修改,但是未被提交的修改。

git diff readme.txt 查看readme.txt文件到底改了什么内容,如下:

如上可看到,readme.txt文件内容从二行改成 三行 添加了一行22222222内容。

知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件一样的2步(第一步是git add 第二步是:git commit)

输入git add readme.txt

报错1:fatal: not a git repository (or any of the parent directories)

原因:Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的。

报错2:fatal: pathspec 'readme.txt' did not match any files

原因:添加某个文件时,该文件必须在当前目录下存在,用ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。

  • 总结:

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

  1. 使用命令git add <file>,(可反复多次使用,添加多个文件);
  2. 使用命令git commit -m <message>,完成。

版本管理

查看提交日志

git log 查看历史记录,显示从最近到最远的提交日志。

文件修改内容:

初始:(版本一)
Git is a version control system.
Git is free software.

第一次修改后:(版本二)
Git is a version control system.
Git is free software.
22222222
33333333

第二次修改后:(版本三)
Git is a version control system.
Git is free software.
22222222

如果嫌输出的信息太多,则可加上--pretty=oneline参数。

即,使用命令 git log --pretty=oneline 演示:

黄色一大串类似1094adb...的是commit id(版本号)。

和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。commit id以自己的为准。

commit id需要用这么一大串数字表示是因为:

Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。

版本回退

若想把当前的版本回退:

回退到上一个版本:git reset --hard HEAD^

回退到上上个版本:git reset --hard HEAD^^

回退到前100个版本:git reset --hard HEAD~100

注:

--hard会回退到上个版本的已提交状态,

--soft会回退到上个版本的未提交状态,

--mixed会回退到上个版本已添加但未提交的状态。

使用示例:(回退到上一个版本,也就是版本二)

cat readme.txt 查看readme.txt的内容

cat 是“concatenate”的缩写,意为“连接”或“串联”。其原意是用来将文件内容连接并输出到标准输出设备(通常是屏幕),被广泛用于查看文件内容

(此时查看文件内容发现,确实已经回退到上一个版本了。)

此时,再用 git log 查看历史记录信息,看下现在版本库的状态:

发现第二次修改的那个 “删除内容333333,只剩222” 看不到了。

若现在想回退到最新的版本(版本三),也就是刚刚看不到的那个版本,则可通过版本号进行回退。

git reflog 获取版本号

git reset --hard 版本号,用于回退到版本号对应的那个版本

(版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,否则Git可能会找到多个版本号,就无法确定是哪一个了。)

到此,已经又回到了最新那个版本(版本三)。

————

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针。

当你回退版本的时候,Git仅仅是把HEAD从指向(版本三),改为指向(版本二)。

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

  • 总结:
  1. HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  2. 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  3. 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本(利用其版本号)。

工作区和暂存区

工作区:就是在电脑上能看到的目录。比如:

  1. 目录下gitCxl里的文件(.git隐藏目录版本库除外)。
  2. 以后需要再新建的目录文件等等都属于工作区范畴。

版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,而是Git的版本库。

  • 其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。

我们前面说过使用Git提交文件到版本库有两步:

  • 第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
  • 第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。

因为创建Git版本库时,Git自动为我们创建了唯一一个master分支,

所以现在,git commit就是往master分支上提交更改。

可以简单理解为,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改。

  • demo演示如下:

修改 readme.txt 的内容,新增加 addnew.txt 文件。

1、先用命令 git status来查看下状态:

Git非常清楚地告诉我们:

  1. readme.txt被修改了;
  2. test.txt还从来没有被添加过,所以它的状态是Untracked

2、使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态:

add之后,此时两个文件皆处于暂存区中。

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),

然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

3、执行git commit就可以一次性把暂存区的所有修改提交到分支:

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的,如上。

管理修改

Git跟踪并管理的是修改,而非文件。

  • 举个例子:

1、修改内容后使用 git add 添加到暂存区中;

2、在暂存区中 的前提下,再修改内容;

3、使用 git commit 提交到仓库。

也就是说,过程是【第一次修改 -> git add -> 第二次修改 -> git commit】 。

提交后会发现,第二次的修改并没有被提交。

  • 因为:

Git管理的是修改。

当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交

但是,在工作区的第二次修改并没有放入暂存区

所以,git commit只负责把暂存区的修改提交了

也就是第一次的修改被提交了,第二次的修改不会被提交。

拓展

git的命名窗口关闭之后,继续使用之前创建的仓库

无需重新创建。

在你创建仓库文件夹内鼠标右键有个 Git Bash Here打开就好,

或者按住shift加鼠标右键有个 `在此处打开Powershell窗口`,都可以直接 使用git命令。

相关文章:

  • 基于大模型的唇裂手术全流程预测与应用研究报告
  • CLR中的marshal_context 介绍
  • redis分布式锁实现Redisson+redlock中watch dog是如何判断当前线程是否持有锁进行续租的呢?
  • Redis HyperLogLog
  • 希尔伯特变换
  • http header参数的key包含下划线时遇到的一个问题
  • 1. 初识golang微服务-gRPC
  • Vite+微前端Qiankun-状态管理
  • 【GL008】C++ 入门基础(2)之 多态案例
  • centos【rockylinux】安装【supervisor】的注意事项【完整版】
  • Android开发中的Native 调试
  • Go语言的基础类型
  • STM32和PN532 寻卡实验
  • Springboot项目打包成war包
  • 西门子PLC
  • Freeze-Omni:冻结 LLM,实现语音对话
  • 半导体过程控制篇6 设计质量控制SPC
  • ​第十一届传感云和边缘计算系统国际会议
  • python中测试数据管理整理
  • Spring Cloud之负载均衡之LoadBalance
  • 秦洪看盘|浮现新预期,存量资金积极调仓
  • 报告显示2024年全球军费开支增幅达冷战后最大
  • 我国首个核电工业操作系统发布,将在华龙一号新机组全面应用
  • 上海市委常委会传达学习总书记重要讲话精神,研究张江科学城建设等事项
  • 他比李白接地气,比杜甫乐观,比白居易刚毅
  • 持续更新丨伊朗官员:港口爆炸事件已致5人死亡