【Git】基本操作

创建Git本地仓库

        Git是一个版本控制器,如果想对电脑或者服务器上的文件进行记录(每次修改或者版本迭代的内容),当然如果随机将需要记录的文件保存在任意位置,Git就不会控制记录。所以需要将Git需要管理的文件放在Git仓库中,只有在Git仓库下的文件才能被追踪和管理。

        下面在Linux服务器中创建一个Git仓库:

首先创建gitcode目录,使用指令:

mkdir gitcode

然后初始化git仓库,使用指令:

git init

此时,查看git是否部署成功,使用指令

ls -a

tree ,git/

【注意】一般不建议修改该目录下的任意文件。

配置Git

        当创建好Git本地仓库的时候,需要配置Git的name和email地址。这两个配置项是比较重要的,在以后提交仓库的时候没有配置可能会出错。

        配置命令

git config user.name "Your name"

git config user.email "email address"

  • 把Your name 改成你的名字
  • 把email address修改成邮箱的格式,需要格式正确

git config --global user.name "Your name"

git config --global user.email "email address"

在一台服务器上,不仅仅可以创建一个本地仓库,添加--global表示这台机器上所有的Git仓库都会使用这个配置。

        查看配置

git config -l

        删除配置:

git config --unset user.name

git config --unset user.email

git config --global --unset user.name

git config --global --unset user.email

认识工作区、暂存区、版本库

        git是一个版本控制系统,使用git可以对电脑上所有格式的文件进行管理,但是管理起来需要有一定的条件,需要将被管理的文件放到git仓库中进行维护,git从而可以追踪到这些文件并进行管理。

        目前仅仅只在该目录下,git是不可以管理该ReadMe文件的。

  • 版本库:又名仓库,英文名repository。工作区有一个隐藏目录.git,它不算工作区,而是git的版本库。这个版本库里面的所有文件都可以被git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

【注意】不能随意在git仓库下手动随意删除,添加,修改操作,但是可以在工作区进行添加代码或者文件。

  • 工作区:是在电脑或者服务器上要写代码或者文件的目录

【注意】.git虽然在gitcode目录下,但是其不属于工作区。

  • 暂存区:英文叫做stage或者index。一般存放在.git目录下的index文件(.git/index)中,我们把暂存区有时也叫做索引(index)。
  1. 图中左侧为工作区,右侧为版本库。
  2. 在创建Git版本库的时候,Git会为我们自动创建一个唯一的master分支,以及指向master的一个指针HEAD
  3. 修改操作包括:新增、修改、删除。
  4. 当通过对工作区修改文件时,执行git add命令,暂存区目录树的文件索引会被更新。
  5. 当执行提交操作git commit时,master分支会做相应的更新,此时暂存区的目录树会被写到版本库中。

        当进行add操作的时候,对工作区进行修改的时候,会将修改的内容写入的git对象中,而这个对象会被维护到objects对象库中。在暂存区中,保存的是所有修改对象的索引。进行command操作,将暂存区中的树写到master分支下。当得到HEAD指针就会获取到master这个树,就可以进一步拿到修改的内容。

【总结】通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须通过使用git add和git commit命令才能将文件添加到仓库中进行管理。

添加文件——场景1

        在gitcode目录下的ReadMe文件中添加内容,

指令:git add ReadMe / git add . (.代表将当前目录下所有的修改添加到暂存区中)
【讲解】使用git add 命令可以将文件添加到暂存区

  • 添加一个或多个文件到暂存区:git add [file1] [file2] ...
  • 添加指定目录到暂存区,包括子目录:git add [dir]
  • 添加当前目录下的所有文件改动到暂存区:git add .

指令:git commit -m " 提交的细节 " 

【讲解】使用git commit 命令将暂存区内容添加到本地仓库中:

  • 提交暂存区全部内容到本地仓库中:git commit -m "message"
  • 提交暂存区的指定文件到仓库区:git commit [file1] [file2] ... -m "message"

需要注意git commit 后面的-m选项,一定需要跟上描述本次提交的message,由用户自己完成,这部分内容不能省略,并且需要好好描述,用来记录提交细节。

        提交一个文件

        提交多个文件

指令:git log

【讲解】该命令显示从最近到最远的提交日志,同时也可以看到commit时的日志消息。

指令:git log --pretty=oneline

【讲解】将输出信息写成一行

【注意】commit id(版本号),Git的commit id不是1,2,3...递增的数字,而是一个SHAI计算出来的一个非常大的数字,用十六进制表示。

查看.git文件

        通过上一个部分添加文件内容后,可以查看.git文件的变化。

  • index就是暂存区,add后的内容都是添加到这里的。
  • HEAD就是默认指向master分支的指针。

打印master里面的内容:

该字符串保存的就是当前最新的commit id,查看object时要将commit id分成2部分,其前2位是文件夹名称,后38位是文件名称。

  • objects为Git的对象库,里面包含了创建的各种版本库对象及内容。当执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于“.git/objects”目录下。

查看该文件中保存内容:

  • 指令:git cat-file -p (commit id)

