zl程序教程

您现在的位置是:首页 >  工具

当前栏目

【GIT系列汇总】GIT学习

Git学习 系列 汇总
2023-09-27 14:29:25 时间

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

img

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝

✨✨ 欢迎订阅本专栏 ✨✨

一.Git 基础

1.mac 安装 git

$ brew install git

2.查看 git 版本

git --version

3.git 的基本流程

在这里插入图片描述

4.GIT 分支

4.1.Git 分支模型

经典 Git-Flow

img

两个常驻分支(master & develop),代码开发都在临时分支上进行。需要做好日常管理(如及时删除已合并的临时分支),否则容易导致混乱。

4.2.主要分支

  • master 主干分支,稳定版代码,生产环境版本代码 (prd 正式环境; Tag)
  • develop 主干分支,开发版代码,dev/qa 环境版本代码 (dev、qa 环境)
  • feature 功能开发分支 (dev 环境)
  • release 发布分支, 不允许直接修改代码 (uat 环境)
  • hotfix 修复分支 (qa、uat、prd 环境)

4.3.临时分支

1 版本功能分支(feature)

从 develop 分支创建,用于版本功能开发,完成后要合并回 develop 分支

2 个人特性分支(feature)

从 feature 分支创建,用于个人版本功能开发,完成后要合并回 feature 分支

3 稳定分支(release)

从 feature 功能分支创建,用于预发布环境进行测试及产品验证,完成后要合并回 develop 和 master 分支

4 修复分支(hotfix)

从 master 分支创建,用于预发布 / 生产环境上的 Bug 修复,完成后要合并回 develop 和 master 分支

4.4.分支清理

1 谁创建谁负责清理

2 临时分支在发布生产环境后清理

4.5.项目分支

1 新项目需从原工程 gitlab 上 fork, 不允许 checkout 新分支

4.6.命名规则

  • 创建版本功能分支,名称要以 feature/ 开头,加上产品迭代版本号;如:feature/1.1.3
  • 创建个人特性分支,名称要以 feature/ 开头,加上产品迭代版本号,加上个人标识;如:feature/1.1.3-yy
  • 创建发布分支,名称要以 release/ 开头,加上产品迭代版本号;如:release/1.1.3
  • 创建 Bug 修复分支,名称要以 hotfix/ 开头,加上已发布产品迭代版本号 (即上个版本号);如:release/1.1.2
  • 创建标签 Tag,名称要以 v 开头,加上发布版本号和日期;如:v1.1.3-2022-01-26

5.git-commit 类别

type 用于说明 commit 的类别

  • feat:新功能(feature)

  • fix:修补 bug

  • docs:文档(documentation)

  • style:格式(不影响代码运行的变动)

  • refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)

  • test:增加测试

  • chore:构建过程或辅助工具的变动

  • feat:新功能(feature)

  • perf: 性能 (提高代码性能的改变)

  • ci: 对 CI 配置文件和脚本的更改

  • revert: 撤销提交

6.人员

  • owner 是最高权限的,谁去创建组,这个组就被谁拥有,它可以开除管理员,但管理员无法操作 owner 的角色。
  • maintainer(管理员-只是具备 sudo 权限的用户)管理员一般是给小组的组长,或者是给产品线的总监设定。
  • developer 是干活的人,就是写代码的程序员,可以进行代码的上传以及代码的下载,不能下载其他的组内的代码,只能下载它们组的代码。
  • repoter:比如现在有需求,其他组的大牛到我们组过来指导工作,要审视我们的代码,人家就提出需要一个权限,我不能给它 developer 因为它会改你代码,其他组的人不能改我们组的代码,所以就给一个 repoter 权限,他只能看,只读权限。
  • guest:不用看,匿名,直接去掉。一般出现在从 ldap 中把离职人员的信息删掉,再去 gitlab 查这个人的时候,它就是一个 guest 用户(匿名)需要再到 gitlab 把它删掉(不删也没事)。

7.squash 的作用?

