Git命令学习-基本操作

本文详细介绍了Git的配置方法,区分了全局和仓库级别的配置,以及gitconfig命令的使用。涵盖了工作区、暂存区和版本库的概念,解释了文件的四种状态,并演示了如何添加、提交、比较和管理文件的变更,包括删除、版本回退等关键操作。
摘要由CSDN通过智能技术生成

Git 配置

  • 用户信息:

    # 全局配置,用户名,邮件地址,使用全局配置之后该机器上所有项目都将会默认使用该用户信息
    git config --global user.name "username"
    git config --global user.email "username@example.com"
    
    # 对某个Git仓库使用指定不同的用户名和邮件地址
    git config user.name "username"
    git config user.email "username@example.com"
    
  • 查看配置信息

    git config --list
    

Git 基本操作

Git 工作区域主要可分为三个:工作区(workspace)暂存区(stage/index)版本库(respository)

Git 文件的四种状态:

  • Untracked:未跟踪状态,该文件在工作区中,但暂存区和版本库中都不存在该文件,该文件不参与版本控制。该种类型文件仅有一种改变状态方式:即通过git add [file] 将文件添加入暂存区,其状态将由Untracked变为Staged。
  • Unmodify:未修改状态,该文件已在版本库中,且工作区中的文件内容与版本库中的文件内容完全一致。该种类型文件有两种改变状态方式:
    1、被修改,其状态将由Unmodify变为Modified;
    2、通过git rm [file] 将文件移出版本库,其状态将由Unmodify变为Untracked。
  • Modified:修改状态(仅对库中原有的文件进行修改的操作,无其他操作),该种类型文件有两种改变状态的方式:
    1、通过git add [file] 将文件添加入暂存区,其状态将由Modified变为staged;2
    2、通过 git restore [file] 将工作区的改动丢弃,其状态将由Modified回到unmodify状态
  • Staged:暂存状态。该种类型的文件有两种改变状态的方式:
    1、通过 git commit 将修改内容同步至版本库中,此时本地文件与版本库中的文件内容又变为完全一致,文件状态由Staged变为Unmodify状态;
    2、通过 git restore --staged [file] 取消暂存,文件状态由Staged变为Modified状态。
  • 创建版本库

    # 1. 创建一个名为gitfolder的项目文件夹,该文件夹即可理解为工作区
    mkdir gitfolder
    # 2. 切换至gitfolder目录下
    cd gitfolder
    # 3. 创建该项目的初始版本库,此时会在当前目录下生成一个名为.git的隐藏文件夹,此即为版本库
    git init
    
  • 添加文件到仓库

    # 4. 在项目文件夹下创建index.html,此时index.html没有在暂存区和仓库里,不受版本控制,此时文件状态为Untracked
    echo "Hello World" > index.html
    # 5. 将index.html,添加至暂存区,文件状态发生改变[Untracked -> Staged]。此时.git文件夹中会生成一个名为index的文件,此即为暂存区
    git add index.html
    
    # git add [file]
    # file 可以是多个文件,也可以是目录
    
  • 提交文件到仓库

    # 6. 提交文件至仓库。注:此时的提交是将暂存区的文件提交至版本库,工作区与版本库文件内容一致,文件状态发生改变[Staged -> Unmodify]
    git commit -m "add index.html"
    
    # git commit -m [message]
    # message 是本次提交的备注,方便记忆
    # git commit -am "add index.html",该命令会自动暂存已修改和被删除的文件,但对新添加的文件不适用,不建议使用这种提交方式。
    
  • 比较文件不同

    # 7. 修改index.html,文件状态发生变化[Unmodify -> Modified]
    echo "Hello Human" > index.html
    # 8. 将修改过的index.html添加至仓库,文件状态发生变化[Modified -> Staged]
    git add index.html
    # 9. 修改index.html
    echo "Hello everyone" > index.html
    # 10. 比较文件不同,此命令比较的是工作区与暂存区中index.html的区别
    git diff index.html # show 1
    # 11. 比较文件不同,此命令比较的是暂存区与版本库中index.html的区别
    git diff --cached index.html # show 2
    # 12. 比较文件不同,此命令比较的是工作区与版本库中index.html的区别
    git diff HEAD index.html
    
    # git diff [file]
    # git diff --cached [file]
    # git diff HEAD [file]
    # file 可以是多个文件,也可以是目录
    
    # show 1 工作区与暂存区。a为暂存区,b为工作区
    diff --git a/index.html b/index.html
    index d98ab83..9c514e8 100644
    --- a/index.html
    +++ b/index.html
    @@ -1 +1 @@
    -Hello Human
    +Hello everyone
    
    # show 2 暂存区与版本库。a为版本库,b为暂存区
    diff --git a/index.html b/index.html
    index 557db03..d98ab83 100644
    --- a/index.html
    +++ b/index.html
    @@ -1 +1 @@
    -Hello World
    +Hello Human
    
    # show 3 工作区与版本库。a为版本库,b为工作区
    diff --git a/index.html b/index.html
    index 557db03..9c514e8 100644
    --- a/index.html
    +++ b/index.html
    @@ -1 +1 @@
    -Hello World
    +Hello everyone
    

