一小时git教程

布鸽不鸽 Lv4

https://www.bilibili.com/video/BV1HM411377j

安装和配置

下载地址:https://git-scm.com/

  • 查看一下版本,确保安装成功
1
git -v
  • 配置一下用户名和邮箱
1
2
git config --global user.name "Dongyun Xue"
git config --global user.email 1235678@qq.com
  • 用下面这个命令来保存用户名和密码,就不用每次都输入了
1
git config --global credential.helper store
  • 查看git的所有信息
1
git config --global --list

省略(Local):只对本地仓库有效

–global:全局配置,所有仓库生效

–system:系统配置,对所有用户生效

新建仓库

  • 创建一个仓库
1
2
3
4
5
# 当前文件夹创建仓库
git init

# 新建一个工作文件夹,作为仓库
git init my-repo

工作区域和文件状态

image-20231124191824498

工作区域:

  • 工作区:电脑上实际的文件
  • 暂存区:一种临时存储区域,保存即将提交到仓库的修改内容
  • 本地仓库:包含完整的项目历史和元数据
image-20231124192149058

文件状态:

  • 未跟踪:没被git管理
  • 未修改:已被git管理,但是没有变动
  • 已修改:已被git管理,发生变动了,还没提交到暂存中
  • 已暂存:已被git管理,发生变动了,提交到暂存中

添加和提交文件

命令说明
git status查看仓库状态
git add添加到暂存区
可以使用通配符,例如:git add *.txt
也可以使用目录,例如:git add .
git commit提交
只提交暂存区中的内容,不会提交工作区中的内容
git log查看提交记录
可以使用**–oneline**参数来查看简洁的提交记录

git reset回退版本

image-20231124194321334

git reset三种模式:

  • git reset –soft

  • git reset –hard

  • git reset –mixed(默认参数)

1
2
3
4
5
6
7
git log

# 回到指定的某个版本
git reset --soft 5af90

# 回到HEAD的上一个版本
git reset --soft HEAD^

soft和mixed:当我们提交了多个版本,但是觉得没什么意义,就可以用soft或者mixed将之前的所有提交精简为一个版本。唯一的区别的就是mixed要先git add一下

hard:谨慎操作,不过如果出问题了也可以回退

先查看一下操作记录,找到误操作前的版本号:

1
2
3
4
5
$ git reflog
2de4fd4 (HEAD -> master) HEAD@{0}: reset: moving to 2de4
50fac56 HEAD@{1}: commit: commit 3
2de4fd4 (HEAD -> master) HEAD@{2}: commit: file2.txt
fd474d1 HEAD@{3}: commit (initial): commit1

回退到之前的版本:

1
$ git reset 50fac

git diff查看文件差异

image-20231124204822941
  • 什么参数都不加,默认查看工作区和暂存区之间的差异
1
2
3
4
5
6
7
8
9
$ git diff

diff --git a/file1.txt b/file1.txt # 发生变更的文件
index ce01362..5be8819 100644 # 文件哈希算法的值(只显示前7位),后面100644是文件的权限
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1 @@
-hello # 删除的内容
+hello123 # 添加的内容
  • 工作区与版本库之间的差异
1
git diff HEAD
  • 暂存区与版本库之间的差异
1
git diff --cached
  • 两个版本之间的差异
1
2
3
4
5
6
7
8
9
10
11
git diff 833ff b291a

git diff HEAD~ HEAD
git diff HEAD~2 HEAD
git diff HEAD~3 HEAD

git diff HEAD^ HEAD
git diff HEAD^2 HEAD
git diff HEAD^3 HEAD

git diff <branch_name> <branch_name> # 比较两个分支间的差异

HEAD~表示HEAD的上一个父亲提交,HEAD~~表示HEAD的上两个父提交,依次类推

HEAD^只能表示HEAD的上一个父亲提交,如果上一次有很多父提交(比如合并操作),HEAD^1代表第一个,HEAD^2代表第二个,以此类推

使用git rm删除文件

image-20231124205233107

方法一:直接删除文件,再提交

1
2
3
4
5
6
7
rm file1.txt

git status
git ls-files # 查看暂存区文件,发现file1.txt还在

git add file1.txt
git commit -m "delete file1.txt"

方法二:使用git rm命令

1
2
3
git rm file1.txt	# 工作区和暂存区,同时删除

git commit -m "delete file1.txt"

gitignore忽略文件

1
2
3
4
5
# .gitignore

access.log
*.log
temp/

注意:已经被添加到版本库中的文件,会继续被追踪。假如之前已经提交过other.log,后面它将无法被忽略