git merge 和 git merge – –squash 的区别?

squash 是将其他分支内容合并和重新进行一次提交封装。这样方便我们对主分支的管理。dev 分支开发可能会随心所欲的进行提交已经对提交日志的细小记录。但是对于主分支根本不关心这些或者需要进行一些提交信息的规则定义。这时候我们可以 squash 先合并内容然后在重新一次性提交

  • git merge:直接将其他的提交记录合并进来。

  • git merge – –squash:是内容的合并。

8.merge 和 rebase 的区别?

git merge 会让 2 个分支的提交按照提交时间进行排序,并且会把最新的 2 个 commit 合并成一个 commit。最后的分支树呈现非线性的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyiSD9nW-1680240942090)(null)]

git reabse 将 dev 的当前提交复制到 master 的最新提交之后,会形成一个线性的分支树

未命名文件 (5).png

二.git 命令

1.常用命令

#通过链接clone代码
git clone  xxx

#初始化本地库
git init

#将改动文件加入暂存区
git add .

2.branch 相关

#查看本地所有分支
git branch

#查看所有分支(本地+远程)
git branch -a

#查看远程所有分支
git branch -r

#强制删除本地库develop
git branch -D develop

#删除本地库develop
git branch -d develop

#建立一个新的本地分支dev_3,并切换到 dev_3 分支
git checkout -b dev_3

#将分支dev与当前分支进行合并
git merge origin/dev

#切换到本地dev分支
git checkout dev

#从主分支dev_3创建branch_3分支
 git branch branch_3 dev_3

#将branch_3重命名为branch_5
git branch -m branch_3 branch_5

#切换到branch_1.0/master分支
git checkout branch_1.0/master

#切换到上一个分支
git checkout -

#建立追踪关系,在现有分支branch与指定的远程分支remote-branch之间
git branch --set-upstream [branch] [remote-branch]

3.tag 相关

#列出所有tag
git tag

#新建一个tag并且指定commit,tag名称最好和branch名称分开,可以加个-tag
git tag [tag] [commit]
git tag  v1.8.4.2-tag  57b86001

#提交所有tag
git push --tags
git push [remote] --tags

#新建一个tag在 当前 commit
git tag [tag]

#查看tag信息
git show [tag]

#提交指定tag
git push [remote] [tag]

#新建一个分支,指向某个tag
git checkout -b [branch] [tag]
git checkout -b v1.8.4.2  v1.8.4.2-tag

#删除本地tag
git tag -d [tag]
git tag -d v1.8.4-tag

#删除远程tag
git push origin :refs/tags/[tagName]
git push origin :refs/tags/v1.8.4.1-tag

image-20230327143213821

4.stash 使用

#保存当前进度;
#git stash命令的作用主要如果当前分支所做的修改你还不想提交,但又需要切换到其他分支去查看,就可以使用git stash保存当前的修改。
git stash

#看已经保存的历史记录
git stash list

#重新应用最近的
git stash apply

#重新应用某个已经保存的进度,但不删除进度记录
git stash apply stash@{2}

#将文件从临时空间pop下来
git stash pop

#重新应用某个已经保存的进度,并且删除进度记录
git stash pop stash@{2}

#删除某个历史进度
git stash drop stash@{2}

#删除所有的历史进度
git stash clear

5.status 相关

#显示仓库文件状态
git status

#以极简的方式显示文件状态(下面是显示内容解析):git status -s
A:本地新增的文件(服务器上没有)
C:文件的一个新拷贝
D:本地删除的文件(服务器上还在)
M:红色为修改过未被添加进暂存区的,绿色为已经添加进暂存区的
R:文件名被修改
T:文件的类型被修改
U:文件没有被合并(你需要完成合并才能进行提交)
X:未知状态(很可能是遇到git的bug了,你可以向git提交bug report)
?:未被git进行管理,可以使用git add fileName把文件添加进来进行管理

#看你commit的日志
git log

#显示commit历史,以及每次commit发生变更的文件
git log --stat

