Featured image of post git基础教学

git基础教学

介绍git的使用,以及工作流程

引言

Git 是一个分布式版本控制系统,用于在软件开发过程中跟踪源代码的变更。它由 Linus Torvalds 于 2005 年创建,最初是为了管理 Linux 内核的开发。本文主要介绍了git中的常见命令, 以及日常工作使用git的流程。

参考资料: 【GeekHour】一小时Git教程_哔哩哔哩_bilibili

基本操作

新建仓库

1
2
3
git init		# 在本地创建一个空仓库

git clone 远程地址		# 从远程服务器克隆仓库
  • 新建仓库后生成.git文件,就是仓库

工作区域和文件状态

git三个区域

文件状态

基本操作

  • 新建文件都是未跟踪的文件,需要执行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 会自动执行一次合并操作,如果没有冲突,合并操作就会完成
  • 关于冲突和git fetch,在分支冲突进行讲解

分支

分支操作

 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会把分支变为一条直线

找两分支的公共祖先

rebase示意图

1
2
3
git log --oneline --graph --decoreate --all	# 查看详细分支信息

git rebase 分支1  # 把当前分支与分支1公共节点开始往后的当前分支全部放到分支1后面
  • 会改变提交历史,要避免在共享分支上使用rebase

git模型

gitFlow模型

gitFlow分支介绍

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

gitFlow流程

githubFlow模型

  • 自己创建分支修改后发出合并请求

githubFlow介绍