banner
xx

forest in ruins

👋 I am a front-end developer,dream to be a vloger!

git 从语法到实战协同

image.png

工欲善其事,必先利其器#

最重要的当然是要下载 Git 🚀
Terminal 插件:oh-my-zsh(mac)|oh-my-posh(windows)
Vscode 插件:Git Lens | Git Graph

why git ?#

随着程序开发的复杂化,协同成为了项目开发中必不可少的,不知道大家在与其他人一起协同的时候是如何获取同伴最新的代码呢,我相信这样传项目文件很多同学都干过,当然也包括我自己
但是使用 QQ 进行协同开发会有以下几个痛点

  • 需要手动进行代码的合并(人眼 diff)
  • 没办法多人同时进行开发
  • 如果只是简单的覆盖,可能会导致自己的代码被覆盖掉
  • 无法记录代码的修改历史(Ps:不知道屎山是谁写的,不知道 bug 需要谁去解决)
  • 无法回退代码版本(抑或是你每次都压缩一遍,这太傻了)

当然使用 QQ 等通讯软件进行协同开发不止会出现上边的问题,会有各种各样的痛点,所以使用 git 进行协同开发就十分重要了,git 也是因此而应运而生的,让我看看 git 官方对自己的描述
image.png
git 将每次的代码更改,粒度化为一个一个 commit ,又通过不同的本地分支,以及上游的线上分支,使得每个人可以在本地进行开发,最后合并到远程仓库,从而达到高效协同的进行项目开发,无论是一个两三个人的小项目,还是几百个人共同开发的复杂项目,它都可以很好的解决协同开发的问题
image.png
因此学习 git 是每一位程序员必须要掌握的,无论是帮老师做的项目,还是未来在公司工作,git 都是必不可少的,废话不多说,让我们开始学习 git

git 基础概念#

image.png

  • 本地仓库是对于远程仓库而言的(本地仓库有可能落后于远程仓库,需要在开发前拉取远程仓库信息,防止代码冲突)
  • 本地仓库 = 工作区 + 版本区
  • 工作区即磁盘上的文件集合。
  • 版本区 (版本库) 即.git 文件
  • 版本库 = 暂存区 (stage) + 分支 (master) + 指针 Head
    • 以我使用最频繁的 git 命令为例,即提交到 github 为例。
    • git init 原本本地仓库只包含着工作区,这是最常见的工作状态。此时,git init 一下,表示在本地区域创建了一个.git 文件,版本区建立。
    • git add . 表示把工作区的所有文件全部提交到版本区里面的暂存区
    • 当然你也可以通过 git add ./xxx/ 一条一条分批添加到暂存区。
    • git commit -m "xxx" 把暂存区的所有文件提交到仓库区,暂存区空空荡荡。
    • git remote add origin https://github.com/name/name_cangku.git 把本地仓库与远程仓库连接起来。
    • git push -u origin master 把仓库区的文件提交到远程仓库里。
    • 一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是 “干净” 的。会有这样的信息 nothing to commit, working tree clean

git 代码托管平台使用(gtihub)#

由于国内网络环境问题,github 可能没办法正常访问

需要使用梯子,并配置 git 代理#

// 这里请以实际的代理端口为准

git config --global https.proxy http://127.0.0.1:1080

git config --global https.proxy https://127.0.0.1:1080 

设置你的账户#

// github 使用较多,可以全局设置 github 账号
git config --global user.name "你的名字" //让你全部的Git仓库绑定你的名字

git config --global user.email "你的邮箱" //让你全部的Git仓库绑定你的邮箱

拉取远程仓库#

// 最简单的当然是直接 clone

git clone https://github.com/withastro/docs.git

// 手动创建仓库并绑定远程仓库

git init 
git remote add origin https://github.com/withastro/docs.git
git pull origin main

将更改提交并推送到远程仓库#

git add .
git commit -m "当前 commit 的标题" //commit 的描述很重要,规范详见后文
git push -u origin main

git 规范化协同开发#

分支管理#

可能很多同学,刚开始学 git 会直接在 main 分支进行开发,这样会导致很多问题,一般来说 main 分支就是生产分支,这个分支要保证稳定可靠,而在 main 分支开发和测试,一旦出现 bug 便是用户可以感知到的生产事故,在协同开发时最起码每个人要有自己的一个开发分支,这样可以有效避免代码冲突的风险,但最好的做法,是以需求为粒度,创建需求分支,在开发并测试完毕后合并到生产分支,以下我将进行举例,开发一个分支,功能是开发 image 组件

git checkout -b feat-image-component

//完成组件开发

git status //查看工作区中修改的文件,避免出现需求之外的更改
git add . //将代码提交到暂存区
git commit -m "feat: image  component"
git log --oneline //查看本地仓库的提交记录
git push -u origin feat-image-component

//确认组件符合需求后,合并到生产分支
//保证 main 分支与线上仓库一致
git checkout main
git pull

git checkout feat-image-component (当前分支:feat-image-component)
git rebase main //变基,保证提交历史的干净

