【Git】:基础的基础

时间:2022-07-28
本文章向大家介绍【Git】:基础的基础,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
1. 什么是 Git?
2. 为什么要系统地学 Git?
3. 什么是版本管理?
4. 集中式?分布式?
5. 安装
    5.1. 安装 Git
    5.2. 安装一个 Git GUI Client
6. Bash 基本操作命令
7. Git 配置
    7.1. 查看配置
    7.2. Git配置文件分类
8. 设置用户名与邮箱(用户标识)    
9. 创建 Git 仓库
    9.1. init 新仓库
    9.2. clone 现有仓库
    9.2. 查看仓库状态
10. 查看仓库的历史记录
    10.1. 显示仓库的 commit
    10.2. 简化 git log 的输出
    10.3. 查看 git log 统计信息
    10.4. 查看文件变更细节
11. 向仓库中添加 commit
    11.1. git add 
    11.2. git commit
    11.3. git diff
    11.4. .gitignore
12. 标签、分支、合并
    12.1. Tag
    12.2. Branch
    12.3. Merge
    12.4. Merge Conflict
13. 撤销更改
    13.1. 更改最后一个 commit
    13.2. 还原 commit
    13.3. 重置 commit
        13.3.1. 引用 commit
        13.3.2. 引用 commit

1. 什么是 Git?

Git 是目前世界上被最广泛使用的现代软件版本管理系统。Git 本身亦是一个成熟并处于活跃开发状态的开源项目,它最初是由 Linux 操作系统内核的创造者 Linus Torvalds 在 2005 年创造。今天惊人数量的软件项目依赖 Git 进行版本管理,这些项目包括开源以及各种商业软件。Git 在职业软件开发者中拥有良好的声誉,Git 目前支持绝大多数的操作系统以及 IDE(Integrated Development Environments)。

2. 为什么要系统地学 Git?

  • 很好用
    • 看看 GitHub 的热度...
    • 分支开发(并行开发)能力强
    • 执行速度快
    • 更容易CI/CD
    • 断了网也能工作
    • 安全性强、恢复能力强(当然,需要深刻理解Git...)
  • 有难度
    • 怎么操作?
      • 命令行?
      • 各种GUI(GitDesktop、IDE插件...)
    • 多人协作怎么玩?
      • 有哪些协作方案?
      • 冲突怎么解决?
      • 代码怎么复读?
    • 分支怎么管理?
      • master?dev?hotfix?release?....
      • 命名规范?权限控制?
      • 合并?变基?什么鬼?
    • 操作失误怎么还原?
      • 失误提交
      • 失误合并
      • 失误变基
      • 失误重置
      • 不知道为啥...就失误了

分享一个 Git 思维导图:

高清版下载:https://www.processon.com/mindmap/5f6eeefde401fd64b5dc1eee

3. 什么是版本管理?

版本管理就是管理更新的历史记录。它为我们提供了一些在软件开发过程中必不可少的功能,例如一款软件添加或更改源代码的过程,回滚到特定阶段,恢复误删除的文件等。

4. 集中式?分布式?

  • SVN(Subversion)是集中式的版本管理工具。
    • 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
  • Git 属于分布式的版本控制系统。
    • 仓库之间完全平等,每个人机器上都是一个完整的库。
      • 注:我们通常会选择一个仓库作为 “中央仓库”。
    • 仓库之间可以通过 push 或 pull 同步。

5. 安装

5.1. 安装 Git

  • 下载地址:https://git-scm.com/downloads
  • Git Bash:Unix与Linux风格的命令行,推荐使用。
  • Git GUI:Git 自带的 GUI Client,就是丑了点,功能弱了点。

5.2. 安装一个 Git GUI Client

  • 个人推荐 GitHub Desktop
    • 下载地址:https://desktop.github.com/

6. Bash 基本操作命令

  • cd : 改变目录
    • cd ~:回Home
    • cd . .:回退到上一级目录
  • pwd : 显示当前所在的目录路径
  • clear 清屏
  • history 查看命令历史
  • exit 退出

7. Git 配置

7.1. 查看配置

  • 查看系统级配置
    • git config --system --list
  • 查看用户级配置
    • git config --global --list
  • 查看项目级配置
    • git config --local --list

7.2. Git配置文件分类

  • System 系统级配置(适用于系统所有用户和所有项目)
    • C:Program FilesGitmingw64etc
  • 用户级配置(适用于当前登录用户的配置)
    • C:Program FilesGitmingw64etc
  • 项目级配置(适用于当前登录用户的配置)
    • 项目目录中的 .git/config

8. 设置用户名与邮箱(用户标识)

