引言
Git 是一个分布式版本控制系统,用于在软件开发过程中跟踪源代码的变更。它由 Linus Torvalds 于 2005 年创建,最初是为了管理 Linux 内核的开发。本文主要介绍了git中的常见命令, 以及日常工作使用git的流程。
参考资料: 【GeekHour】一小时Git教程_哔哩哔哩_bilibili
基本操作
新建仓库
1
2
3
|
git init # 在本地创建一个空仓库
git clone 远程地址 # 从远程服务器克隆仓库
|
工作区域和文件状态


基本操作
- 新建文件都是未跟踪的文件,需要执行git add进行跟踪
1
2
3
4
5
6
|
git add 文件名 # 将文件放入暂存区(包括未跟踪的文件)
git commit -m"解释" # 将文件放入本地仓库
git add -u 文件名 # 将已经跟踪的文件放入暂存区,对于新建的文件不能使用
git commit -am"解释" #相当于两个命令, git add -u , git commit -m"解释"
|
取消add
1
|
git restore --stage file2 # add过后将文件取消add,即从暂存区拿回工作区
|
git reset回退版本
1
2
3
4
5
6
7
8
|
git reset --soft HEAD^ #本地仓库回退到上个版本,工作区和暂存区保留
git log # 查看当前仓库经历的版本
git log --oneline #一行表示
git reset --mix HEAD 版本号 #本地仓库回退到指定版本,工作区保留,暂存区不保留
git reset --hard HEAD 版本号 # 本地仓库回退到指定版本,工作区和暂存区不保留
|
注意事项
- 回退版本会导致版本丢失,使用
git reflog指令查看本地仓库的操作历史,存储再.git/log中
git reflog 的注意事项
- 本地记录:
git reflog 只记录本地仓库的操作历史,不会同步到远程仓库。
- 过期时间:默认情况下,
git reflog 记录会保留 90 天。过期后,记录会被自动清理。
- 不能恢复未提交的更改:
git reflog 只能恢复已经提交的记录,无法恢复未提交的更改(如工作目录中的修改)。
git diff查看差异
1
2
3
4
5
6
|
git diff # 查看工作区和暂存区文件的差异,
#如果暂存区没有文件,查看工作区和本地仓库之间的差异,相当于git diff HEAD
git diff HEAD # 查看工作区和本地仓库之间的差异
git diff --cached # 查看暂存区和本地仓库之间的差异
|
1
2
3
4
5
6
7
|
git diff 版本号1 版本号2 # 显示版本号2在版本号1基础上做了哪些修改
git diff HEAD~ HEAD # 显示最新版本在上一个版本基础上做了那些修改
# 上面的命令会显示所有文件发生的变化
# 查看指定文件的差异内容
git diff HEAD~ HEAD 文件名
|
git rm删除版本库中的文件
1
2
3
4
5
6
7
8
9
10
11
12
|
# 方法一
rm 文件名 # 先删除本地工作区文件
git add 文件名 # 更新暂存区
git commit -m"删除文件" # 同步到本地仓库
# 方法二
git rm 文件名 # 相当于方法一的1,2两步
git commit -m"删除文件"
# 不删除工作区文件
git rm --cached 文件名 # 其作用是从暂存区删除,并取消跟踪,文件会变为未跟踪
# 后续可以执行git commit 删除本地仓库的文件,或者等下一次提交
|
.gitignore文件
添加忽略文件,文件名可以使用通配符
- 系统或者软件自动生成的文件
- 编译长生的中间文件和结果文件
- 运行时生成日志文件、缓存文件、临时文件
- 涉及身份、密码、口令、密钥等敏感信息文件
对于已经在版本库中的文件,./gitignore文件不起作用,需要使用git rm –cached命令取消跟踪文件,并告知暂存区删除文件
远程仓库
配置ssh
- 进入用户的.ssh目录
- 使用ssh-keygen -t rsa生成ssh密钥(可以指定文件名和密码,一直回车就都不指定)
- 将公钥传到远程仓库
这样就可以使用ssh进行clone了
如果指定了生成的文件名,那么就需要生成一个配置文件config,以github为例,文件名内容如下
1
2
3
4
5
|
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/指定的生成ssh密钥的文件名
|
与远程仓库关联
1
2
3
4
5
6
7
8
9
10
|
git remote add origin 远程仓库地址
# origin是远程仓库的别名,origin代指远程仓库
git branch -M main # 指定分支名称为main
git push -u origin main # 将本地仓库和远程仓库关联起来
# 实际是 git push -u origin main:main 把本地仓库和远程仓库origin关联,把本地仓库main分支推送给远程仓库main分支
# 本地分支名称和远程分支名称相同,就可以吧main:main省略为一个main
git remote -v # 显示关联远程仓库的信息
|
拉取远程仓库
1
2
|
git pull 远程仓库别名 远程仓库分支名:本地仓库分支名 # 从远程仓库拉去分支,分支名相同只要写一个即可
# git pull 会自动执行一次合并操作,如果没有冲突,合并操作就会完成
|
分支
分支操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
git branch # 查看分支
git branch 分支名 # 创建新分支
git switch 分支名 # 切换分支
# 上面两行命令可以用一个命令来表示
git swtich -c 分支名
#注意别忘了切换分支
git merge 将要合并的分支名 # 把将要合并的分支合并到当前分支当中
git log --graph --oneline # 查看分支图
# 如果分支合并后,该分支还存在,如果分支不再被需要,需要手动删除
git branch -d 分支名 # 删除已经合并的分支
git branch -D 分支名 # 强制删除分支,不管有没有合并
|
解决冲突
1
2
3
4
5
6
7
8
|
# git merge发生冲突如何解决
# git merge发生冲突后,文件名里的内容会把冲突前后的差别都展示出来
git status # 查看信息
git diff # 查看冲突的内容
vim 文件名 # 手动编辑文件
git commit -am"提交更改后的文件" # 提交并自动合并
git merge --abort # 终止合并
|
rebase操作
执行rebase会把分支变为一条直线
找两分支的公共祖先

1
2
3
|
git log --oneline --graph --decoreate --all # 查看详细分支信息
git rebase 分支1 # 把当前分支与分支1公共节点开始往后的当前分支全部放到分支1后面
|
- 会改变提交历史,要避免在共享分支上使用rebase
git模型
gitFlow模型

- Master和Develop为主分支,长期存在;其他分支为辅助分支,合并完要删除,具体流程如下图所示

githubFlow模型
