Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GIT 基本概念以及常用命令

GIT 基本概念以及常用命令

作者头像
跟着飞哥学编程
发布于 2022-11-30 13:53:33
发布于 2022-11-30 13:53:33
50300
代码可运行
举报
运行总次数:0
代码可运行

一些基本概念

分布式版本控制系统

Git 是一种分布式版本控制系统 (Distributed Version Control System DVCS) 。这种系统下,客户端不只是简单地拉取某个版本的文件,而是把整个记录文件版本的数据库(即整个代码仓库)都克隆到本地系统上。这样以来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆工作,实际上都是一次对代码仓库的完整备份。

存储方式

Git 中所有数据在存储前都会计算校验和,然后以校验和来引用某个版本的文件,该校验和是根据文件的内容或目录结构使用 SHA-1 哈希算法计算出来的,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
24b9da6552252987aa493b52f8696cd6d3b00373

Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

三种状态

Git 最重要的地方是有三个区:

  • Git 仓库:这个就是保存各种文件版本的数据库,可以向这个数据库中拉取各个文件版本或把更新后的文件推入数据库进行记录。这是 Git 用来保存项目的元数据和对象数据库的地方,是 Git 最重要的部分,从其他计算机克隆仓库时,拷贝的就是这里的数据。已经推入到这个数据库中的文件对应的状态是 已提交 (commited) 。
  • 暂存区域:这个区域用来存储对当前已修改过并且作了版本标记的文件,在同一段时间内位于暂存区尚未提交的所有文件都属于同一个当前的版本,这些标记使得对应文件被包含在下次提交的快照中。这个区域是一个文件,保存了下次将提交的文件列表信息,一般位于 Git 仓库目录中。在这个区域的文件状态是 已暂存 (staged) 。
  • 工作目录:这个区域就是开发人员写代码的地方,对于已经修改并保存的文件,都会存储在这个区域,等待转移到暂存区并提交。它是对项目的某个版本独立提取出来的内容。那些从 Git 仓库的压缩数据库中提取出来的文件,就是放在这个区域所在的磁盘上供你使用或修改。在这个区域的文件状态是 已修改 (modified) 。

Git 工作三部曲

  1. 在工作目录修改文件;
  2. 将修改的文件对应的文件快照上传到暂存区。
  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

常用命令

配置用户名和密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git config --global user.name "Jack Cheng"
$ git config --global user.email "767833640@qq.com"

如果使用了 --global 选项,则该命令只需要提交一次,无论你以后在系统中执行何种操作,Git 都会使用这种配置。如果你想针对某个特定的项目使用不同的用户名称和邮箱,可以在那个项目目录下运行没有 --global 选项的命令来配置。

检查配置信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git config --list

检查具体某一项的配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git config user.name

获取帮助

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git help config
$ git help push

创建仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git init

这个命令将创建一个名为 .git 的子目录,这个字目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。但是这只是做了一个初始化操作,在当地文件夹的项目里的文件还没有被跟踪。使用 git add 命令来跟踪文件,使用 git commit 命令来提交文件到本地的 Git 仓库中。

检查状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git status

可以查看当前仓库哪些文件处于未跟踪状态,哪些文件已经放入暂存区等待提交。

可以看到 .DS_Store 文件位于 Untracked files 标题下,表示这个文件是新创建的未被跟踪的文件,Git 仓库中不存在这个文件的信息。

可以看到这个时候 .gitignore 文件位于 Changes to be commited 这个标题下面,说明这个文件已经被移入暂存区了,处于已暂存的状态。

把已修改或未跟踪的文件放入暂存区

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git add 文件名

git add 不仅可以跟踪新文件并放到暂存区,还能把已修改的文件也放到暂存区,这是一个多功能命令。放到暂存区的这些文件在下次提交时将会一并提交到 Git 仓库中。因此对于 git add 命令的最好翻译是 “添加内容到下一次的提交中”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git add 文件目录

此时 git add 命令将递归地跟踪该目录下的所有文件,并把目录下的所有文件都放入暂存区。

查看已暂存的文件和当前工作目录中文件的差异

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git diff

git diff 命令可以查看当前工作目录中已修改的文件和暂存区的文件的差异(注意只是和暂存区的差异,不是和上次提交以来的差异,因此如果你把所有已经修改的文件都添加到暂存区后,git diff 将不会返回任何东西)

查看已暂存的文件和上一次提交后的文件的变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git diff --staged 或者
$ git diff --cached

提交处于暂存区的所有文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git commit -m "说明当前做了什么,以后版本回退时可以轻易找到"

注意提交的都是放在暂存区的文件,每一次的提交的版本都会在历史记录中记录下来,以后都可以回到这个版本。(只有 commit 以后的版本可以回退)

回到过去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git log