git diff 理解 (使用show 1:git diff index.html 解释)
第一行:diff --git a/index.html b/index.html ,申明比较的文件,a版本的index.html(即变动前),b版本的index.html(即变动后)
第二行:index d98ab83..9c514e8 100644d98ab83为变动前的a版本文件的hash,9c514e8为变动后的b版本中文件的hash,100644为申明对象模式:100代表普通文件,644代表文件具有的权限
第三、四行:--- a/index.html+++ b/index.html--- 代表变动前,+++ 代表变动后
第五行:@@ -1 +1 @@ == @@ -1,0 +1,0 @@- 指变动前的文件,+ 指变动后的文件,指变动前的文件从第1行开始的0行与变动后的文件第1行开始的0行存在不同
第六、七行:-Hello Human+Hello everyone-+ :代表变动标志位,- 代表该行删除内容,+ 代表该行新增内容

  • 查看仓库状态

    # 13. 查看仓库状态,显示有变更的文件
    git status
    位于分支 master
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
            修改:     index.html
    
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
            修改:     index.html
    
    # 分析返回信息
    # 回顾步骤:
    # 1. 创建文件 index.html (Hello World),添加至暂存区,提交至版本库;
    # 2. 修改文件 index.html (Hello Human),添加至暂存区;
    # 3. 修改文件 index.html (Hello everyone)。
    # 由此可知,git status 返回的要提交变更(即暂存区中尚未提交)的文件为 index.html(Hello Human);git status 返回的尚未暂存以备提交的变更(即工作区中修改后)的文件为 index.html (Hello everyone)。
    