当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址。这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中。

  • git config --global user.name "zhangsan"
  • git config --global user.email "zhangsan@abc.com"

9. 创建 Git 仓库

9.1. init 新仓库

  • 使用 git init 命令可以在当前目录下创建新的空仓库。
    • 运行此命令可以创建隐藏 .git 目录。此 .git 目录是仓库的核心/存储中心。它存储了所有的配置文件和目录,以及所有的 commit。
git init

9.2. clone 现有仓库

  • git clone 命令用于创建一个与现有仓库完全相同的副本。该命令
    • 会获取现有仓库的路径
    • 默认地将创建一个与被克隆的仓库名称相同的目录
    • 可以提供第二个参数,作为该目录的名称
    • 将在现有工作目录下创建一个新的仓库
 git clone https://github.com/webj2eedev/webj2ee-git-course.git

9.3. 查看仓库状态

  • git status 命令用于显示 Git 仓库的状态。
    • 它将告诉我们 Git 正在考虑什么,以及 Git 所看到的我们仓库的状态。是基础的基础。
git status

10. 查看仓库的历史记录

10.1. 显示仓库的 commit

  • git log 命令用于显示仓库中所有 commit 的信息。
    • 默认情况下,该命令会显示仓库中每个 commit 的:
      • SHA
      • 作者
      • 日期
      • 消息

10.2. 简化 git log 的输出

git log --oneline
  • 每行显示一个 commit
  • 显示 commit 的 SHA 的前 7 个字符
  • 显示 commit 的消息

10.3. 查看 git log 统计信息

git log 命令有一个选项可以用来显示 commit 中更改的文件以及添加或删除的行数。该选项为 --stat(stat 是“统计信息 statistics”的简称):

git log --stat
  • 显示被修改的文件
  • 显示添加/删除的行数
  • 显示一个摘要,其中包含修改/删除的总文件数和总行数

10.4. 查看文件变更细节

  • git log 命令具有一个可用来显示对文件作出实际更改的选项。
    • 该选项是 --patch,可以简写为 -p。
      • 显示被修改的文件
      • 显示添加/删除的行所在的位置
      • 显示做出的实际更改。
git log -p

11. 向仓库中添加 commit

11.1. git add

  • 创建一波文件
  • 检查一波 git 状态
  • 要将所有文件提交到仓库中,首先需要使用 git add 命令将这些文件从工作目录移到暂存区。
git add app.css
git add index.html
git status
  • "Changes to be committed"区域显示了位于暂存区的文件!
  • "git add ." 可以一次性添加所有嵌套文件和目录

11.2. git commit

  • git commit 命令会取出暂存区的文件并保存到仓库中。
    • 可以使用 -m 选项指定 commit 信息
git commit -m "新增HTML、CSS文件"

11.3. git diff

  • git diff 命令可以查看工作树、暂存区、最新提交之间的差别。
    • git diff:查看工作树与暂存区的差别。
    • git diff HEAD:查看工作树和最新提交的差别。

11.4. .gitignore

  • .gitignore 文件用来告诉 git 不应跟踪的文件。该文件应该放在 .git 目录所在的目录。

12. 标签、分支、合并

12.1. Tag

Git 可以给仓库历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)

  • git tag 命令用来标记特定的 commit 。
    • 添加标签
      • git tag -a v1.1 -m "my version 1.1"
    • 向指定的 commit 添加标签
      • git tag -a v1.0 03e8dd7 -m "my version 1.0"
    • 删除标签
      • git tag -d v1.0
    • 显示仓库中的所有标签
      • git tag

12.2. Branch

这个视频不错哟

  • git branch
    • 列出仓库中的分支
  • git branch sidebar
    • 创建一个叫做 "sidebar" 的分支
  • git checkout sidebar
    • 切换到 "sidebar" 分支
      • 从工作目录中删除 git 跟踪的所有文件和目录
      • 转到仓库,并提取分支指向的 commit 所对应的所有文件和目录
  • git branch -d sidebar
    • 删除 "sidebar" 分支
      • 无法删除当前所在的分支
      • 如果某个分支上有任何其他分支上都没有包含的 commit(也就是这个 commit 是要被删除的分支独有的),git 不会删除该分支。
  • git checkout -b footer master
    • 基于 master 分支,创建并切换到 footer 分支上

12.3. Merge

