Akemi

Git代码管理工具

2024/05/01

如果出现无法载图的情况,请检查与github的连通性

git原理与安装git

git和svn是私有代码管理工具,git是分布式、svn是集中式

github(代码仓库)相当于远程的仓库,开发人员可以通过git进行提交到github,也可以从clone with https进行拉取

整个过程:
workspace通过git add加载到缓存,再通过commit推送到本地仓库repository,再通过push推送到远端仓库如gitlab、github、码农

git的安装与使用

1
2
3
4
5
6
7
8
9
10
11
12
mac自带git;

linux安装git:
yum -y install git
sudo apt install git

windows安装git:
https://gitforwindows.org

有两种使用方法
1.使用git gui
2.使用git bash

git初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
进入目标目录

#创建一个本地仓库,写github的用户名和邮箱
git config --global user.name "Durative"
git config --global user.email "1320991378@proton.me"

#初始化仓库
新建一个project文件夹,并在终端进入文件夹
将这个文件夹当做本地仓库
#
git init
#会创建一个隐藏文件夹.git,会记录在仓库中的所有操作

git add与commit

1
2
3
4
5
vim test.txt
123123
#查看当前仓库的变化,
$ git status
显示红色文件代表新建/修改

1
2
3
4
#通过add添加到暂存区index
git add test.txt/git add .
git status
此时为绿色,表示已经放入了暂存区,并没有放到本地仓库

1
2
3
#提交到本地仓库
git commit -m '说明文字' test.txt
出现下面文字说明已经提交到本地仓库中

1
2
3
4
5
6
7
8
9
#测试修改
vim test.txt
此时红色字,表示已经修改

#第二次提交
git add test.txt
git commit -m "2" test.txt
显示一个文件修改了,其中增加了一个字节

git代码版本回退

1
2
3
4
5
6
#查看历史提交的版本
git log
#再次修改
vim test.txt
#查看修改
git diff test.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#提交修改
git add .
git status
git commit -m "3" .

#版本回退
git log
#准备回退到版本2
git reset --hard HEAD^
提示已经回退到描述文字"2"的版本
再次回退
提示回退到描述文字"描述文字"的版本
#git reset --hard HEAD^^ 回退到两个版本之前
#git reset --hard~40 回退到40个版本之前
#git reset --hard commit号 回退到指定版本
$ cat test.txt
123123

1
2
3
4
#修改到最新版本
git reflog 查看所有提交
git reset --hard 7a60bcc 回退到第二个版本
git reset --hard 4e8ded1 回退到第三个版本

git放弃文件修改

总结:

在commit后只能用git reset —hard 来撤销commit
在add后只能用git reset HEAD来撤销ad
在add前后用checkout来撤销代码修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#未add时的修改checkout
先做一下修改
此时git status肯定为红色
#
此时使用,可以针对单个文件(撤销修改),或针对全部进行(全部撤销)
回退到上次commit之后的版本
git checkout test.txt
#
此时再git status
就会发现提示没有变化

#add文件后再修改
git status
有红有绿
#回退到上次add后的版本
git checkout test.txt

#撤销add操作本身
此时git status为绿色
git reset HEAD
撤销一次后,此时git status为红色
git checkout
则会回退到上次commit的版本

git恢复被删除的文件

前文说到git checkout来撤销修改

1.没有执行add的,直接恢复删除文件

1
2
3
4

rm test.txt #此时git status显示delete红色
git checkout test.txt#恢复,提示git status显示nothing to commit

2.已经执行add的,需要进行撤销add,并且恢复

1
2
3
4
5
6
7
8
9
vim test.txt
git add .
git status #此时是绿色修改状态
rm test.txt
#
先进行回退add操作
git reset HEAD .
再使用checkout进行恢复
git checkout .

git配置远程仓库

github作为远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
使用ssh密钥作为token
1.首先要生成本机的ssh密钥文件
ssh-keygen -t rsa -C "1320991378@proton.me"
默认路径为/c/Users/13209/.ssh/id_rsa
(最好区分开,因为不同远程仓库需要用不同的公钥)
会生成一对密钥
2.查看公钥
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCVGcT/zSPB6XZDz7Zdt5RNY6leCH9Q4jDQNgp15cya5xFbn8i5LUeI0xepgBUsvRnO73zVBqOA4VqLsrDx11NblpeVMmscBM0cWQ+QoNHHVCtM0ARwopdcSiJjVv5yqLSP8gFjdhEhJOVrfSE7LCzIl/InMVSDaOcW/GM3sRcNqig0vtmEfldZYTCJT5Ozr01Pp6YcRZCxwK4IsFDLmV5nS981p7yqdSkzo4Eu51T1l59MFko5H9zzaS87ChmDA+DdWyvzjBuiFKFkXbekfxtg/ri9HuHga1V6e6nZ+KZ+//RYiWOJ4g+vmxF/mhEIDRkZbLYeZZIRzDn9SEBJ9VAndvUmWsjPx5xzXjtDEMSLLaK487uZww/jVcYRvTC8hHWvwo7yHq7ueGVd7/3/52bM3lOkNdQ6GKp1EreNZo6cPhnf4MMfeZWIWKHsguY9B5aUrS+2N1pO/KiO0hZ4WtO+ofn1j1XyO+XDIXkr3xlOATZHlvtVzk2PNDjJI+Ox4+8= 1320991378@proton.me
将公钥复制到github账号中

