跳过正文
  1. Notes/

如何快速上手 Git

loading · loading · ·
Linux Git
目录
Git 的快速使用

0.前言
#

Git 是一个快速、可扩展的分布式版本控制系统,它拥有异常丰富的命令集,可以提供高级操作和对内部的完全访问。

更多的介绍可以看 官网 ,简单来说,Git 就是设立一个仓库并记录仓库中的物品。每当仓库中物品有增删改时,都进行记录,每次记录都记为一个版本。

结合 GitHub 等在线托管平台,可以实现多人协作或迭代版本更新等操作,使得项目管理变得更加方便和灵活。

1.安装和配置
#

Git 在各个平台都可以使用,这里我们以 Linux 平台举例,其他平台也可以看官网的 安装教程配置教程

本机系统为 ubuntu 22.04 ,输入:

sudo apt install git-all

即可安装。输入:

git --version

如果得到版本信息,则证明成功安装。之后进行基础配置(这里我们假设常搭配 GitHub 使用):

git config --global user.name "你的 GitHub 用户名"
git config --global user.email 你的GitHub注册邮箱

这里的 --global 是表示电脑上所有的 git 仓库都使用这个用户名,如果需要切换可以自行独立设置。输入:

git config --list

可以看到此时的配置情况。

这里再解释一下,user.nameuser.email 并不是只能用 GitHub 的名称和邮箱,只是我们有使用 GitHub 的需求,因此这样设置。Git 的所有操作都是在本地完成,因此如果不需要上传到如 GitHub 这样的托管平台,那么用户名和邮箱可以随意取。用户名和邮箱只是为了标记每次 git 操作的来源。

2.本地操作
#

0.Git 原理介绍
#

为了更容易理解 git 操作究竟是在做什么,首先介绍一下 git 的原理。如图(指令不完全准确,意会即可):