这个视频同样不错

  • 将分支组合到一起称为合并。
    • 当你要合并分支时,务必知道当前位于哪个分支上。注意,合并分支会提交 commit。
    • 当我们合并时:
      • 我们将其他分支合并到当前(检出的)分支上。
      • 我们不是将两个分支合并到一个新的分支上。
      • 也不是将当前分支合并到其他分支上。
  • git 有两种合并:
    • 普通合并(no-fast-forward merge)
      • If we committed changes on the current branch that the branch we want to merge doesn't have, git will perform a no-fast-forward merge.
      • With a no-fast-forward merge, Git creates a new merging commit on the active branch. The commit's parent commits point to both the active branch and the branch that we want to merge!
  • 快进合并(Fast-forward merge)
    • A fast-forward merge can happen when the current branch has no extra commits compared to the branch we’re merging. 快进合并将使当前检出的分支向前移动,直到它指向与另一个分支指向的 commit 一样为止。
  • git merge 指令用来合并 git 分支,它将:
    • 查看将合并的分支
    • 查看分支的历史记录并寻找两个分支的 commit 历史记录中都有的单个 commit
    • 将单个分支上更改的代码行合并到一起
    • 提交一个 commit 来记录合并操作
git merge <name-of-branch-to-merge-in>

12.4. Merge Conflict

当相同的行在要合并的不同分支上做出了更改时,就会出现合并冲突。git 将在合并途中暂停,并告诉你存在冲突,以及哪些文件存在冲突。要解决文件中的冲突:

  • 找到并删掉存在合并冲突指示符的所有行
  • 决定保留哪些行
  • 保存文件
  • 暂存文件
  • 提交 commit

13. 撤销更改

13.1. 更改最后一个 commit

  • git commit --amend
    • 如果你的工作目录没有内容(也就是仓库中没有任何未 commit 的更改),那么运行 git commit --amend 将使你能够重新提供 commit 消息。
    • git commit --amend 使你能够包含忘记包含的文件(或文件更改)
      • 编辑文件
      • 保存文件
      • 暂存文件
      • 运行 git commit --amend

13.2. 还原 commit

当你告诉 git 还原(revert) 具体的 commit 时,git 会执行和 commit 中的更改完全相反的更改。

git revert <SHA-of-commit-to-revert>

此命令:

  • 将撤消目标 commit 所做出的更改
  • 创建一个新的 commit 来记录这一更改

13.3. 重置 commit

一定要谨慎使用 git 的重置功能。这是少数几个可以从仓库中清除 commit 的命令。如果某个 commit 不再存在于仓库中,它所包含的内容也会消失。

先看个视频

13.3.1. 引用 commit

你已经知道可以使用 SHA、标签、分支和特殊的 HEAD 指针引用 commit。有时候这些并不足够,你可能需要引用相对于另一个 commit 的 commit。例如,有时候你需要告诉 git 调用当前 commit 的前一个 commit,或者是前两个 commit。我们可以使用特殊的“祖先引用”字符来告诉 git 这些相对引用。这些字符为:

  • ^ – 表示父 commit
  • ~ – 表示第一个父 commit

我们可以通过以下方式引用之前的 commit:

  • 父 commit – 以下内容表示当前 commit 的父 commit
    • HEAD^
    • HEAD~
    • HEAD~1
  • 祖父 commit – 以下内容表示当前 commit 的祖父 commit
    • HEAD^^
    • HEAD~2
  • 曾祖父 commit – 以下内容表示当前 commit 的曾祖父 commit
    • HEAD^^^
    • HEAD~3

^ 和 ~ 的区别主要体现在通过合并而创建的 commit 中。合并 commit 具有两个父级。对于合并 commit,^ 引用用来表示第一个父 commit,而 ^2 表示第二个父 commit。第一个父 commit 是当你运行 git merge 时所处的分支,而第二个父 commit 是被合并的分支。

13.3.2. git reset 命令

  • git reset 命令用来重置(清除)commit:
git reset <reference-to-commit>
  • 可以用来:
    • 将 HEAD 和当前分支指针移到目标 commit
    • 清除 commit
    • 将 commit 的更改移到暂存区
    • 取消暂存 commit 的更改
  • git reset 的选项:
    • --mixed:更改未暂存
    • --soft:更改被移到暂存区
    • --hard:更改被清除

学习资料:

https://try.github.io/ https://learngitbranching.js.org/?locale=zh_CN https://ohshitgit.com/ https://geeeeeeeeek.github.io/git-recipes/ https://dev.to/lydiahallie/cs-visualized-useful-git-commands-37p1 https://cn.udacity.com/course/version-control-with-git--ud123 https://chris.beams.io/posts/git-commit/

快捷连接:

Git 官网 https://git-scm.com/ Git 下载地址: https://git-scm.com/downloads Git GUI Clients 下载地址: https://git-scm.com/downloads/guis GitHub Desktop: https://desktop.github.com/