3.github创建一个仓库,选择非公开,我创建的名称叫laptop
全称为durative/laptop
获取它的ssh地址 git@github.com:Durative/laptop.git
在本机操作,关联远端仓库
git remote add origin git@github.com:Durative/laptop.git

4.测试
$ git branch -a
* master
#
推送
$ git push origin -u master
此时github中已经有了

git分支管理

蓝色dev就是开发分支
黄色release是预打包版本,测试没通过时,领取bug单,修复后再次打包release;测试通过后更新到master和dev
红色hotfix就是修bug的分支,然后再次合并到master,同时可以用这个再次进行开发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#创建分支
git branch dev

#查看分支
$ git branch
dev
* master

#切换分支
git checkout dev

#直接创建并且切换
git checkout -b test

#
$ git branch
dev
master
* test

#机制
在dev上修改文件并add
vim test.txt
git status
git add .

add后如果切换master,则文件是修改之后的版本
如果commit上去了,切换master查看,文件是修改前版本
#
在dev上,提交后就变成了dev的内容,就和master分开了

#代码合并,在master上
git merge dev
cat test.txt #此时为修改后的test

分支合并冲突问题

在不同分支,修改同一文件,在最后合并的时候就会冲突,如果冲突,需要手动解决

复现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#在dev上修改并且commit
git checkout dev
cat > test.txt << EOF
> dev.
> EOF
$ git add .
$ git commit -m "dev branch" .

#在master上打开,还是原本的
$ git checkout master
cat > test.txt << EOF
> master.
> EOF
$ git add .
$ git commit -m "master branch" .

#让dev和master合并分支
git checkout master
提示需要手动进行修复和确认
cat test.txt
<<<<<<< HEAD
> master.
> EOF

=======
dev.
>>>>>>> dev

手动将HRAD === 和 dev去掉之后

$ git commit -a
[master 3b60d3e] Merge branch 'dev'

bug分支问题

在dev开发,突然master有bug需要处理,临时处理bug,切换master时
需要将dev的工作环境隐藏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#bug分支问题
在dev开发,突然master有bug需要处理,临时处理bug,切换master时
需要将dev的工作环境隐藏,
git stash
git status

git checkout -b hot_fix
echo "repair complete" >> test.txt
git commit -m "bug repair" test.txt

#合并分支
git checkout master
git merge hot_fix

#回到dev分支上,恢复之前的开发内容
git status pop

多人远程分支冲突

A开发上传1版本
B开发从github拉取1版本的dev代码
并且再次push到origin,标记为2版本

此时A和B的版本不同
A开发push到dev
报错有冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
#冲突解决
git pull 首先拉取
#解决提示没有关联远程仓库
git branch --set-upstream-to=origin/dev

#修改冲突
此时删除HEAD和===等即可
修改完后
git push origin dev

#
B开发进行git pull并关联
此时代码已经合并

git tag

为了更好区分commit的版本进行的操作
一般来说用commit号来管理版本,但commit号太长太难记
类似于docker tag

master版本上线后应该都要打tag备份,防止时态有变化
以后可以根据tag来回滚版本

1
2
3
4
5
6
7
8
9
10
11
12
#打tag
git tag 2.0

#指定commit号打tag
git tag -a v1.0 a2277c2a920f9e30f5824648d9105155c3022eef

#查看tag,能够查看到2.0版本的commit号
git tag
git show 2.0

#通过commit进行回退
git reset --hard <commit号>

原文作者:王盛

原文链接:https://akemi.zj.cn/2024/05/01/Git/

发表日期:May 1st 2024, 5:51:34 pm

更新日期:February 20th 2025, 6:37:27 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. git原理与安装git
    1. 1.1. git的安装与使用
  2. 2. git初始化
  3. 3. git add与commit
  4. 4. git代码版本回退
  5. 5. git放弃文件修改
    1. 5.1. 总结:
  6. 6. git恢复被删除的文件
  7. 7. git配置远程仓库
    1. 7.1. github作为远程仓库
  8. 8. git分支管理
    1. 8.1. 分支合并冲突问题
    2. 8.2. bug分支问题
    3. 8.3. 多人远程分支冲突
  9. 9. git tag