对Git工作流程的理解及其基本命令

本文介绍了Git的基本工作原理,包括其如何保存项目状态、管理文件版本等。详细解释了Git中的对象类型及其作用,以及如何通过命令进行克隆、提交、合并等操作。此外还提供了Git常用命令的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 Git工作原理
在 Git 中保存项目状态时,它会对当时的全部文件制作一个快照并保存这个快照的索引。索引是Git 数据库中保存的信息的哈希值,而不是文件名。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个指针指向之前存储的文件。
Git中有三种对象,数据对象、树对象和提交对象。数据对象中存了文件的内容,树对象存了文件名并将多个文件组织到了一起,提交对象中保存了提交信息(谁在什么时刻为什么保存了这些快照)
单个提交对象在仓库中的数据结构
单个提交对象在仓库中的数据结构
多个提交对象之间的链接关系
多个提交对象之间的链接关系
分支的工作原理,Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。它在每次提交的时候都会自动向前移动。
Objects目录存储所有数据内容,refs目录存储指向数据(分支)的提交对象的指针,HEAD文件指向当前分支,index文件保存了暂存区域信息。

二、 工作流程
git管理下的文件状态有三种:已提交(未修改,unmodified)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
在这里插入图片描述

由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
在这里插入图片描述

Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供用户使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。
基本的 Git 工作流程如下:

  1. 克隆远程仓库的代码;
  2. 在工作目录中修改文件;
  3. 暂存文件,将文件的快照放入暂存区域;
  4. 提交更新,找到暂存区域的文件,将快照永久性存储到本地仓库目录;
  5. 将本地仓库的修改同步到远程仓库。

三、 基本命令

  1. 基本操作
    git clone [url] 克隆仓库

git init 在当前目录中初始化仓库
-bare 创建一个可以被克隆的仓库

git add 跟踪新文件和暂存已修改文件
git add命令的主要含义是,添加内容到下一次提交中。我的理解是,当使用git add命令操作一个文件时,意思是,这个文件已经做好准备被提交了(也就是被放到了暂存区)。

git status 检查当前文件状态
其输出举例如下:
在这里插入图片描述

git diff 查看已暂存和未暂存的修改
–cached 可以比较暂存区和仓库快照之间的差异

git commit 提交更新
直接执行该命令时,会启动文本编辑器以便输入本次提交的说明,默认的提交消息包含一些本次提交所修改内容的说明。
-v 会得到更详细的修改内容说明;
-m 可以在其后同时输入提交信息;
-a 可以跳过使用暂存区,也就是git会自动把所有已经跟踪过的文件暂存起来一并提交。
–amend 可以重新提交。
例如,使用者提交了之后发现有文件忘了提交,可以像下面这样操作:
在这里插入图片描述

最终只会有一个提交,第二次的提交将覆盖第一次。

git rm 移除文件
-f 强制删除某个已经被修改且放到了暂存的文件,这是一种安全机制,防止误删还没提交的数据。
–cached 从仓库中移除某个文件但仍然保留在当前工作目录中

git mv 移动文件或重命名文件

git show 显示各种类型的对象

  1. 查看历史以及撤销和回退
    git log 查看提交历史
    -p 显示每次提交的内容差异;
    -2 仅显示最近两次的提交;
    –stat 显示每次提交的简略统计信息;
    –pretty 指定使用不同于默认格式的方时展示提交历史等等。
    该命令有很多选项,可以帮助使用者很好的筛选出需要的提交历史。

git reset
git reset HEAD
这个命令可以将已经放到暂存区但还没提交的文件变为已修改未暂存的状态。
git reset --hard <hash号>
这个命令可以回退使用者的工作目录到某个历史版本,这是一个危险命令,有可能导致丢失数据。

git checkout – 撤销对文件的修改
该命令也是一个危险命令,会让使用者对文件所作的修改全部消失,使用一定要慎重。

  1. 远程仓库
    git remote 查看远程仓库
    git remote add 可以添加一个远程仓库

git fetch 从远程仓库获得数据
这个命令会将远程仓库中所有新推送的工作拉取到使用者的本地仓库中,但并不会自动合并或修改使用者当前的工作目录。

git pull 从远程仓库中抓取新数据
它会尝试将新数据自动合并到使用者的工作目录。

git push 推送到远程仓库
只有当使用者有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当使用者和其他人在同一时间克隆,他们先推送到上游然后使用者再推送到上游,使用者的推送就会毫无疑问地被拒绝。 使用者必须先将他们的工作拉取下来并将其合并进使用者的工作后才能推送。

  1. 标签
    git tag 查看现有标签
    -l 选项可以查找特定的标签
    -a 选项可以创建一个附注标签,如:
    在这里插入图片描述

-m 指定一条存储在标签中的信息
如果没有使用-m,git会运行编辑器要求使用者输入信息(类似git commit的-m选项)

git tag 创建一个轻量标签

  1. 分支
    git branch 新建分支

git checkout 切换分支
切换分支时,git会修改工作目录,因此需要保持工作目录干净,否则git无法切换。
使用git checkout –b [分支名] [远程名]/[分支名] 可以自动创建一个跟踪某个远程分支的分支,并切换过去。

git merge 分支合并
合并产生冲突时,git会做合并,但不会提交,可以使用git status命令查看处于合并冲突状态的文件。Git会在有冲突的文件中加入标准的冲突解决标记,例如:
在这里插入图片描述
git rebase 变基
这个命令同样可以用于合并分支,它与merge的不同在于,它会修改提交历史,使得在之后看来,就仿佛没有发生过合并,可以让提交历史更加干净整洁。除了用于合并分支,它还可以合并提交。这个命令稍微有些复杂,具体可以参考《progit》这本书的变基章节,讲的非常详细。
个人理解,该命令的使用应该是这样的:
远程仓库有个master分支;
本地clone了远程仓库,同样有了master分支,然后再自己建立一个local分支;
日常开发可以在local分支进行,完成开发之后,先checkout到本地master分支,pull一下;然后再切回local分支,用git rebase master命令,就会将local分支上的改动变基到master分支,然后切到master分支,运行git merge local,就完成了local分支和master分支的合并。(这里我理解,最后的git merge local命令实际上没有进行什么实际的工作了,只是将master分支的HEAD,移动到了最新的提交上,真正的合并工作是rebase命令完成的,这时local分支的HEAD和master分支的HEAD指向了同一个提交)

  1. 忽略文件
    我们可以创建一个名为.gitignore的文件,列出要忽略的文件模式,如:
    在这里插入图片描述

文件 .gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值