git status 理解

  • 要提交的变更:已跟踪的文件,其在工作区有动作(即增删改),并已同步其动作(即增删改)至暂存区,但该文件动作(即增删改)未提交至版本库
  • 尚未暂存以备提交的变更:已跟踪的文件,其在工作区有动作(即增删改),但该文件动作(即增删改)未添加至暂存区
  • 未跟踪的文件:未跟踪的文件
  • 删除文件

    # 14. 删除文件
    git rm [file]
    # 根据报错信息我们可知index.html在暂存区的内容与工作区和版本库中的都不一样,需要使用-f强制删除
    
    # 删除文件的几种报错
    # 1. 仅修改了工作区内容的文件
    error: 如下文件有本地修改:
        test.html
    (使用 --cached 保留本地文件,或用 -f 强制删除)
    # 2. 修改了工作区内容的,并已添加至暂存区的文件
    error: 下列文件索引中有变更
        test.html
    (使用 --cached 保留本地文件,或用 -f 强制删除)
    # 3. 修改了工作区内容的,并添加至暂存区后,又修改了工作区内容的文件
    error: 如下文件其暂存的内容和工作区及 HEAD 中的都不一样:
        index.html
    (使用 -f 强制删除)
    # 由此可知,只要工作区与暂存区之中的文件有所变动,删除文件就必须家参数 -f
    
    # 删除文件,方法一:此方法将连同工作区的文件一并删除
    git rm -f index.html
    # 查看仓库当前状态
    git status
    位于分支 master
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
            删除:     index.html
    
    # 分析返回信息
    # ls查看工作区文件,观察到工作区的index.html已被删除。通过返回信息可知,暂存区中的index.html已被删除,但尚未删除版本库中的index.html
    
    # 删除文件,方法二:此方法将保留工作区的文件
    git rm -f --cached index.html
    # 查看仓库当前状态
    git status
    位于分支 master
    要提交的变更:
      (使用 "git restore --staged <文件>..." 以取消暂存)
            删除:     index.html
    
    未跟踪的文件:
      (使用 "git add <文件>..." 以包含要提交的内容)
            index.html
    
    # 分析返回信息
    # ls查看工作区文件,观察到工作区的index.html未被删除。通过返回信息可知,暂存区中的index.html已被删除,但尚未删除版本库中的index.html。将其返回信息与方法一的返回信息进行比较,不同的是工作区的index.html文件还保留着,但此时该文件状态发生了变化[Unmodify -> Untracked]
    

    git rm [file]的小结:我们可以发现不管哪种删除文件方法,其都是仅将暂存区中的文件删除,并未删除版本库中的文件。学到此处(节点一),执行 git rm [file] 后,git 为后续操作提供了两个方向,方向一:确认删除文件;方向二:还原文件。方向一与方向二皆以删除文件方法二(工作区文件保留)为示例前提。首先我们先跳过下面这段内容,直接进入下一节「还原文件」,学习方向二:还原文件。

    # 方向一:确认删除文件
    # 确定要删除该文件,即从版本库中删除文件
    git commit -m "remove index.html"
    

    学到此处, git rm [file] 学习结束,暂存区、版本库中的index.html文件已被删除,至于工作区中的index.html是否存在,就取决于你选择的删除方法了。接下去我们继续学习,按照本文阅读顺序来的应该已经学习了 git restore [file] ,我们可以继续往下学习,前往下下节「查看提交历史」,当然没有学习过的可以继续接下去阅读。

  • 还原文件

    # 方向二:还原文件
    # 使用 git rm --cached [file] 前,index.html的文件内容,工作区:Hello everyone,暂存区:Hello Human,版本库:Hello World
    # 使用 git rm --cached [file] 后,index.html的文件内容,工作区:Hello everyone,暂存区:被删除,版本库:Hello World
    
    # 15. 还原暂存区文件
    git restore --staged index.html
    # 查看仓库当前状态
    git status
    位于分支 master
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git restore <文件>..." 丢弃工作区的改动)
            修改:     index.html
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a"# 分析返回信息
    # cat index.html可以发现工作区中的文件内容并无变化。通过返回信息发现,原先的删除时的未跟踪的文件已经消失,由此可知文件是否为跟踪状态是由暂存区中是否存在该文件决定,其次也可知 git restore --staged [file] 并不会直接影响工作区的文件,而是将暂存区文件内容恢复至与版本库文件内容一致,若需还原工作区中的文件还需执行下一个还原命令
    
    # 16. 还原工作区文件
    git restore index.html
    # 查看仓库当前状态
    git status
    位于分支 master
    无文件要提交,干净的工作区
    
    # 分析返回信息
    # cat index.html发现,工作区中的index.html文件内容已发生改变,git restore [file] 是将工作区文件内容恢复至与暂存区文件内容一致
    

    学习到此处,工作区、暂存区、版本库中的index.html文件内容已完全一致,git restore [file] 命令学习结束,让我们回到节点一继续学习 git rm [file]

  • 查看提交历史

    # 15. 查看提交历史
    git log
    commit 99ef3cd3272b06222d054bbb267830ad9d2a84db (HEAD -> master)
    Author: username <username@example.com>
    Date:   Thu Mar 25 14:46:50 2021 +0800
    
        remove index.html
    
    commit 8fe06192de0380963f375bd3ea7df5126b92d806
    Author: username <username@example.com>
    Date:   Wed Mar 24 21:44:01 2021 +0800
    
        add index.html
    
    # 分析返回信息
    # 通过返回信息可知,使用git log会显示历史提交信息,按照提交时间的远近依次从下到上排序(最新的在最上,最旧的在最下),每条信息包括当时提交时的hash值,作者信息,提交时间,提交时的备注
    
    # 简洁显示
    git log --pretty=oneline
    99ef3cd3272b06222d054bbb267830ad9d2a84db (HEAD -> master) remove index.html
    8fe06192de0380963f375bd3ea7df5126b92d806 add index.html
    
    git log --oneline
    99ef3cd (HEAD -> master) remove index.html
    8fe0619 add index.html
    # 两者区别就是后者hash值只显示一部分
    
  • 版本回退

    # 16. 版本回退
    git reset 8fe0619
    重置后取消暂存的变更:
    D       index.html
    # 查看仓库状态
    git status
    位于分支 master
    尚未暂存以备提交的变更:
    (使用 "git add <文件>..." 更新要提交的内容)
    (使用 "git restore <文件>..." 丢弃工作区的改动)
            修改:     index.html
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a"# 分析返回信息
    # cat index.html可以发现工作区中的文件内容并无变化。通过返回信息发现,仅index.html文件状态为Modified,说明暂存区、版本库发生了变化,由此可知,使用git reset [commit id]进行版本回退仅暂存区和版本区发生回退,工作区不受影响
    
    # git reset 三个参数
    # git reset --mixed [commit id] 工作区不受影响,暂存区、版本区回退(其相当于git reset [commit id]))
    # git reset --soft [commit id] 工作区、暂存区不受影响,版本区回退
    # git reset --hard [commit id] 工作区、暂存区、版本区全部回退
    
  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值