Git 的基本使用

Git 的基本使用

什么是 Git

? 在使用 Git 前,了解 Git 对于之后的学习会有很大的帮助。

? Git 是一个分布式的版本控制软件,最初的目的是为了更好的管理 Linux 内核的开发。相比较于其它的软件版本控制系统,虽然总体上用起来与它们十分的相似,但是在对于信息的存储和认知上有很大的差异。主要体现在:

  • 直接记录每个文件的快照,而不是进行差异的比较

    • 对于其它的软件版本控制系统,如 SVN,在每个软件版本中都是通过记录与最初文件的差异来进行版本控制的。而 Git 则不同,每个版本都是通过创建之前版本文件的一个快照,这有点类似与一个小型的文件系统,当然,为了效率,Git 在每个版本中对于没有修改的文件使用一个链接指向之前的文件。因此当每次切换版本时,你都会感觉到非常快。
  • 几乎所有的操作都在本地执行

    • Git 是一个分布式的软件版本控制软件,在你自己本地也可以存储对应的文件,这样极大地提高了系统的容错性和容灾性。在你每次提交时,都是只会访问自己本地的文件系统,只有当你希望将自己的软件版本推送到远程服务器时,此时才需要访问互联网。
  • Git 可以保证完整性

    • Git 中的所有数据在存储前都会计算校验和,然后通过校验和来引用对应的版本。因此在文件有任何改动的情况下,Git 都能立即发现。

    • 在每次提交后,Git 都会有一个校验和来引用对应的版本,因此在你执行提交之后,很难导致数据的丢失。

Git 的几种状态

? 理解 Git 的几种状态对于学习是极其重要的,Git 总共分为三种状态:已修改(modified)已暂存(staged)已提交(committed)

  • 已修改(modified) 表示已经修改了 工作区 的文件,但是还没有提交。
  • 已暂存(staged)表示已经将修改的文件放入了 暂存区,使之包含在下次提交的快照中
  • 已提交(committed)表示已经将暂存区的快照文件放入了 本地仓库

使用图来表示可能会直观一些:

Git 的基本使用

请牢记这三种状态和这三个区,这是 Git 的核心。

一般的 Git 流程如下:

  1. 在工作区内修改了文件,此时 Git 的状态更新为 已修改
  2. 将修改后的文件加入暂存区,此时 Git 的状态为 已提交
  3. 提交更新,将暂存区内的快照文件存入本地数据库,此时 Git 的状态为 已提交

Git 的使用

运行前的一些配置

? 在使用 Git 前,需要配置一些相关的变量,如用户名、邮箱、默认文本编辑器等,只有配置了这些必须的属性,Git 才能正常使用。当然,Git 还有一些其它的配置信息,可以通过 git config --list --show-origin 来查看相关的配置属性以及所在的位置,但是 用户名、邮箱是必须配置的,因为 Git 在每次提交时都会将这些信息写入,并且这是不可更改的。

? 有两种方式可以设置这些属性:一是通过 git config --global user.name xxxxgit config --global user.emal xxxx@xx.com ;二是通过直接修改对应的配置文件。

? 这里以命令的方式进行配置为例:

# 配置用户名
git config --global user.name FatalFlower
# 配置用户邮箱
git config --global user.email GuiHuaLinked@gmail.com

默认文本编辑器的设置,当 Git 需要输入信息时将会调用它,如果没有配置的话,Git 会调用默认的文本编辑器。

# 设置 Git 的文本编辑器为 emacs
git config --global core.editor emacs

当在 Windows 上修改 Git 默认的文本编辑器时,需要指定执行程序的全路径。

