【Git】基本概念 + 基操
【Git】基本概念 + 基操
- 创建 Git 本地仓库
- 配置 Git(⽤⼾名称 和 e-mail 地址)
- ⼯作区、暂存区、版本库
- git add(工作区 -> 暂存区) / git commit (暂存区 -> 版本库)
- git log ,来查看历史提交记录
- 对象库 /.git/objects
- 修改⽂件 (git status / git diff [file])
- 版本回退
- 撤销修改(想恢复到上⼀个版本)
- 情况⼀:对于⼯作区的代码,还没有 add
- 情况⼆:已经 add ,但没有 commit
- 情况三:已经 add ,并且也 commit 了
- 删除⽂件 (删除也是修改操作)
创建 Git 本地仓库
git init //创建⼀个 Git 本地仓库,仓库是进⾏版本控制的⼀个⽂件⽬录, .git ⽬录是 Git 来跟踪管理仓库,不要手动修改 .git目录。
配置 Git(⽤⼾名称 和 e-mail 地址)
- 设置 ⽤⼾名称 和 e-mail 地址
git config [–global] user.name “Your Name”
git config [–global] user.email “email@example.com”
// --global, 表⽰这台机器上所有的 Git 仓库都会使⽤这个配置
-
删除对应的配置命令为:
git config [–global] --unset user.name
git config [–global] --unset user.email -
查看 [全局] 配置中的用户名和邮箱
git config [–global] user.name
git config [–global] user.email
⼯作区、暂存区、版本库
- index 就是我们的暂存区,add 后的内容都是添加到这⾥的。
- HEAD 就是我们的默认指向 master 分⽀的指针
-
⼯作区:写代码或⽂件的⽬录。
-
暂存区:英⽂叫 stage 或 index(索引)。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,
-
版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽
是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git
都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。 -
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指针叫 HEAD。
-
• 当对⼯作区修改的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。
-
git commit 时,master 分⽀更新,暂存区的⽬录树才会被真正写到版本库中
小结: 通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中进⾏管理
git add(工作区 -> 暂存区) / git commit (暂存区 -> 版本库)
-
添加⼀个或多个⽂件到暂存区: git add [file1] [file2] …
-
添加指定⽬录到暂存区,包括⼦⽬录: git add [dir]
-
添加当前⽬录下的所有⽂件改动到暂存区: git add .
-
提交暂存区全部内容到本地仓库中: git commit -m “message”
-
提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] … -m “message”
git log ,来查看历史提交记录
commit id(⼗六进制):哈希出来的
git log --pretty=oneline // 优化信息格式
master 分支本身是一个指针,始终指向该分支上的最新提交
对象库 /.git/objects
objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容
object 将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。
该类⽂件是经过 sha (安全哈希算法)加密过的⽂件,使⽤ git cat-file 命令来查看版本库对象的内容
- index: 暂存区, git add 后会更新该内容。
- HEAD: 默认指向 master 分⽀的⼀个指针。
- refs/heads/master: ⽂件⾥保存当前 master 分⽀的最新 commit id 。
- objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。
修改⽂件 (git status / git diff [file])
- Git 跟踪并管理的是修改,⽽⾮⽂件。
- git status // 查看在你上次提交之后是否有对⽂件进⾏再次修改
- git diff [file] // 显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格
式。也可以使⽤ git diff HEAD – [file] 命令来查看版本库和⼯作区⽂件的区别
版本回退
“回退”本质是要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定
git reset [–soft | --mixed | --hard] [HEAD]
- –mixed 为默认选项,该参数将暂存区的内容退回,⼯作区⽂件保持不变。
- –soft 参数,只是将版本库回退到某个指定版本。
- –hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令
HEAD 说明:
◦ 可直接写成 commit id,表⽰指定退回的版本
◦ HEAD 表⽰当前版本
◦ HEAD^ 上⼀个版本
◦ HEAD^^ 上上⼀个版本
◦ 以此类推…
• 可以使⽤ 〜数字表⽰:
◦ HEAD~0 表⽰当前版本
◦ HEAD~1 上⼀个版本
◦ HEAD^2 上上⼀个版本
◦ 以此类推
git reset --hard + [commit id] // 回退到指定version
git reflog // 该命令⽤来记录本地的每⼀次命令。
Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的HEAD 指针refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解
成如下⽰意图:
撤销修改(想恢复到上⼀个版本)
情况⼀:对于⼯作区的代码,还没有 add
git checkout - - [file] // 让⼯作区的⽂件回到最近⼀次 add 或 commit 时的状态。
要注意 git checkout - - [file] 命令中的 - - 很重要,切记不要省略
情况⼆:已经 add ,但没有 commit
add 后还是保存到了暂存区了,怎么撤销呢?
git reset 回退命令,使⽤ –mixed 参数[可省],可以将暂存区的内容退回为指定的版本内容,但⼯作区⽂件保持不变
ReadMe 为欲撤销修改的file
- git reset HEAD ReadMe // 执行后 暂存区是⼲净的,⼯作区有修改,HEAD 表⽰当前版本
- git checkout – ReadMe // 丢弃⼯作区的修改
情况三:已经 add ,并且也 commit 了
git reset --hard HEAD^ 回退到上⼀个版本 // 条件:没有把本地版本库推送到远程
删除⽂件 (删除也是修改操作)
用rm [file] // 仅删除了工作区文件或目录,直接删除是没⽤,⼯作区和版本库就不⼀致了,除了要删⼯作区的⽂件,还要清除版本库的⽂件。
-
确实要从版本库中删除该⽂件 (删除也是修改操作)
仅rm,没有删完,我们只删除了⼯作区的⽂件。这时就需要使⽤ git rm 将⽂件从暂存区和⼯作区中删除,并且 git commit -m : ⽂件就从版本库中被删除了 -
不⼩⼼删错了, 恢复file
git checkout – [file] // 删除也是修改