解决方法:使用git rm从暂存库中删除它

1
2
git rm --cached other.log	# 从暂存区删除,工作区不删除
git commit -m "ignore other.log"
image-20231124210020230
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 忽略.a文件,除了lib.a
*.a
!lib.a

# 忽略当前目录下的TODO文件
/TODO

# 忽略任意目录下的build文件夹
build/

# 忽略任意doc文件夹下,直接有的txt文件(不会忽略doc/server/arch.txt)
doc/*.txt

# 忽略任意doc文件夹及所有子文件夹下的.pdf文件
doc/**/*.pdf

SSH配置和克隆

我们在github上建立一个仓库后,使用SSH的方式clone,会发现没有权限

  • 使用SSH的方式,必须先配置SSH的密钥
1
2
3
$ git clone git@github.com:pigeon-dove/learngit.git
Cloning into 'learngit'...
The authenticity of host 'github.com (20.205.243.166)' can't be established.

回到用户根目录,进入.ssh目录,使用ssh-keygen -t rsa -b 4096命令来生成SSH密钥

1
2
3
4
5
6
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/xdy/.ssh/id_rsa): id_rsa_2 # 因为之前有了,所以重命名一下
Enter passphrase (empty for no passphrase): # 密码为空就行

如果像上面那样改了名字的话,在~/.ssh/config文件中加上如下配置即可

  • 意思:当访问github.com的时候,指定使用以下文件的密钥
1
2
3
4
5
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_2

复制公钥文件id_rsa_2.pub中的值,到github的个人设置中

image-20231124230622511

现在可以正常clone了

1
git clone git@github.com:pigeon-dove/learngit.git

关联本地仓库和远程仓库

image-20231124233238624

在github上创建一个空仓库,将它和本地已有的仓库关联起来

image-20231124232105274

使用git remote add <shortname> <url>添加远程仓库

1
2
3
4
5
6
7
8
git remote add origin git@github.com:pigeon-dove/firsti-repo.git

git remote -v # 查看远程仓库,名字和地址

git branch -M main # 指定分支的名称为main

git push -u origin main # 将本地main分支,和远程仓库的main分支,关联起来(u: upstream)
git push -u origin main:main # 上一条命令写全应该是这样的

现在,我们在github上创建一个README.md,模拟远程仓库改动的情况。我们现在可以拉取远程仓库

1
2
3
4
git pull					# 拉取远端服务器

git pull origin main # 上一条命令写全,将远程仓库的指定分支,拉到本地指定分支,进行合并
git pull origin main:main # 上一条命令写全,将远程仓库的指定分支,拉到本地指定分支,进行合并

注意:

  • 执行git pull,会自动帮我们执行一次合并操作,没有冲突则合并成功。有冲突需要手动处理。
  • git fetch命令,只是获取远程仓库修改,并不会自动合并到本地仓库中

分支简介和基本操作

image-20231125002037803
  • 创建一个新的分支
1
git branch dev
  • 查看所有分支,*表示当前所在分支
1
git branch
  • 切换到别的分支
1
2
3
4
5
# git checkout命令还可以用来恢复文件或目录,到之前的一个状态。如果文件和分支名称一样,会默认切换分支,出现歧义
git checkout dev

# 新的命令,专门用来切换分支,避免歧义
git switch dev
  • 在dev分支进行修改并提交,切回main分支。切换分支的时候,工作区也会发生变化。
1
git switch main	# 工作区会变,之前在dev分支上的修改不见了
image-20231125001308100
  • 合并指定分支,到当前分支中(git会帮我们进行一次提交)
1
git merge dev
  • 查看分支情况