使用 git log 命令查看历史提交记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git log --pretty=oneline

为了简化查看,可以使用 git log --pretty=oneline 参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git reset --hard commit_id 

找到要回退的版本的前面的 commit_id,然后使用 git reset --hard commit_id 命令来回退到想要的版本,只需要打出 commit_id 的前几个字母即可,Git 会自动查找对应的 id :

可以看到此时项目的最新版本已经回退到了 3950d 的版本。

从过去回到现在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git reflog

回退以后,会发现之前的最新版本 9fd77 已经不在 git log 的目录中了,此时假如我们又想回到之前的最新的版本怎么办?首先使用 git reflog 命令来查找提交 9fd77 时的记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git reset --hard commit_id

可以看到我们在回退前最新一次提交的 commit_id 是 9fd77b1 ,因此我们再用 git reset --hard 9fd77b1 来进入到回退前的最新版本:

因此,我们也就从过去回到现在了。

有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:

👉 git commit --amend

例如,你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

一些 trick

忽略文件

有时候我们会有一些文件不需要纳入 Git 的管理,比如上面的 .DS_Store ,此时就应该编写 .gitignore 文件来列出要 Git 仓库忽略的文件模式。该文件的格式规范如下:

以 # 开头的行为 Git 的注释。

使用 / 放在文件名的开头可以防止递归地忽略所有非当前目录中的该文件。比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TODO

会忽略 Git 仓库中所有目录下的 TODO 文件,但如果只希望 Git 忽略当前目录下的 TODO 文件,而不要忽略其它目录下的 TODO 文件,则应该写成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/TODO

使用 / 放在文件名的末尾表明这个文件是一个目录,Git 将会忽略这个目录下的所有文件。

如果希望 Git 只记录某一个特定的文件,而忽略除了这个文件以外的所有文件,可以在这个文件名前面使用 ! 取反。但是这种功能一般是用于以下情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 忽略所有的 .a 文件

*.a


# 但是所有的 lib.a 文件不能被忽略

!lib.a

指定文件的格式一般要使用正则表达式:

  • * 匹配 0 个或多个任意字符;
  • [abc] 可以匹配任何一个在方框号中的字符(在这个例子中是要么匹配一个a,要么匹配一个b,要么匹配一个c);
  • ? 只匹配一个任意字符;
  • [0-9] 表示匹配在 0 到 9 范围内的所有数字。
  • 使用两个星号 ** 表示匹配任意的中间目录,比如 learn/**/git 可以匹配 learn/git 、learn/no/git 或者 learn/no/python/git 。

看一个 .gitignore 文件的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 忽略所有以 .a 结尾的文件
*.a

# 不能忽略所有 lib.a 文件
!lib.a

# 仅仅忽略当前目录下的 TODO 文件
/TODO

# 忽略 build 目录下的所有文件
build/

# 仅仅忽略 doc 一个目录下的所有 .txt 文件
doc/*.txt

# 忽略 doc 目录下(包括子目录)的所有 .pdf 文件
doc/**/*.pdf

移除文件

最常见的情况是,在 .gitignore 文件中未列出对应的文件,有时为了贪求效率,使用 git add . 把所有文件都放到暂存区域,包括把一些不希望加入 Git 版本管理的日志文件等也放进去了,这个时候我们希望可以从暂存区域中删除这些不希望被管理的文件,但是使这些文件仍然被存放在工作目录上,而不被 Git 继续跟踪。此时可以使用 git rm --cached filename 命令:

这样就可以把误添加的文件从暂存区中移除,而防止下一次 commit 时加入到 Git 仓库中去。

还有一种情况就是,我希望删除的文件已经 commit 或者 add 了,即已经被跟踪了,但我希望完全删除这个文件,即把工作目录中的这个文件也删了,这时我们就可以先在本地项目目录中删除这个文件,然后再使用 git rm filename 命令把该文件从已跟踪的文件清单中一并删除:

这个是文件已经 add 但没有 commit 的情况,使用 git rm 命令就直接清空了,如果文件之前有过 commit ,而你又把想删除的文件从工作目录中删除了:

可以看到删除文件的操作记录在 Changes not staged for commit 标题下, 意味着你需要把这个删除的操作再提交一遍,使得 Git 仓库知道这个文件已经删除了,不应该再被跟踪了。

移动文件

如果要在 Git 中对某些文件进行重命名,可以使用 git mv original_name target_name 命令:

执行这个命令后,可以看到在工作目录中的 test.cpp 也被重命名为 main.cpp 了,这个时候只要提交这次重命名操作就可以了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Git常用命令总结
Git在初次使用之前,应该进行一些设置。主要是设置user.name和user.email
zy010101
2022/05/05
2660
git 学习笔记
问题:上传txt文件中文为乱码,但是md文件html 文件都正常 解决: 尝试一: 进入git安装目录找到etc文件,按网上说的 etc\gitconfig文件未找到,etc\git-completion.bash文件也未找到,etc\inputrc到是有,不过还是放弃了此方案。 尝试二: 不使用window的文本编辑器,使用其他编辑器,例如notepad++,atom等,问题解决。 问题: git客户端ls显示文件列表为乱码,对话框头部中文显示问号 解决:git输入框右键-选择options-选择text
吴裕超
2018/03/01
9590
Git基础和入门
Git 不按照SVN那样对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
李红
2019/07/02
5740
Git基础和入门
版本控制器Git的相关配置和常用命令【操作】
目录 1、环境配置 1.1 下载与安装  1.2 基本配置 1.2.1 打开Git Bash 1.2.2 设置用户信息 1.2.3 为常用指令配置别名(可选) 1.2.4 解决GitBash乱码问题 2 、获取本地仓库 3、基础操作指令 3.1 查看修改的状态(status)【重要】 3.2 添加工作区到暂存区(add)【重要】 3.3 提交暂存区到本地仓库(commit)【重要】 3.4、查看提交日志(log)【重要】 3.5、版本回退 3.6、添加文件至忽略列表 练习 4、分支 4.1 查看本地分支 4
叫我阿杰好了
2022/11/07
4020
版本控制器Git的相关配置和常用命令【操作】
Git系列之查看状态
本节来说下 Git 的状态,在日常开发中我们每天都在提交自己的文件到仓库中,有时会存在我们写了很多的功能,都是提交到了缓存区,而没有想仓库内提交,或者我们新增了一个仓库内没有文件,忘记了提交,那么我们如何来查看当前工作去内有哪些文件被更改了,需要做进一步的操作呢?
申霖
2019/12/27
1.5K0
Git系列之查看状态
2.2 Git 基础 - 记录每次更新到仓库
现在我们手上有了一个真实项目的 Git 仓库,并从这个仓库中取出了所有文件的工作拷贝。 接下来,对这些文件做些修改,在完成了一个阶段的目标之后,提交本次更新到仓库。
shaonbean
2019/05/26
7080
git 常用命令
git status 查看工作区和暂缓区状态 git add 将工作区放入暂缓区 git commit 将暂缓区放入 版本区 git add 把修改过的文件全部提交到暂缓区 git commit -m “提交时写备注” 不弹文档 git commit -a -m “提交时写备注” 直接把工作区提交到版本区 git log 查看提交的历史命令 git clone +地址 克隆 进入项目 git config –global user.name “名字” git config –global user.emai
用户1197315
2018/01/22
7270
Git技术干货!工作中Git的使用实践和常用命令合集!
从本质上来讲 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。
洋仔聊编程
2020/08/02
6370
Git常见命令集合
git config --global user.email johndoe@example.com
申霖
2019/12/27
6730
Git常见命令集合
git常用命令
在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.
Rattenking
2022/05/11
5080
《Pro Git》 读书笔记1
git config 1.config file 有以下几种 Config file location --global use global config file --system use system config file --local use repository config file -f, --file <file> use given config file -
elson
2020/01/02
5980
git初入门(二):文件操作
如果我们提交过后发现有个文件改错了,或者只是想修改提交说明,这时可以对相应文件做出修改,将修改过的文件通过 "git add" 添加到暂存区,然后执行以下命令:
传说之下的花儿
2023/09/16
4780
git初入门(二):文件操作
git常用命令
git commit -a 将所有跟踪过的文件提交。已跟踪的文件是指添加到暂存区并修改过的文件,新添加但并未添加到暂存区的文件不会被提交。
乐百川
2022/05/05
4460
Git——常用命令总结
思索
2024/08/14
1420
Git常用命令汇总篇(附使用详细介绍)
众所周知,Git是一个开源的分布式版本控制系统,用于跟踪和管理源代码的变更。而Git有着大量的常用命令。
Masutaa大师
2023/08/09
6830
Git常用命令汇总篇(附使用详细介绍)
Git常用命令总结
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/09/25
6050
Git 最全教程
其它大部分系统以文件变更列表的方式存储信息,这类系统(CVS、Subversion等)将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (基于差异的版本控制)。
Jasonangel
2022/10/25
1.5K0
Git 最全教程
3. Git 基本操作
可以通过git config rexx.aa.bb cc, git config aa.bb.cc 'dd' 进行设置。 每一条命令都在.git/config文件中添加一行。如果该远程部分不存在,那么你发出的第一条命令将在该文件中为它创建。
acc8226
2022/05/17
5350
3. Git 基本操作
Git 常用命令
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。常用的是以下 6 个命令:
Yorkyu
2022/03/22
5510
Git 常用命令
相关推荐
Git常用命令总结
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验