【总结】在本地git仓库中,有几个文件或者目录比较特殊

  • index:暂存区,git add 后会更新该内容
  • HEAD:默认执行master分支的一个指针
  • refs/heads/master:文件里保存当前master分支的最新commit id。
  • objects:包含了创建的各种版本库对象及内容,存放了git维护的所有修改

添加文件——场景2

        在向仓库中添加文件的时候,会出现下面的一种添加文件的场景:

【注意】git add是将文件添加到暂存区,git commit是将暂存区的内容添加到本地仓库中。由于前面并没有使用git add file5,导致file5不在暂存区中维护,所以commit的时候只是将存在于暂存区中的file4提交了,而遗漏了工作区中的file5.

修改文件

        在工作区的新增、修改、删除一个文件都属于是修改文件。Git追踪管理的是修改的内容,而不是文件。同时,对象库中存储的是修改的工作区的内容也证明了Git管理的是修改的内容。

        修改ReadMe文件:

此时仓库中的ReadMe和工作区的ReadMe是不同的,可以使用下面的指令

  • 指令:git status

【作用】用于查看在你上次提交之后是否有对文件进行再次修改。git status只能查看某个文件被修改。

下面的指令可以查看文件被修改的内容:

  • git diff [file]
  • git diff HEAD -- [file]

【作用】git diff [file]用来显示暂存区和工作区文件的差异,显示的格式正是Unix通用的diff格式。git diff HEAD -- [file]命令来查看版本库和工作区文件的区别。

版本回退

        Git是一个版本控制系统,能够管理文件的历史版本,这是版本控制器重要能力。如果需要回到之前的某一个版本,在某个特定的历史版本重新开始,此时就需要版本回退的功能。

执行git reset命令用于回退版本,可以指定退回某一次提交的版本。

  • “回退的本质”:将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定。
  • git reser命令语法格式:git reset [--sort | --mixed | --hard]  [HEAD]
  • --mixed为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保存不变。
  • --sort参数对于工作区和暂存区的内容都不变,只是将版本回退到某个指定版本。
  • --hard参数将暂存区与工作区都退回到指定版本。

【注意】--hard指令慎用,工作区有未提交的代码时不要使用这个命令,会导致工作区回滚,找不到之前提交的代码。

【HEAD方案一】:

  • 可以直接写成commit id,表示指定退回的版本
  • HEAD^ 表示当前版本
  • HEAD^^ 表示上一个版本
  • 以此类推

【HEAD方案二】:使用~数字表示

  • HEAD~0  表示当前版本
  • HEAD~1 上一个版本
  • HEAD~2 上上一个版本
  • 以此类推

可以找到commit id方式回退

【注意】仅仅是由于当前终端下并没有将modify ReadMe的commit id清除,如果退出服务器可能导致modify ReadMe的commit id消失从而导致无法撤销回退。

使用记录本地命令的回退方式

当然也可以通过另外一种方式来撤销回退,使用指令:

  • git reflog

该命令用来记录本地的每一次命令。

【注意】在开发的过程中,会进行很多的git操作,迟早会冲走commit id,一旦找不到commit id 就很难再撤销回退。

版本回退的原理

Git的版本回退的速度是非常快速的,因为Git在内部有个指向当前分支(此处是master)的HEAD指针,reds/heads/master文件中保存当前master分支的最新commit id。当我们在回退版本的时候,Git仅仅是给refs/heads/master中存储一个特定的version。

撤销修改

当存在想要恢复到上一个版本的情况,可以进行撤销修改。撤销修改存在三种情况:

  • 工作区修改,暂存区和版本库没有修改
  • 工作区和暂存区修改,版本库没有修改
  • 工作区、暂存区和版本库均修改

情况一:对于工作区的代码,还没有add

        除了手动修改,Git提供了更好的一种方式,可以使用指令:

  • git checkout -- [file] 命令让工作区的文件回到最近一次add 或者 commit 时的状态。

【注意】git checkout -- [file] 命令中的 -- 非常重要,不能省略,一旦省略,意思就会改变。 

情况二:已经add,但是没有commit

在版本回退中git reset回退命令,使用 --mixed参数,可以将暂存区的内容退回为指定的版本内容,但是工作区文件保持不变,此时就可以回退暂存区的内容,指令:

  • 【方案1】git reset --mixed
  • 【方案2】git reset HEAD^
  • 【方案3】git reset --hart

方案1和方案2可以将暂存区里的内容回退当前版本,此时可以回到情况1。方案三可以将暂存区和工作区的内容回退到当前版本。

此时回到情况1,使用情况1的指令即可:git checkout -- [file]

情况三:已经add,并且commid

        当工作区,暂存区和版本库中都存在修改后的代码,使用git reset命令处理此问题即可。

【注意】这种情况基于一个大前提:就是commit周版本库中的内容没有push到远程仓库。同时,撤销的目的,就是不影响远程仓库中的代码。

回退到上一个版本的指令:

  • git reset --hard HEAD^

删除文件

方法1:三部分

通过三个指令删除文件:

  1. rm [file] ——只是将工作区里的文件进行删除
  2. git add [file]
  3. git commit -m " "

方法2:两部分

删除一个文件,也可以使用Git提供的rm命令,可以将指令减少至两步:

  1. git rm [file]
  2. git commit -m " "

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值