基本使用

  1. 初始化 或 clone

    通过初始化的方式或者 clone 的方式都可以得到一个 Git 仓库。

    • 初始化一个 Git 仓库(此时你应当已经进入了对应的项目目录)

      # 初始化一个本地 Git 仓库
      git init
      

      ? 这会在你的项目目录下创建一个 .git 文件夹,这是一个隐藏的文件夹,里面包含了 Git 仓库所必须的一些文件。

    • clone 一个 Git 仓库

      git clone https://github.com/LiuXianghai-coder/tourism.git
      

      ? 这会将整个 tourism 仓库克隆到本地,同时还会将该仓库带有的 .git 文件夹 clone下来,得到整个项目的提交历史和文件等其它的信息。

  2. 修改工作区的内容

    ? 在工作区(即你能够看到的项目目录中),对其中任意几个文件进行修改,此时 Git 会检测到文件的修改。如果在修改完几个文件之后运行 git status 可以看到当前的状态。看起来可能像下图这样:

Git 的基本使用)

? 此时的修改后的文件依旧存储在 工作区

  1. 将工作区的内容添加到暂存区

    ? 此时可以通过 git add *.txt 命令将当前工作目录下所有的 txt 文件都放入暂存区。再通过 git status 命令查看 Git 当前的状态。可能与下图类似:

    ? Git 的基本使用

    ? 注意此时修改后的文件处于 暂存区

  2. 提交暂存区内的文件快照

    ? 此时暂存区内有修改后的文件的快照,在未提交之前,这些快照依旧时不稳定的,因为它依旧有可能会丢失,因此最好的做法是将它们提交到本地仓库。

    ? 使用 git commit 命令可以将暂存区内的快照提交到本地仓库,此时提交将会强制要求输入本次提交的信息,也可以在命令后加上 -m 选项来输入本次的提交信息。但是一般来讲,还是建议使用 git commit 不带上 -m 选项,因为这会使得你能够更加详细地说明本次提交地内容。

    ? 执行完 git commit 命令,并且输入对应的提交信息后,再次运行 git status 命令查看 Git 的状态,可以看到工作区是干净的。

    Git 的基本使用

  3. 推送到远程服务器

    ? 之前讲过,Git 是一个分布式的软件版本控制工具,它的分布式就体现在这,客户端和服务端以及拉取这个仓库的客户端都会有这个仓库的 .git 文件夹。也就是说,以上这几个端都有对应的副本,因此对于软件版本控制来讲是极其安全的。只要即使拉取和推送了对应的仓库。

    ? 要推送本地的仓库到远程服务端,首先要添加它的上游分支:

    # 在这里我将自己的一个 Github 仓库放到这里作为一个上游
    git remote add origin https://github.com/LiuXianghai-coder/Test-Repo.git
    

    ? 此时通过 git remote --verbose 可以查看存在那些上游分支:

    Git 的基本使用

    ? 有了上游分支后我们就可以将我们本地的仓库推送到上游服务器上了 :)

    ? 使用 git push 命令可以将我们的仓库推送上去,具体命令如下:

    # 这里需要注意的是,origin 是指定的上游分支名称,origin 是默认的一个上游分支,具体名称需要参考 `git remote --verbose` 命令下输入的上游名
    
    # main 是上游的一个分支,其实 git 在这里做了一些简化,实际运行的命令是 `git push origin master:master` 将本地的 master 分支推送到上游 origin 的 master 分支。
    
    # 具体的运行内容为 `git push 上游服务器名 本地分支:远程仓库分支`,如果远程仓库的分支名不存在,则会创建一个分支。
    git push origin master
    

    之后会要求输入用户名和密码,按照要求输入对应信息即可。

    此时再查看对应的远程仓库,可以看到我们的文件已经被推送上去了。

    如果你使提交的仓库不是一个空的仓库,那么可能会出现 类似以下的错误:

    Git 的基本使用

    这是由于两个存储库之间没有公共的祖先,因此导致合并失败。

    可选的解决方法是将两个存储库先在本地合并,然后再提交回去:

    # origin 和 master 需要换成自己对应的上游和分支
    # 使用 --allow-unrelated-histories 允许两个没有关联祖先节点的分支进行合并
    git merge origin/master --allow-unrelated-histories
    
    # 之后,再次提交即可
    git push origin master
    

Git 的基本使用

上一篇:浏览器架构、渲染引擎、chrome架构


下一篇:qwb2021 pwn复现