git 有三个阶段——工作区(Working Directory)、暂存区(Staging Area)、Git 库(Repository

与之对应的是 git 中的文件有三种状态——已修改(modified)、已暂存(staged)、已提交(committed

  • 已修改表示修改了文件,但还没保存到数据库中。
  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交表示数据已经保存在本地数据库中。

值得注意的一点是 git 的每次上传都是一次记录,因此可以轻松退回之前的版本。如图:

假设 git 管理文件 A、B、C,初始时为 version 1。则每次更新都会保存一次快照,而当前只显示最新的快照版本。

1.初始化(init
#

在理解了 git 的工作原理后,我们可以选择一个文件夹(例如 ./myproject)作为 git 库路径,输入:

git init

可以发现在 ./myproject 中出现了一个 .git 文件夹,其中就是这个库的配置文件。以后 ./myproject 就可以作为 git 库进行操作了。但此时库中是空的,若想把 ./myproject 中的文件放入库中,让 git 能够跟踪到这些文件,需要执行后续命令。

2.添加文件到暂存区中(add
#

将需要添加到库中的文件放入 ./myproject 中,输入:

git add 文件名

如需要添加所有文件,则可以输入:

git add .

但此时只是将需要添加的文件放入了暂存区,还需要进一步将暂存区的文件提交到库中。

注意,如果误添加了某个不想添加的文件,可以使用这个命令取消暂存:

git reset HEAD 文件名

3.将暂存区文件提交到库中(commit
#

每次提交会被 git 记录,作为一次快照。因此每次提交我们都需要输入一下版本简介,如:

git commit -m 'version 1'

此时我们暂存区中的文件已经保存到库中,并且带有 version 1 的标记。

注意,如果提交后发现需要修改本次提交,可以使用如下命令重新提交(即不记录旧的提交,而是用新的提交覆盖记录)

git commit -m 'version 1'
git add forgotten_file
git commit --amend

最终只会有一个提交记录。

4.查询状态(status
#

我们在每步操作时都可以查看实时 git 状态,以确保操作正确,输入:

git status

可以看到现在的情况。

5.还原到上一个版本(checkout
#

当你在某个版本的基础上对某个文件进行修改后,可以使用此命令将此文件还原回原版本时的状态。(请谨慎操作,本地修改会完全消失)

git checkout -- 文件名

3.与 GitHub 协作
#

0.分支简介
#

使用 github 前首先需要有一个 github 帐号,并在本文的第 1 节将 user.nameuser.email 配置好。

这里我们需要介绍一下 git 协作中一个重要的概念,就是分支(branch)。这里我们可以把 git 的版本更新想象成一个树状结构,每次版本更新都是一个节点,而多人协作就不可避免出现许多分支,我们这里只进行简单介绍,详细介绍请参考 官方文档

如图,假设一个项目开始时只有 master 做,他使用 master 分支更新。

接下来 iss53 出现了,希望和 master 协作(即修改文件并更新库),于是 iss53 使用最新的版本 C2 进行修改,并更新了 C3 。如图:

此时 hotfix 出现了,但他使用 C2 进行修改,更新了一个 C4,如图:

此时 iss53 已经在 C3 的基础上更新了 C5 ,但 master 不能只选择其中一个人的成果,于是他只能将两个人的成果合并,形成 C6,如图:

但合并并不是那么容易的,如何取舍是一个重要问题。因此,在协作时经常会出现合并冲突,只有将各个版本的冲突文件合理解决(例如同一个文件被分别修改,就需要手动修改,使得该文件在不同版本中不冲突)后才能合并。

某些情况下,我们虽然没与别人协作,但依然会产生版本冲突,多半就是远程仓库中的版本和我们本地库的版本不匹配(一般表现为旧的想要覆盖新的)。此时我们只需要先将旧的备份,然后将新的覆盖旧的,再把备份取回即可。也可以选择强制覆盖(force)。

1.克隆(clone
#

我们使用 git 最常用的事情就是下载别人的库了,首先找到你想克隆的库,右上角 Code 点击后复制链接,接下来输入:

git clone https://github.com/DeathGarurumon/DeathGarurumon.github.io.git

后面的链接改为你复制的即可。克隆完成后,会在你输入命令的根目录下产生一个文件夹。

2.添加远程仓库(remote
#

如果需要持续对一个远程仓库进行上传和下载操作,最好将其配置为一个远程仓库。输入:

git remote add origin https://github.com/DeathGarurumon/DeathGarurumon.github.io.git

这样就将该仓库登记为一个远程仓库了,并且起了一个昵称(origin)。输入:

git remote -v
git remote show origin

可以查看所有的远程仓库以及查看某个远程仓库(origin)的具体信息。

注意,这里的 origin 可以替换为任何名称,只是用来指代后面的链接。

另外输入以下指令可以重命名或移除远程仓库:

git remote rename origin death
git remote remove death

3.从远程仓库下载到本地(pull
#

pull 其实是一个组合指令,可以分成 fetch 和 merge 两个命令。当我们需要将远程仓库覆盖本地时,输入:

git pull origin main

这里的 origin 是远程仓库名称,main 是远程仓库的分支(要求本地和远程的分支相同)。这等价于输入:

git fetch origin main
git merge FETCH_HEAD

4.从本地上传到远程仓库(push
#

在执行 push 前,我们需要先在本地库进行保存,再将本地库版本推送到远程仓库。例如:

git add .
git commit -m 'version 1'
git push origin main

5.(可选)SSH 连接
#

SSH 连接是一种免密连接,相当于“记住密码”的功能。具体步骤可以查看 GitHub 文档 。输入:

ls -al ~/.ssh

可以查看电脑上是否已存在 SSH 密钥。若提示存在,则可直接使用现有密钥。

若不存在,则输入:

ssh-keygen -t ed25519 -C "your_email@example.com"

后面的邮箱要替换为 GitHub 邮箱。提示保存路径,直接回车默认即可。

输入:

cat ~/.ssh/id_ed25519.pub

或者手动打开 ~/.ssh/ 目录,用编辑器打开该文件,复制内容,之后按照以下步骤在 GitHub 上操作即可。

最后,输入:

ssh -T git@github.com

输入 yes ,如果看到以下内容,则证明成功。

> Hi USERNAME! You've successfully authenticated, but GitHub does not
> provide shell access.

4.参考文献
#

1.真正理解 git fetch, git pull

2.Git Book

3.廖雪峰的Git教程