学习之前可以先看看这两个

Git 介绍

一个免费开源的分布式版本控制系统

安装

安装 | 官网

直接去官网安装即可,这里我是 mac 电脑,直接用 homebrew 安装就可以

brew install git

mac 直接打开终端就可以使用了,windows 需要通过右键打开 git bash 来使用

基础配置

git config --global user.name "xxx"
git config --global user.email xxx@example.com

这两个命令用于配置 Git 的提交者身份信息:user.name 设置提交记录中显示的用户名,user.email 设置提交记录中显示的邮箱;加上 --global 表示这套配置对当前电脑用户下的所有 Git 仓库都生效。它们不会用于登录 GitHub,也跟 GitHub 账号没关系,只是用来标记每次代码提交是谁提交的,方便在 GitHub、Gitee、GitLab 等平台上关联提交记录和账号。

{% note info %}
你填啥都没有问题,只是对你提交身份的一个说明,你写名字是二狗都没问题
{% endnote %}

Git 命令

创建仓库

在一个文件夹(你的项目文件夹)中执行

git init

执行完之后就创建了一个本地 Git 仓库,本质上是多了一个隐藏的 .git 目录,这个仓库完全在本机,所以不联网也能使用大部分功能,比如提交到本地或在回滚之类的。只有推送到远程仓库或从远程仓库拉取代码时,才需要联网。

克隆仓库

git clone https://github.com/torvalds/linux.git

通过这个命令来克隆网络上的一个 Git 项目,但是我们通常没有权限直接 push 到原仓库,我们只能推送到自己有权限的远程仓库。

Git 文件状态和提交版本

创建仓库后,仓库中的新文件默认是未被 Git 跟踪的。如果没有通过 git add 把这些文件加入暂存区,那么执行 git commit 生成新版本时,这些文件不会被记录到该版本中。既然文件本身都没有进入版本记录,那么它之前的内容状态和修改过程也不会被 Git 保存。

{% note warning %}
创建 Git 仓库后,仓库中的新文件默认处于未跟踪状态。未跟踪文件在没有执行 git add 之前,只是普通文件,Git 不会记录它的内容变化;如果直接提交,这些文件不会进入版本记录。只有当文件被 git add 加入暂存区,并通过 git commit 提交后,Git 才会从该次提交时的文件内容开始进行版本管理,之前的修改过程 Git 是不知道的。
{% endnote %}

跟踪

通过下面的命令来跟踪一个文件或者目录

git add <name>

git add filename       # 将单个文件添加到暂存区
git add .              # 将工作区中的所有修改添加到暂存区

取消跟踪

如果你不想跟踪这个文件或者目录来,你可以用下面的命令

git rm <name>

git rm --cache <name>  # 可以将项目保存在目录中,只删除跟踪标志

{% note info %}
git rm <name> 是 从 Git 仓库和本地工作区都删除文件;git rm --cached <name> 是 只从 Git 仓库的跟踪记录中删除文件,但本地文件还保留。
{% endnote %}

文件状态修改

当你修改完了之后,你想把变更放到暂存区,那就要再次执行 git add,也就是说你改动的东西只要没 git add,Git 就不知道你变更了文件,就只会提交你上次 git add 时的内容

git add <file-name>   # 设置缓存状态,放入暂存区

如果你后悔了,不想提交了,可以执行

git reset HEAD <name>

取消缓存状态,从暂存区撤回来,不进入下一次提交了,暂存区的该文件回退到你上次 git commit 时的文件版本(你工作区的还是不变,还是你改动后的内容)。

{% note info %}
也就是说即使你中间 git add 了 5 次,但是没提交,那这 5 次 git add 都失效了。但是本地文件还是你改动后的,没影响。
{% endnote %}

提交/取消修改

之后你想提交修改的内容,就用下面的命令

git commit -m '修改xxx'   # 提交命令

如果你提交之后又不想提交了,可以进行撤回

git reset head~ --soft  # 撤销提交(无法撤销第一次)

查看文件状态

git status     # 查询文件状态

如果想看更细致的,文件修改前后的区别,可以用下面的命令

git diff          # 查看文件与修改前区别

如果想查看之前历史的提交

git log           # 查看日志文件

git log --pretty  # 美化输出,可以格式化输出

  %h 简化哈希     # 提交记录的一个哈希值,可以通过哈希值找到我们本次的提交

  %an 作者名字

  %ar 修订日期(距今)

  %ad 修订日期

  %s 提交说明

# 比如
git log --pretty=format:"%h-%an, %ar:%s"

git log --graph   # 以图形化形式显现

Git 远程仓库

我们可以在 GitHub 上自己创建一个仓库,也就是远程仓库了

链接远程仓库

git remote add origin https://xxx.git  # origin 是给远程仓库起的别名,一般就叫 origin,名字只在本地仓库有效

git remote rename 原远程仓库别名 新远程仓库别名

git remote  # 查看当前本地仓库配置了哪些远程仓库别名

git remote -v  # 如果还想看对应的 URL

# 显示如下
origin  https://github.com/xxx/test.git (fetch)  # 从这个远程仓库拉取代码
origin  https://github.com/xxx/test.git (push)   # 向这个远程仓库推送代码

推送

git push origin master  # 向 origin 仓库推送 master 分支

推送需要认证身份,github 无法使用用户名密码认证方式,进入官网生成 token

然后设置有效期,名字,仓库权限,这里是权限全打开,然后生成

这样输入用户名你就用用户名,密码就用这个 token 就可以了,但是这种比较麻烦,有更方便的方式

通过 SSH 协议生成密钥进行认证

  • 用来本机和 GitHub、Gitee、GitLab 建立免密连接

首先进入用户的 ssh 目录中

cd ~/.ssh

