文章目录
- [1 安装与卸载 git](#1 安装与卸载 git)
-
- [1.1 安装](#1.1 安装)
- [1.2 卸载](#1.2 卸载)
- [2 基本操作](#2 基本操作)
-
- [2.1 创建本地仓库](#2.1 创建本地仓库)
- [2.2 配置本地仓库](#2.2 配置本地仓库)
- [2.3 工作区、暂存区、版本库](#2.3 工作区、暂存区、版本库)
- [2.4 添加文件](#2.4 添加文件)
- [2.5 版本回退](#2.5 版本回退)
- [2.6 撤销修改](#2.6 撤销修改)
-
- [2.6.1 只撤销工作区(未 git add)](#2.6.1 只撤销工作区(未 git add))
- [2.6.2 撤销工作区和暂存区(已 git add 但未 commit)](#2.6.2 撤销工作区和暂存区(已 git add 但未 commit))
- [2.6.3 撤销工作区、暂存区和版本库](#2.6.3 撤销工作区、暂存区和版本库)
- [2.7 删除文件](#2.7 删除文件)
- [3 分支管理](#3 分支管理)
-
- [3.1 创建、切换、合并分支](#3.1 创建、切换、合并分支)
- [3.2 删除分支](#3.2 删除分支)
- [3.3 合并冲突](#3.3 合并冲突)
- [3.4 合并模式](#3.4 合并模式)
-
- [3.4.1 Fast-forward 合并场景](#3.4.1 Fast-forward 合并场景)
- [3.4.2 非 Fast-forward 合并场景](#3.4.2 非 Fast-forward 合并场景)
- [3.4.3 Fast-forward 的三种模式](#3.4.3 Fast-forward 的三种模式)
-
- [3.4.3.1 默认模式(`--ff`)](#3.4.3.1 默认模式(
--ff)) - [3.4.3.2 强制 Fast-forward(`--ff-only`)](#3.4.3.2 强制 Fast-forward(
--ff-only)) - [3.4.3.3 禁用 Fast-forward(`--no-ff`)工作中更推荐使用](#3.4.3.3 禁用 Fast-forward(
--no-ff)工作中更推荐使用)
- [3.4.3.1 默认模式(`--ff`)](#3.4.3.1 默认模式(
- [3.5 bug 分支](#3.5 bug 分支)
-
- [3.5.1 git stash 介绍](#3.5.1 git stash 介绍)
-
- [3.5.1.1 典型开发场景](#3.5.1.1 典型开发场景)
- [3.5.2 修复bug时使用的方法](#3.5.2 修复bug时使用的方法)
-
- [3.5.2.1 法一(不推荐)](#3.5.2.1 法一(不推荐))
- [3.5.2.2 法二(推荐)](#3.5.2.2 法二(推荐))
- [3.6 强制删除分支](#3.6 强制删除分支)
- [4 远程操作](#4 远程操作)
-
- [4.1 克隆远程仓库](#4.1 克隆远程仓库)
-
- [4.1.1 使用 HTTPS](#4.1.1 使用 HTTPS)
- [4.1.2 使用 SSH](#4.1.2 使用 SSH)
- [4.2 向远程仓库推送](#4.2 向远程仓库推送)
- [4.3 拉取远程仓库](#4.3 拉取远程仓库)
- [4.4 查看 / 绑定远程仓库分支](#4.4 查看 / 绑定远程仓库分支)
- [4.5 在远程仓库创建分支](#4.5 在远程仓库创建分支)
-
- [4.5.1 远程创建分支(推荐)](#4.5.1 远程创建分支(推荐))
- [4.5.2 本地创建分支(不推荐)](#4.5.2 本地创建分支(不推荐))
- [4.6 忽略特殊文件](#4.6 忽略特殊文件)
- [4.7 配置命令别名](#4.7 配置命令别名)
- [5 标签管理](#5 标签管理)
-
- [5.1 操作标签](#5.1 操作标签)
- [6 多人协作](#6 多人协作)
-
- [6.1 多人在同一分支下进行开发(不常见)](#6.1 多人在同一分支下进行开发(不常见))
-
- [6.1.1 解决冲突](#6.1.1 解决冲突)
- [6.1.2 将内容合并进 master](#6.1.2 将内容合并进 master)
-
- [6.1.2.1 PR(推荐)](#6.1.2.1 PR(推荐))
- [6.1.2.2 本地(不推荐)](#6.1.2.2 本地(不推荐))
- [6.2 在不同分支下进行开发](#6.2 在不同分支下进行开发)
-
- [6.2.1 切换分支开发](#6.2.1 切换分支开发)
- [6.3 将内容合并进 master](#6.3 将内容合并进 master)
- [6.4 解决 git branch -a 打印已被删除的远程分支](#6.4 解决 git branch -a 打印已被删除的远程分支)
- [7 文章末尾定位](#7 文章末尾定位)
1 安装与卸载 git
1.1 安装
ssh
sudo apt-get install git -y
1.2 卸载
ssh
sudo apt-get remove git -y
2 基本操作
2.1 创建本地仓库
在当前文件夹下创建 git 仓库
ssh
git init
2.2 配置本地仓库
配置 name
ssh
git config user.name "用户名"
配置 email
ssh
git config user.email "邮箱"
查看当前仓库的所有配置项
ssh
git config -l
重置配置
ssh
# 重置用户名
git config --unset user.name
# 重置邮箱
git config --unset user.email
全局配置
ssh
# 配置 name
git config --global user.name "用户名"
# 配置 email
git config --global user.email "邮箱"
重置全局配置
ssh
# 重置用户名
git config --global --unset user.name
# 重置邮箱
git config --global --unset user.email
2.3 工作区、暂存区、版本库
Git 工作区、暂存区和版本库概念:
- 工作区: 就是你在电脑里能看到的目录。
- 暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库: 工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

2.4 添加文件
将指定文件的修改添加到暂存区
ssh
git add 文件名 [文件名]
将当前目录下所有的修改都添加到暂存区
ssh
git add .
将暂存区中的修改提交到本地仓库中
ssh
git commit -m "日志说明"
查看提交记录
ssh
git log

打印更漂亮的记录
ssh
git log --pretty=oneline

查看 git 仓库的状态
ssh
git status
显示暂存区和工作区的差异
ssh
git diff [文件名]

2.5 版本回退
ssh
git reset [--soft | --mixed | --hard] [HEAD]
- HEAD 是一个指针,指向当前所在的分支的最新提交
假设我有一个 ReadMe 文件,这个文件的第一个版本中的内容是 "git",第二个版本中的内容是 "git world"。现在我想要进行版本回退:

git rest 命令的本质是回退版本库中的内容。
git rest --hard 慎用!
查看本地的提交记录
ssh
git reflog
什么是 reflog?
- 引用日志:记录所有 HEAD 和分支引用的变更历史
- 本地专属:只存在于你的本地仓库,不会推送到远程
- 时间有限:默认保留90天,之后会被Git自动清理
2.6 撤销修改
2.6.1 只撤销工作区(未 git add)
ssh
git checkout -- [文件名]
注意:在较新版本的 Git 中,推荐使用更明确的命令:
ssh
# 撤销单个文件
git restore [文件名]
# 撤销所有文件
git restore .
2.6.2 撤销工作区和暂存区(已 git add 但未 commit)
分两步走
ssh
# 回退暂存区
git reset HEAD [文件名]
# 回退工作区
git checkout -- [文件名]
# 或使用新命令:git restore [文件名]
- HEAD :表示要回退到当前版本,如果是
HEAD^表示回退到上一个版本,HEAD^^表示回退到上两个版本,以此类推...
也可以一步到位:
ssh
git reset --hard HEAD
这个命令会重置所有文件,不能指定单个文件名,使用时需谨慎。
2.6.3 撤销工作区、暂存区和版本库
ssh
# 回退到上一个版本(撤销最后一次提交)
git reset --hard HEAD^
# 回退到上两个版本
git reset --hard HEAD^^
# 或
git reset --hard HEAD~2
- HEAD :表示要回退到当前版本,如果是
HEAD^表示回退到上一个版本,HEAD^^表示回退到上两个版本,以此类推...
2.7 删除文件
删除工作区和暂存区的文件
ssh
git rm [文件名]
删除文件后,commit 提交一下,版本库中的内容也就删除了
ssh
git commit -m "日志说明"
完整工作流程示例
ssh
# 1. 查看当前状态
git status
# 2. 删除文件
git rm old-file.txt
# 3. 查看删除后的状态(会显示删除待提交)
git status
# 4. 提交删除操作
git commit -m "删除不再使用的 old-file.txt 文件"
# 5. 推送到远程仓库(如果需要)
git push
恢复误删除的文件
ssh
# 恢复单个被删除的文件
git checkout HEAD -- [文件名]
# 或使用新命令
git restore [文件名]
3 分支管理
3.1 创建、切换、合并分支
查看当前仓库中有哪些本地分支
ssh
git branch

- * :表示当前 HEAD 指向哪个分支
创建分支
ssh
git branch 分支名
切换分支
ssh
git checkout 分支名
创建分支,并且切换到新创建的分支中
ssh
git branch -b 分支名
合并分支
ssh
git merge 要合并的分支名
3.2 删除分支
删除分支
ssh
git branch -d 分支名
- 注意:不能删除当前所在的分支,需要先切换到其他分支才能删除目标分支
3.3 合并冲突
在合并分支时可能会出现如下的情况:

它告诉我们在 ReadMe 文件中存在冲突
进入 ReadMe 文件:


冲突解决后,再次提交文件:

可以看到,合并成功了
总结一下,分支冲突时,我们需要手动解决冲突,并进行一次提交。
查看分支图
ssh
git log --graph --abbrev-commit
效果:

3.4 合并模式
Fast-forward(快进) 是 Git 分支合并的一种模式,当目标分支(如 main)自特性分支(如 feature)创建以来没有新的提交时,Git 会简单地将分支指针向前移动,而不创建新的合并提交。
3.4.1 Fast-forward 合并场景
ssh
初始状态:
A---B---C (main)
\
D---E (feature)
合并后:
A---B---C---D---E (main, feature)
3.4.2 非 Fast-forward 合并场景
ssh
初始状态:
A---B---C---F (main)
\
D---E (feature)
合并后(禁用FF):
A---B---C---F---G (main)
\ /
D---E (feature)
3.4.3 Fast-forward 的三种模式
3.4.3.1 默认模式(--ff)
ssh
# Git 会自动尝试 Fast-forward 合并
git merge feature-branch
# 等同于
git merge --ff feature-branch
行为:如果可能就 Fast-forward,否则创建合并提交
3.4.3.2 强制 Fast-forward(--ff-only)
ssh
# 只允许 Fast-forward 合并,否则失败
git merge --ff-only feature-branch
行为:如果能 Fast-forward 就合并,否则报错并保持原状
3.4.3.3 禁用 Fast-forward(--no-ff)工作中更推荐使用
ssh
# 总是创建合并提交,即使可以 Fast-forward
git merge --no-ff feature-branch
行为:无论情况如何,都会创建一个新的合并提交
3.5 bug 分支
3.5.1 git stash 介绍
git stash 是一个"暂存"命令,允许你临时保存当前工作目录和暂存区的修改,让你可以切换到干净的工作状态,稍后再恢复这些修改。
我们经常遇到这样的情况:正在开发一个功能,突然需要紧急修复一个bug,但是当前的工作还没有完成,不想提交。这时,git stash就派上用场了。
git stash 命令可以将当前的工作区内容保存到一个栈中,然后恢复到一个干净的工作区。之后可以在适当的时候再恢复之前保存的工作进度。
基本用法:
-
保存当前工作区(和暂存区)的修改
git stash [save "说明信息"]# 如果不加说明,默认会使用最近的提交信息作为说明注意:默认情况下,git stash只会存储已跟踪文件的修改(即之前已经被git管理的文件)。如果要包括未跟踪的文件,可以使用
git stash -u(包括未跟踪文件)或git stash -a(包括所有文件,包括忽略的文件)。 -
查看存储的列表
git stash list -
恢复存储的工作进度
git stash apply [stash@{n}]# 如果不指定存储,默认恢复最近的一次(即stash@{0})注意:apply恢复后,存储的内容仍然在栈中。
也可以使用
git stash pop来恢复并同时将存储从栈中移除。 -
删除存储
git stash drop [stash@{n}]# 删除指定的存储,如果不指定,默认删除最近的一次 -
清除所有存储
git stash clear -
查看某个存储的详细内容
git stash show [stash@{n}]# 显示简略信息
git stash show -p [stash@{n}]# 显示详细差异(相当于git show) -
从存储创建分支
如果恢复存储时发生冲突,或者你想在恢复存储的同时开始一个新的分支,你可以使用:
git stash branch <分支名> [stash@{n}] -
注意:
git stash也可以多次存储,每次存储都会压栈,最新的一次在最上面。
3.5.1.1 典型开发场景
ssh
# 1. 正在开发新功能
git checkout feature/user-profile
# ... 编写代码 ...
# 2. 突然需要修复紧急bug
git status # 看到未提交的修改
# 3. 暂存当前工作
git stash push -m "用户资料页面开发中"
# 4. 切换分支修复bug
git checkout main
git checkout -b hotfix/urgent-bug
# ... 修复bug ...
git add .
git commit -m "修复紧急bug"
git checkout main
git merge hotfix/urgent-bug
# 5. 回到功能分支恢复工作
git checkout feature/user-profile
git stash pop
3.5.2 修复bug时使用的方法
3.5.2.1 法一(不推荐)
master 直接合并 dev2

由于 master 一般是真实的生产环境,直接在 master 进行合并,如果合并后的代码有问题,可能会导致严重的事故。
3.5.2.2 法二(推荐)
第一步:

第二步:

完成后记得删除无用分支~
3.6 强制删除分支
ssh
git branch -D 分支名
4 远程操作
4.1 克隆远程仓库
ssh
git clone 远程仓库地址
不能在已经是仓库的目录下再次克隆,因为会冲突。
查看远程仓库的名称
ssh
git remote

查看更详细的仓库信息
ssh
git remote -v

- (fetch) :表示你有从该远程仓库拉取(下载) 代码的权限
- (push) :表示你有向该远程仓库推送(上传) 代码的权限
4.1.1 使用 HTTPS
ssh
git clone 你的HTTPS地址
4.1.2 使用 SSH
创建 SSH Key,检查在用户的主目录下有没有 .ssh 目录,如果有,检查一下该目录下有没有 id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可以直接跳到下一步。如果没有,则需要创建 SSH Key:
进入用户的主目录:
sshcd ~
.ssh 目录中可能有的文件:
id_rsa:私钥(必须保密)id_rsa.pub:公钥(可以共享)known_hosts:已知主机列表config:SSH 配置
ssh
ssh-keygen -t rsa -C "邮箱"
- 这个邮箱必须要与远程仓库 、git中配置的邮箱要保持一致
- 输入完成后一路回车
之后去 .ssh 目录下查看公钥:
ssh
cat id_rsa.pub
把公钥复制下来,保存到远程仓库中
你的本地仓库的git的name 也要配置成远程仓库的name
ssh
git config --global user.name "用户名"
4.2 向远程仓库推送
ssh
git push origin master:master
-
origin 指定是你要往哪里进行推送
-
第一个 master 指的是你本地仓库中的分支名称
-
第二个 master 指的是你远程仓库中的分支名称
-
如果你要推送的本地分支名称与远程的分支名称相同,你可以只写一个
sshgit push origin master
4.3 拉取远程仓库
ssh
git pull origin master:master
- origin 指定是你要往哪里进行推送
- 第一个 master 指的是你本地仓库中的分支名称
- 第二个 master 指的是你远程仓库中的分支名称
- 如果你要推送的本地分支名称与远程的分支名称相同,你可以只写一个
或者为了避免每次都指定远程分支,可以设置上游分支 (更推荐):
ssh
# 设置当前分支的上游分支
git branch --set-upstream-to=origin/master
# 或者推送时自动设置
git push -u origin master
# 设置后就可以直接使用
git push
git pull
pull 这个命令实际上做了两个工作:
- 拉取远端的代码
- 将远端的代码合并到当前分支
4.4 查看 / 绑定远程仓库分支
查看远程仓库中的分支
ssh
git branch -r

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

将本地分支与远程分支进行绑定
ssh
git branch --set-upstream-to=origin/远程分支名 本地分支名
新建分支并将本地分支与远程分支进行绑定
ssh
git checkout -b 本地分支名 origin/远程分支名
查看本地分支的绑定情况
ssh
git branch -vv

4.5 在远程仓库创建分支
4.5.1 远程创建分支(推荐)

这样创建出来的分支可以保证新创建的分支的代码是最新的。
4.5.2 本地创建分支(不推荐)
不推荐在本地创建分支,原因:本地的 master 分支不一定是最新的!!!如果真的要在本地创建分支,需要做更多的操作,比如 git pull 等等
由于远程仓库没有新创建的分支,所以我们不能直接使用 git pull,但是我们可以使用下面的命令来新建远程分支并且推送修改:
ssh
git push origin 分支名
4.6 忽略特殊文件
有一些文件我们不想让 Git 给我们提交到远程仓库,我们可以新建一个 .gitignore 文件,把要忽略的文件名写进去,Git 就会忽略这些文件。
如果 git 忽略了你想要提交的文件,而你想要提交,有两种做法:
ssh
git add -f 文件名
- 在
.gitignore文件中添加!文件名
查看文件为什么被忽略提交:
ssh
git check-ignore -v 文件名
4.7 配置命令别名
ssh
git config [--global] alias.别名 '要起别名的命令'
起好别名后,调用:
ssh
git 别名

5 标签管理
5.1 操作标签
新增标签
ssh
git tag 标签名 [commitId]
ssh
git tag -a 标签名 -m "标签的注释" [commitId]
查看有哪些标签
ssh
git tag
查看标签的详情
ssh
git show 标签名
向远程仓库推送标签
ssh
git push origin 标签名
推送全部标签
ssh
git push origin --tags
删除标签
删除本地的标签
ssh
git tag -d 标签名
删除远程标签
ssh
git push origin :标签名
6 多人协作
6.1 多人在同一分支下进行开发(不常见)
6.1.1 解决冲突
多人在同一分支下进行开发,大概率在会遇到以下情况:

解决方法 Git 已经告诉我们了
- 使用 git pull

- 手动解决冲突

- 解决后重新进行推送

6.1.2 将内容合并进 master
6.1.2.1 PR(推荐)

别忘了将 dev 分支的修改 push 到远程仓库中。
创建 Pull Request,申请合并分支

PR 通过审查员的审查后,就会合并。
6.1.2.2 本地(不推荐)
- master:pull
- dev:merge master (有冲突在 dev 分支进行解决)
- master:merge dev

6.2 在不同分支下进行开发
条件:在不同分支下进行开发,并且各自让某一个功能私有某一个分支
比如说开发人员1在 feature-1 分支下进行开发,开发人员2在 feature-2 分支下进行开发。此时他们各自向远程仓库推送代码就不会出现冲突了。但是在之后与 master 分支进行合并时,可能会需要处理冲突。
6.2.1 切换分支开发
场景:你在 feature-1 上进行开发,你的同事在 feature-2 上进行开发。可是你的同事生病了,现在需要你来开发 feature-2。
解决:
- 在你的电脑上新增 feature-2 分支,并与远程仓库的 feature-2 建立连接
你的电脑:

- 在你的电脑上进行开发
你的电脑:

- 现在你的同事病好了,他要继续开发 feature-2。
同事的电脑:

6.3 将内容合并进 master
参考 6.1.2.1 小结
6.4 解决 git branch -a 打印已被删除的远程分支
展示远程分支的情况:
ssh
git remote show origin

解决 git branch -a 打印已被删除的远程分支
ssh
git remote prune origin