Git 精简教程

394 阅读6分钟

本篇文章主要对 Git 常用命令和逻辑进行了一个精简总结。

1.版本控制

在 Word 文档中,我们可以通过 CTRL+Z 进行历史版本回滚,Git 版本控制的功能类似 Word 且更强大。

目前版本控制分为两大类:

  • 集中式:所有用户连接一个中央主仓库 如 CVS

  • 分布式:每个用户在自己电脑上都有一个完整仓库,如 GIT

分布式的可靠性比集中式更高,因为每个人都有仓库的拷贝,代码不易丢失;

且在大型项目中,每个人在本地仓库进行小的提交,完成一个模块后提交到主仓库,方便项目管理。

2.学习方式

Git 仓库可以存在你本地的计算机中,GitHub 的仓库中,其他人计算机中的仓库中。

我们先学习本地操作,再学习操作自己的 GitHub 远程仓库,最后学习如何提交更改到其他人的 GitHub 仓库。

3.Git 术语

了解 Git 的术语对实际操作的理解至关重要。

术语说明
提交每次 commit(提交),Git 会对文件当时的状况拍照并存储。可以将其看做游戏中的保存点。你在 Git 中的所有操作最终都会 commit, commit 是 Git 中的基本单位。
仓库仓库(Repository)是一个包含项目内容的目录,也叫Git仓库。git init 后的目录就是一个仓库。
工作目录工作目录(Working Directory)是你在文件系统中看到的文件。当你在代码编辑器中打开项目文件时,你是在工作目录中处理文件。工作目录与仓库内容分离,工作目录中只能取仓库某一 commit 对其更改。
暂存区Git 目录下的一个文件,存储的是即将进入下个 commit 内容的信息。可以将暂存区(Staging Index)看做准备工作台,暂存的文件是准备添加到仓库中的文件。
版本库Git 仓库文件夹中有一个隐藏目录 .git , 里面记录了commit历史。
检出检出(Checkout)是指将版本库中某个commit的内容复制到工作目录下。
SHASHA 是全称是"Secure Hash Algorithm"(安全哈希算法),用来标记每个 commit 的 ID 编号。SHA根据 Git 中的文件或目录结构的内容计算得出,不会重复。
分支分支(Branch)是从主开发流程中分支出来的新的开发流程。可以用于软件分支如 dev、bugfix、feature 分支。可以将分支当作游戏中的保存点,开辟新分支进行有风险的尝试。

4.本地仓库的基础操作

我们先学习如何在本地新建仓库,并进行一次 commit,来保存一次快照。

创建仓库

新建仓库的两种方式:

  • git init 本地新建一个仓库,参数为仓库名称
  • git clone 克隆一个远程仓库,参数为远程仓库地址

在实际操作中,我们将 Git 仓库逻辑上分为三个区域:工作目录、暂存区、版本库

添加暂存

新建仓库后,进入仓库目录下添加文件 add.txt

可以使用 git status 查看当前仓库的文件修改状态,看看哪些文件需要添加到暂存区。

将文件添加到暂存区的方式:

  • git add add.txt 将文件加入暂存区
  • git add * 将目录下所有文件添加入暂存区

可以在目录下设置 .gitignore 添加需要排除的文件。

提交版本库

现在将文件提交到版本库

git commit -m "添加了add.txt" 将暂存区的文件提交到版本库,并设置提交的主题为“添加了add.txt”。

可以使用 git log --oneline 来查看简短的 commit 记录。

通过 git show SHA 的方式查看某次的 commit 详情:作者、日期、commit主题、更改

新建标签

当软件开发到一定程度,达到一个版本功能可以为其添加标签。

git tag -a v1.0.0 为当前 commit 添加标签 "v1.0.0"

git show v1.0.0 查看该标签的详情

git tag -d v1.0.0 删除该版本标签

创建分支

Git 仓库中有一个默认分支 master,在实际开发中我们常建立 dev 分支并在该分支进行开发。

可以使用 git branch 命令查看所有分支和当前所在分支

git branch dev 新建 dev 分支

git checkout dev 切换到 dev 分支,此后的 commit 都会提交到 dev 分支上

合并分支

当我们开发完成后,需要将 dev 分支合并到 master 分支,确保 master 分支为当前最新版本。

我们需要切换到 master 分支,然后将 dev 分支合并到 master 分支。

执行git merge dev

合并冲突

dev 分支与 master 分支修改了同一代码,合并时会出现合并冲突,需要取舍保留哪个分支的更改。

编辑器中的字符:

  • <<<||| 显示的是当前 master 分支上修改后的内容
  • |||---- 向您显示 master 分支与 dev 分支修改前共同的内容是什么
  • --->>> 显示的是 dev 分支上修改后的内容,也就是要合并分支的内容

修改后提交到暂存区,然后提交到版本号。

5.提交到远程仓库

当我们执行 git clone 后,Git 为我们添加了一个远程仓库地址,可以采用 git remote -v 查看。

若想将远程仓库的最新更改赋值到本地,可以执行 git pull <远程仓库名> ,这会自动将远程仓库内容复制到本地并进行了自动合并。如果出现合并冲突需要先解决冲突再暂存提交。

若不想执行自动合并,可以采用 git fetch <远程仓库名> 来拉取远程仓库的内容到本地,但不会自动合并,工作目录的代码不合并远程仓库代码,需要执行 git merge <仓库名>/<分支名> 来进行合并。

当完成合并后执行 git push <远程仓库名> <分支名> 将本地更改提交到远程仓库。

6.提交到其他人的仓库

无论是企业开发或开源项目,我们都需要提交代码到其他人的仓库。

其基本方式是 Fork 一个仓库到你的 GitLab 、Gitee 或 GitHub 账户下,将账户下的仓库拷贝到本地进行开发。

每次代码提交先提交到本地仓库,然后再提交到 GitLab 、Gitee 或 GitHub 账户下的 fork 仓库,最后在仓库托管平台上该仓库处发起 合并请求 merger request拉请求 pull request 请求原先项目的拥有者合并你提交到 fork 仓库的代码。

7.与其他人仓库保持同步

当我们新建拉请求后, 需要保证我们的版本库包含被 Fork 仓库的提交,避免代码合并冲突。

所以需要使本地、远程 Fork 仓库与被 Fork 仓库保持同步。

还记得 git remote 命令,我们需要执行 git remote add <被fork仓库名> <仓库地址> 来添加一条远程仓库。

然后执行 git pull <被fork仓库名> <分支名> 将被 Fork 的仓库上的代码拉取到本地并合并。再进行 git push <fork仓库名> <分支名> 将账户下 Fork 仓库更新。

最后在远程仓库平台 GitHub 等进行 pull request 或 合并请求,使原作者将你的更改合并到他的仓库中去。

8.其他常用命令

使用 git log --author="名字" 来查看某个人的提交历史。

使用 git revert SHA 命令,后面加要还原的 commit SHA, Git 还原(revert) 具体的 commit 时,Git 会恢复上次 commit 的更改,并提交一个 commit 保存还原的内容。

使用git reset --mixed 命令用于重置(删除)提交,并将删除的内容回退到工作目录