//合并分支
git checkout main
git merge feat-image-component



这便是一次需求开发的正常流程,通过上述流程,会保证开发的效率,以及最大限度的避免代码冲突,和导致线上 bug ,可能有的同学会发现在 commit 时,有一个前缀 feat ,那么这是什么意思呢,那就要谈到 git 规范了

git merge 和 git rebase 的区别#

https://joyohub.com/2020/04/06/git-rebase/

commit message 规范#

规范是十分重要的,commit message 规范化,能提升代码仓库的健壮性和可维护性,其中比较常用的规范是 Google 提出的 Angular 规范,我们上边所使用的也是 Angular 规范,feat 代表的就是新增功能,我们可以看到很多开源项目使用的都是 Angular 规范,如 Antd ...
image.png
给大家列举一些常用的前缀

echo ""
	echo "feat        新功能(feature)"
	echo "fix         修补bug"
	echo "docs        文档(新增or修改)"
	echo "style       格式(不影响代码运行的变动)"
	echo "refactor    重构(即不是新增功能,也不是修改bug的代码变动)"
	echo "perf        性能优化"
	echo "test        增加测试"
	echo "chore       构建过程或辅助工具的变动dad"
	echo ""

奇技淫巧#

  • git rebase -i
  • git cherry-pick
  • git worktree
  • git stash
  • git commit --amend

git 常用语法#

  • git config --global user.name "你的名字" 让你全部的 Git 仓库绑定你的名字
  • git config --global user.email "你的邮箱" 让你全部的 Git 仓库绑定你的邮箱
  • git init 初始化你的仓库
  • git add . 把工作区的文件全部提交到暂存区
  • git add .// 把工作区的文件提交到暂存区
  • git commit -m "xxx" 把暂存区的所有文件提交到仓库区,暂存区空空荡荡
  • git remote add origin https://github.com/name/name_cangku.git 把本地仓库与远程仓库连接起来
  • git push -u origin master 把仓库区的主分支 master 提交到远程仓库里
  • git push -u origin <其他分支> 把其他分支提交到远程仓库
  • git status 查看当前仓库的状态
  • git diff 查看文件修改的具体内容
  • git log 显示从最近到最远的提交历史
  • git clone + 仓库地址下载克隆文件
  • git reset --hard + 版本号 回溯版本,版本号在 commit 的时候与 master 跟随在一起(--soft 保留更改撤销 commit ,--hard 会失去 reset 的 commit 的所有更改)
  • git reflog 显示命令历史
  • git checkout -- 撤销命令,用版本库里的文件替换掉工作区的文件。我觉得就像是 Git 世界的 ctrl + z
  • git rm 删除版本库的文件
  • git branch 查看当前所有分支
  • git branch <分支名字> 创建分支
  • git checkout <分支名字> 切换到分支
  • git merge <分支名字> 合并分支
  • git branch -d <分支名字> 删除分支,有可能会删除失败,因为 Git 会保护没有被合并的分支
  • git branch -D + <分支名字> 强行删除,丢弃没被合并的分支
  • git log --graph 查看分支合并图
  • git log --oneline 查看 commit 的概况
  • git merge --no-ff <分支名字> 合并分支的时候禁用 Fast forward 模式,因为这个模式会丢失分支历史信息
  • git stash 当有其他任务插进来时,把当前工作现场 “存储” 起来,以后恢复后继续工作
  • git stash list 查看你刚刚 “存放” 起来的工作去哪里了
  • git stash apply 恢复却不删除 stash 内容
  • git stash drop 删除 stash 内容
  • git stash pop 恢复的同时把 stash 内容也删了
  • git remote 查看远程库的信息,会显示 origin,远程仓库默认名称为 origin
  • git remote -v 显示更详细的信息
  • git pull 把最新的提交从远程仓库中抓取下来,在本地合并,和 git push 相反
  • git rebase 把分叉的提交历史 “整理” 成一条直线,看上去更直观(开发中通常使用 rebase,而不是直接使用 merge)
  • git tag 查看所有标签,可以知道历史版本的 tag
  • git tag 打标签,默认为 HEAD。比如 git tag v1.0
  • git tag <版本号> 把版本号打上标签,版本号就是 commit 时,跟在旁边的一串字母数字
  • git show 查看标签信息
  • git tag -a -m "<说明>" 创建带说明的标签。 -a 指定标签名,-m 指定说明文字
  • git tag -d 删除标签
  • git push origin 推送某个标签到远程
  • git push origin --tags 一次性推送全部尚未推送到远程的本地标签
  • git push origin /tags/ 删除远程标签
  • git config --global color.ui true 让 Git 显示颜色,会让命令输出看起来更醒目
  • git add -f 强制提交已忽略的的文件
  • git check-ignore -v 检查为什么 Git 会忽略该文件
  • git cherry-pick <commit hash 值>
  • git worktree 创建一个新的工作区,可以快速在本地同时开发多个分支的仓库(可以拷贝了一份本地仓库)
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。