🚀 Git 简介

GitLinus Torvalds 为了帮助管理 Linux 内核源码而开发的一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行,所以在断网的情况下仍然可以提交代码,切换分支。Git 又使用了 SHA-1 哈希算法确保了在文件传输时变得不完整、磁盘损坏导致数据丢失时能立即察觉到。

image-20221010154859671

  • workspace:工作区

  • staging area:暂存区/缓存区

  • blocal repository:本地仓库

  • remote repository:远程仓库

✈️ Git 的优点

1、适合分布式开发,强调个体。

2、公共服务器压力和数据量都不会太大。

3、速度快、灵活。

4、任意两个开发者之间可以很容易的解决冲突。

5、离线工作。

✈️ Git 的缺点

1、模式上比 SVN 更加复杂。

2、不符合常规思维。

3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

✈️ 小知识:Git 名字的由来

git 在英语俚语意思是蠢货,自以为是且好辩的人。以下是作者本人的话:

I’m an egotistical bastard, and I name all my projects after myself. First ‘Linux’, now ‘Git’.
我是个任性的杂种,我把所有我做的项目以我自己命名。先是’Linux’,这次是’Git’.

除此以外,还有一个解释。

2005年4月7日,Linus Torvalds 对 Git 的代码进行首次提交时,添加了一个名为 README 的文件。这个文件的第一段是这样写的:

GIT - the stupid content tracker

“git” can mean anything, depending on your mood.

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of “get” may or may not be relevant.

  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.

  • “global information tracker”: you’re in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.

  • “goddamn idiotic truckload of sh*t”: when it breaks

This is a stupid (but extremely fast) directory content manager. It doesn’t do a whole lot, but what it does do is track directory contents efficiently.

从上面这段话中我们可以看出,Linus 对 Git 的含义做出了多种解释:

  1. 第一个原因可以看做是实用性的原因。一个三个字母的命令说起来快,打起来也容易。
  2. “Git “这个词没有被任何其他现有的Unix命令所使用。
  3. Git最初的工作版本的代码非常简单,功能很弱。
  4. 表示Global Information Tracker的缩写,如果能正常工作时。
  5. 表示Goddamn Idiotic Truckload of sh*t的首字母缩写,如果不能正常工作时。

🚀 Git 基本环境搭建

✈️ 初始化仓库

在想要创建本地仓库的目录下单击鼠标右键,选择 Git Bash Here ,在 git 终端 输入命令 git init 创建一个本地仓库。

此时会自动生成一个 master 分支,并在该目录下建立 .git 目录。

image-20221010163039891

每个项目有且只有一个 .git 目录,为项目存储所有元数据和对象数据库,这些对象指向不同的分支。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。其内容释义如下:

  • HEAD # 这个项目当前指向哪个分支
  • config # 项目的配置信息, git config 命令会改动它
  • description # 用来显示对仓库的描述信息
  • hooks/ # 包含客户端或服务端的钩子脚本,在特定操作下自动执行
  • index # 暂存区文件,是一个二进制文件
  • logs/ # 保存日志信息
  • objects/ # 存储所有数据内容,本地的版本库存放位置
  • info # 信息文件夹. 包含一个全局性排除文件,可以配置文件忽略
  • refs/ # 存储指向数据的提交对象的分支

==> 切记:不要手动去修改或删除 .git 文件夹中的内容。==

✈️ 生成 SSH Key

输入以下命令,即可创建 SSH Key

1
2
ssh-keygen				# 本地仓库生成 SSH Key
cat ~/.ssh/id_rsa.pub # 查看 SSH Key

将生成的 Key 复制,绑定到 Gitlab (http://gitlab.shcm.longsys.com )上,即可在本地和远程仓库之间进行操作了。如下图所示:

图片1

✈️ 配置用户信息

1
2
3
git config --global user.name "<USER>"		# 设置用户名,将<USER>替换成自己的用户名
git config --global user.email "<Email>" # 设置邮箱,将<Email>替换成自己的邮箱
git config --list # 查看配置信息

🚀 Git 常用命令

✈️ 常用的命令

1
2
3
4
5
6
git init							# 初始化并创建一个仓库
git add . # 添加所有文件到暂存区
git commit -m "提交说明" # 提交暂存区中的内容到本地仓库
git log # 查看提交的版本
git status # 查看所有文件的状态
git status [filename] # 查看指定文件的状态

✈️ 分支与合并相关命令

1
2
3
4
5
6
git branch                          # 查看本地分支
git branch [branch-name] # 新建一个分支,但依然停留在当前分支
git checkout -b [branch] # 新建一个分支,并切换到该分支
git checkout [branch-name] # 切换到指定分支,并更新工作区
git branch -d [branch-name] # 删除本地分支
git merge [branch] # 合并指定分支到当前分支

✈️ 网络常用命令

1
2
3
4
git clone <远程仓库地址>						# 克隆一个远程仓库到本地
git push <远程主机名> <本地分支名>:<远程分支名> # 把当前分支放到网上,如网络分支不存在则网络端自动创建一个分支!
git push <远程主机名> -d <分支名> # 删除远程分支
git pull <远程主机名> <远程分支名>:<本地分支名> # 从远程获取最新版本的代码并合并到本地的版本

其中远程主机名默认为 origin ,也可以通过 git remote 命令查询,当远程分支名和本地分支名相同时,可省略冒号以及后面的分支名。

🚀 参考资料