#搜索提交历史,根据关键词
git log -S [keyword]

#显示过去5次提交
git log -5 --pretty --oneline

#显示某个日期之前的记录,如git log --before=“2020-01-01”(包含2020年1月1号的记录)
git log --before=“yyyy-MM-dd”

#显示某个日期之后的记录,如git log --after=“2020-01-01”(包含2020年1月1号的记录)
git log --after=“yyyy-MM-dd”

#查看某个人的提交记录
git log --author='name'

#显示前n条记录
git log -n

#显示所有提交过的用户,按提交次数排序
git shortlog -sn

#显示指定文件是什么人在什么时间修改过
git blame [file]

#退出查看
按q

#显示当前分支的最近几次提交
git reflog

6.暂存区

#加入到暂存区
git add .

#查看已经被提交的
git ls-files

#从git中删除指定文件
git rm 文件名(包括路径)

#移除文件(只从暂存区中删除)
git rm --cached a.a

#强行移除修改后文件(从暂存区和工作区中删除)
git rm -f 111.sql

#查看尚未提交的更新
git diff --cached
git diff --staged

#恢复暂存区的指定文件到工作区
git checkout [file]

#恢复暂存区的所有文件到工作区
git checkout .

7.commit 相关

#提交并且加注释
git commit -am "init"

#添加commit信息
git commit -m "This is the message describing the commit"

#查看历史commit
git reflog

8.remote 相关

#查看关联的远程地址
git remote -v

#将文件给推到服务器上
git push origin master

#显示远程库origin里的资源
git remote show origin

#切换到远程dev分支
git checkout --track origin/dev

#查看远程库
git remote show

#从服务器上将代码给拉下来
git clone git://github.com/schacon/grit.git

#关联仓库
git remote add origin git@github.com:username/Hello-World.git

#相当于是从远程获取最新版本到本地,不会自动merge
git fetch

#删除远程分支
git push origin --delete [remote-branchname]

#下载远程仓库的所有变动
git fetch [remote]

#显示所有远程仓库
git remote -v

#显示某个远程仓库的信息
git remote show [remote]

#从远端库更新内容到本地
git pull

#取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]

#上传本地指定分支到远程仓库,如:git push origin master(同步到远程master仓库)
git push [remote] [branch]

#删除远程[branch]分支
git push origin --delete dev

9.reset 相关

#回退到上一个版本
git reset --hard HEAD^

#回退到前3次提交之前
git reset --hard HEAD~3

#回退到指定提交版本
git reset --hard 15c8682d

#强制提交,因为远程已经发生了变化,如何合并就会出现问题
git push -uf origin dev

还有一个比较笨拙但是不会出错的方法,先根据某个提交建立分支,再进行处理

image-20230327143144805

10.对比 differ

#查看尚未暂存的更新
git diff

#显示本地分支和master对比
git diff master

#显示本地与远程feature/v1.8.5.1 对比的不同点
git diff origin/feature/v1.8.5.1

#显示某次提交的元数据和内容变化
git show [commit]

#显示某次提交发生变化的文件
git show --name-only [commit]

#显示某次提交时,某个文件的内容
git show [commit]:[filename]

11.查询关键词

#从当前目录的所有文件中查找文本内容
git grep “陈哈哈”

#在某一版本中搜索文本
git grep “陈哈哈” v2.5

12.git 统计提交信息

12.1.统计个人

git log --author="327782001@qq.com" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

12.2.统计所有人

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

12.3.统计某一段时间

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --since='2017-01-01' --until='2022-03-05' --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

12.4.统计整个项目

git log --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

12.5.统计用户提交次数

自 2017-01-01 号以来的提交次数:

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --no-merges --since='2017-01-01' |  grep -e 'commit [a-zA-Z0-9]*' | wc -l;done

三.常用配置

1.全局信息

git config -l

git config --list

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSEZDVGn-1680240942115)(null)]

2.gitlab 分支权限

image-20230328123600725

3.Git 全局设置