生成 SSH 密钥

ssh-keygen -t rsa -b 4096 -C "xxx@qq.com"
  • -t rsa 是生成密钥的算法
  • -b 4096 选择生成的大小
  • -C "xxx@qq.com" 推荐写个人邮箱

执行后要求输入密钥名,比如 mac-git,然后设置一个密码

查看并复制密钥文件内容

复制公钥的内容

进入 github 的 SSH and GPG keys 页面添加密钥

完整的复制过来就可以,包括结尾的邮箱和开头的 ssh-rsa

这样之后我们克隆项目就可以不用再验证身份之类的了

之后我们再克隆就 git clone SSH链接 就可以了

Git 分支

Git 每次提交都会生成一个 commit 对象,这个对象有唯一的哈希值。通过这个 commit 对象,可以找到本次提交对应的项目快照,也就能恢复到这个版本的代码。每个 commit 对象还会记录它的上一个提交对象,也就是 parent,所以多个提交对象会通过 parent 串成一条历史链。分支本质上是一个只记录“最新一次 commit 哈希值”的指针文件。Git 通过这个最新提交,再沿着每个 commit 的 parent 往前找,就能找到这个分支的完整提交历史。HEAD 指向我们当前所在的分支(你不能一次操作两个分支吧),而当前分支再指向某个最新的 commit 对象。

master/main 保存线上稳定版本;develop 用于日常功能集成;开发新功能时,从 develop 拉出 feature 分支来完整不同的功能模块,完成后合并回 develop;准备发布时,从 develop 拉出 release 分支进行测试和修复,完成后合并到 master/main 并打 tag;线上版本出现紧急问题时,从 master/main 拉出 hotfix 分支修复,修完后同时合并回 master/maindevelop

使用分支

我们可以通过下面的指令看到当前的分支

git log

git status
   也可以通过这个命令查看所有的分支
git branch --list 

前面带 * 的就是当前分支

想创建、切换分支就可以用下面的命令

git branch 新分支名
git checkout -b 新分支名  # 创建并切换到新分支

git checkout 分支名  # 切换分支

显示提交日志

git log --all

git log --all --graph  # 显示更加直观的日志
  

分支合并

git merge 融合分支 # 合并分支

也就是把当前分支和某个分支文件内容合并

如果要合并的两个分支都修改了同一个地方就会报错,因为不知道要保留哪一个

git status  # 查看哪里有冲突

比如这里说都修改了 test_file

进入到冲突文件中, 选择一个分支的内容保留下来, 保存退出

这里它会给你标注上冲突的地方,我们只需要选择某一块保留的就可以,比如想留下来 feature2 分支的内容,就是把红色标注的地方都去掉,然后保存即可

冲突解决后就可以提交了

git add 文件名

git commit -m '提交描述'

git log --all --graph 查看合并状态

推送、拉取、跟踪远程分支

git push 仓库名 分支名

# 比如
git push origin master

但是每次都要写仓库名和分支名也挺麻烦,我们可以

git push -u 仓库名 分支名

这样第一次使用 -u 指定推送目标后,后面可以直接使用 git push,就等价于 git push origin master

git push -u origin master # 第一次推送

git push # 第二次推送

如果想拉取远程仓库的分支

git fetch  # 拉取分支

远程分支拉取到本地后,并不一定会自动变成本地分支。它通常会先以 origin/分支名 的形式存在,表示“远程分支在本地的跟踪记录”。如果想基于远程分支创建一个本地分支,可以先通过 git branch -r 查看远程分支名,再创建对应的本地分支。

# 查看远程分支
git branch -r

# 查看本地分支和远程分支
git branch -a

# 基于远程分支创建本地分支
git checkout -b 本地分支名 远程分支名

# 自动创建本地分支,并跟踪对应远程分支
git checkout --track 远程分支名

# 比如
git checkout -b dev origin/dev
# 或者
git checkout --track origin/dev

贮藏功能

用于功能写一半了,但是我们又需要切到别的分支上去修改内容,这个时候也不适合去提交来保持我们的修改,我们就可以贮藏一下我们当前分支修改的内容,然后再去切换分支

git stash
# 等价于
git stash push

当前分支修改到一半想要切换分支不允许,可以用此命令将当前分支修改的东西储藏起来再切换

git stash apply  # 恢复暂存内容,stash 记录仍保留

切换回来后恢复之前存储的内容

git stash list

文件可以多次存储,所以我们可以查看存储记录列表,可以通过

git stash apply stash@{记录号}

恢复到指定记录

git stash pop

恢复并删除最近一次记录

git stash drop @stash{记录号}

删除指定记录

重置、变基

重置

撤销我们某次 commit 的操作

git reset --soft HEAD~

{% note waning %}
注意:HEAD 就是当前提交,所以 git reset --soft HEAD 基本没什么效果。因为本来就在当前提交上,没有往回退。所以一般用 HEAD~ 或者 HEAD~数字
{% endnote %}

  • HEAD:当前提交。
  • HEAD~:当前提交的上一个提交。
  • HEAD~2:从当前提交往前数两个提交,不是简单说“倒数第二次提交”。
  • --soft:只回退提交记录,代码修改还保留在暂存区,相当于取消了 commit,但没有取消 git add。
  • 默认不加参数时,相当于 --mixed,例如 git reset HEAD~,会回退提交记录,并取消暂存状态,修改内容还在工作区。
  • --hard:回退提交记录,同时重置暂存区和工作区,代码修改也会被丢弃,彻底回到目标提交的状态,不推荐随便用。

变基

还不太懂这个,如果用到再学习

git checkout B

git rebase A

上述命令将 B 分支的修改移动到 A 分支

{% note danger %}
注意其他人在远程分支二次开发时,慎用变基
{% endnote %}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