1
2
3
4
5
6
7
8
9
10
11
$ git log --oneline --decorate --all --graph
* 02a6da7 (HEAD -> main) Merge branch 'dev'
|\
| * 739daae (dev) dev:2
| * c3ecc04 dev:1
* | 0a463e2 main:5
* | ccf6525 main:4
|/
* b40c1c1 main:3
* bc8f037 main:2
* fe7a4aa main:1
  • 删除一个分支(如果这个分支,已经被合并到别的分支
1
2
3
4
$ git branch -d dev

$ git branch # 看到dev分支已经没有了
* main
  • 强制删除一个分支(如果这个分支,还没有被合并到别的分支
1
$ git branch -D dev

解决合并冲突

  • 如图,创建feat分支后,main分支和feat分支对同一个文件进行了修改
1
2
3
4
5
6
7
8
9
$ git log --graph --oneline --all
* dc0dcb9 (HEAD -> main) main:5
* 702f5f3 main:4
| * 9eae972 (feat) feat:2
| * 6ef0326 feat:1
|/
* b40c1c1 main:3
* bc8f037 main:2
* fe7a4aa main:1
  • 尝试合并分支,提示冲突
1
2
3
4
$ git merge feat
Auto-merging main1.txt
CONFLICT (content): Merge conflict in main1.txt
Automatic merge failed; fix conflicts and then commit the result.
  • git status查看冲突的文件列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: main1.txt

Untracked files:
(use "git add <file>..." to include in what will be committed)
how-branch

no changes added to commit (use "git add" and/or "git commit -a")
  • git diff查看冲突的具体内容
1
2
3
4
5
6
7
8
9
10
11
12
$ git diff
diff --cc main1.txt
index d9717b9,70bcab5..0000000
--- a/main1.txt
+++ b/main1.txt
@@@ -1,2 -1,2 +1,6 @@@
main1
++<<<<<<< HEAD
+main添加123123
++=======
+ feat添加333
++>>>>>>> feat
  • 手工编辑冲突的文件,然后提交即可
1
git commit -a -m "merge conflit"
  • 如果不想合并分支,也可以终止合并
1
git merge --abort

回退和rebase

  • 使用merge:在main分支上合并两个分支
image-20231125003255296
  • 使用rebase:当前分支上的提交,嫁接到指定分支后面,变成一条直线
image-20231125003712391

实战如下:

  • 之前dev分支已经被我们删除了,我们要先恢复dev分支
1
2
3
4
5
6
7
8
9
10
*   02a6da7 Merge branch 'dev'
|\
| * 739daae (HEAD -> dev) dev:2
| * c3ecc04 dev:1
* | 0a463e2 main:5
* | ccf6525 main:4
|/
* b40c1c1 main:3
* bc8f037 main:2
* fe7a4aa main:1
  • 恢复dev分支,到某一个状态(并进入dev分支中)
1
git checkout -b dev 739daae
  • 将main分支回退到main:5的时间点
1
git reset --hard 0a463e2
1
2
3
4
5
6
7
8
* 0a463e2 (HEAD -> main) main:5
* ccf6525 main:4
| * 739daae (dev) dev:2
| * c3ecc04 dev:1
|/
* b40c1c1 main:3
* bc8f037 main:2
* fe7a4aa main:1
  • 进行变基操作,dev分支的修改嫁接在main分支上了(反之亦然)
1
2
3
4
5
6
7
8
9
$ git switch dev
$ git rebase main
* d9d7adb (HEAD -> dev) dev:2
* 0528a98 dev:1
* 0a463e2 (main) main:5
* ccf6525 main:4
* b40c1c1 main:3
* bc8f037 main:2
* fe7a4aa main:1

优缺点:

Merge

  • 优点:不会破坏原分支的提交历史,方便回溯查看
  • 缺点:会产生额外提交节点,分支图会比较复杂

Rebase

  • 优点:不会新增额外的提交记录;线性历史,比较直观
  • 缺点:会改变提交历史(请避免在共享分支时,使用变基)

分支管理和工作流程

GitFlow模型

main和dev分支长期存在,其他分支合并后可以删除

主线/基线分支:main

  • 会被部署到生产环境
  • 不允许直接修改,只能通过合并分支的方式来修改
  • 每次合并都生成一个新的版本号

问题修复分支:hotfix

  • 用于修复线上的问题
  • 修复完成后合并会主分支
  • 命名规则:hotfix-#issueid-desc
  • 更新一个小版本号

开发分支:develop

  • 长期存在

功能分支:feature

  • 从dev分支分离出来,最后合并回开发分支

  • 用于开发新的分支

  • 命名例子:feature-login-page

预发布分支:release

  • 发布前的测试和验证
  • 从dev分支中分离出来
  • 稳定后,合并回main分支和dev分支

GitHubFlow模型

image-20231125011024536

分支命名:

  • 版本发布分支/Tag示例:v1.0.0
  • 功能分支实例:feature-login-page
  • 修复分支示例:hotfix-#issueid-desc

分支管理:

  • 定期合并已经成功验证的分支,及时删除已经合并的分支
  • 保持合适的分支数量
  • 为分支设置合适的管理权限
  • 标题: 一小时git教程
  • 作者: 布鸽不鸽
  • 创建于 : 2024-01-10 14:53:06
  • 更新于 : 2024-01-10 14:54:08
  • 链接: https://xuedongyun.cn//post/24535/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论