git config --global user.name "檀越剑指大厂"
git config --global user.email "327782001@qq.com"

四.常见问题

1.代码如何回滚?

  • 使用 reset,不建议用这种方式,除非对 git 非常熟练和了解,且遇到强制覆盖错误能知道如何解决,优点快速(记得备份被覆盖的分支,其实备份的过程就是第二种方式)
  • 使用新建分支的方式,安全快捷,不会冲掉自己和别人的代码,能快速解决分支冲突,代码冲突问题,保证版本正常上线.commitid 为要回退到的提交记录,建议使用这种方式
git checkout -b  新分支名  <commitid>

2.如何找回删除的分支?

使用场景:

  • 自己的代码被别人覆盖了;
  • 自己的代码被自己覆盖了;
  • 在某个分支开发,还没合并到测试分支,开发分支删除了,代码没了,如何找回代码;
#查看历史提交记录,可以翻页
git reflog --date=iso

#需要自己看注释找回分支,一定要找带commit的
git checkout -b  新分支名 <commitid>

image-20230328142027120

3.删除文件

#删除./idea 删除某个目录
git rm --cached -r .idea

4.设置合并方式

解决 git 未指定冲突处理方法的问题

hint: Pulling without specifying how to reconcile divergent branches ishint: di_Rudon

git config pull.rebase false

5.dev 合并到 master

5.1dev 运行

git branch -a //查看当前分支
git checkout dev //切换到 dev
git add . // 暂存所有更改
git commit -m "更改的备注信息" // 将修改 提交到本地仓库,双引号内是提交的备注信息
git pull origin dev // 拉取远程 dev 分支代码
git pull origin master // 拉取远程 dev 分支代码
git push origin dev // 将本地修改的代码提交到远程的 dev 分支上
git checkout master // 切换到 master 分支

5.2master 运行

git merge dev // 将 dev 分支的代码合并到 master 上

git push origin master // 将当前的更改推送到远程的 master 分支上

执行完以上命令,此时 dev 分支与 master 分支的代码已同步。

6.添加忽略文件

创建.gitignore 文件

target/
.settings/
.idea/
.mvn/
*.classpath
*.options
*.project

7.退出 git 的编辑

  • 直接按 q 键

  • 使用 esc,在用:q

8.cherry-pick

作用:把指定提交合并到指定分支

需求:把 dev 分支的 commit2 提交合并到 master 分支

实现:

git checkout master
git cherry-pick commit2

9.pull 失败

git config pull.rebase false

10.切换分支

切换到 dev 分支上,接着跟远程的 origin 地址上的 dev 分支关联起来

git checkout -b dev origin/dev

11.当前分支从哪里拉的?

git log --oneline --graph --decorate

image-20221215113536487

12.每次需要输入密码

解决办法:进入到项目目录,输入:

git config --global credential.helper store

然后你会在你本地生成一个文本,上边记录你的账号和密码。当然这些你可以不用关心。

然后你使用上述的命令配置好之后,再操作一次 git pull,然后它会提示你输入账号密码,这一次之后就不需要再次输入密码了。

13.一键发布博客

echo `ps -ef | grep /blog/blog/node_modules | grep -v grep | awk '{print $2}'`
kill -9  `ps -ef | grep /blog/blog/node_modules | grep -v grep | awk '{print $2}'`
cd /blog
rm -rf blog
git clone https://gitcode.net/qyj19920704/blog.git
cd /blog/blog
npm install
nohup  npm run dev >/dev/null 2>&1 & exit

五.上传到仓库

1.创建一个新仓库

git clone https://gitcode.net/qyj19920704/blog.git
cd blog
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

2.推送现有文件夹

cd existing_folder
git init
git remote add origin https://gitcode.net/qyj19920704/blog.git
git add .
git commit -m "Initial commit"
git push -u origin master

3.推送现有的 Git 仓库

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitcode.net/qyj19920704/blog.git
git push -u origin --all
git push -u origin --tags

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
img