Git相关内容

266 阅读6分钟

一、常用指令

指令含义
git clone [地址] [重命名]克隆
git remote add [仓库名] [远程链接]添加远程版本库
git branch查看分支
git branch -d [分支]检查是否合入再删除本地分支
git branch -D [分支]直接删除本地分支
git push origin -d [分支]删除远程分支
git log查看当前分支提交历史
git reflog查看所有分支操作记录
git add. || git add file将文件放入暂存区
git commit –m [message]提交信息并保存到本地仓库
git commit –agit commit –m + git add
git push [远程主机名] [本地分支名]:[远程分支名]推送到远程
git pull拉取远程分支并合并
git fetch拉取远程分支
git merge合并
git revert HEAD撤销前一次暂存
git remote update origin --p更新远程分支列表到本地
git update-index --assume-unchanged 你的文件路径执行命令将文件加入不提交队列
git update-index --no-assume-unchanged 你的文件路径执行命令将文件加入提交队列
git show --raw查看最后一次提交记录的修改文件信息
git diff --name-onlyGit 导出某两次提交之间的差异文件
git reset --hard版本回退
git stash save '注释'本地储存
git stash list查看储存列表
git stash apply [分支index]应用index储存
git stash drop [分支index]丢弃index储存
git branch --set-upstream-to=origin/start start本地分支和远程分支进行关联
git submodule add [url] [path]添加子模块

注意: git stash apply 命令在PowerShell会出错因为大括号在PowerShell中被认为是代码块执行标识符。

二、子模块(submodule)

1、添加子模块

git submodule add [url] [path]
# url : 子仓的地址
# path : 子模块在主仓中的路径,可选项,若不指定则默认使用子仓的仓库名作为路径

git submodule add -b [branchName] [url] [path]
# 在添加的时候使用`-b`参数,可以指定子模块的分支

添加子模块后,主仓会添加一个.gitmodules文件,如:

[submodule "cdk"]
	path = cdk
	url = https://github.com/zjy-10000hours/proj-sub-1.git

2、colne 一个存在子模块的仓库

直接执行 clone 命令是无法把子仓库一起克隆下来的,这里有两种方法:

1) 使用 --recursive 参数

在 clone 时添加 --recursive 参数,这样子模块也会一起克隆下来。

git clone --recursive <仓库地址>

2)手动 clone 子模块。

如果在 clone 时没有添加 --recursive 参数,那么子模块不会自动 clone 下来,需要手动 clone 子模块。

可以执行以下两个命令:

git submodule init # 注册子模块
git submodule update # 更新子模块
# 这两个命令还可以合并成一个命令:
git submodule update --init

3、更新子模块

如果子模块有更新,需要更新子模块。

1)git submodule update更新子模块:

git submodule update <子模块名字> # 更新指定子模块 不指定名字则更新所有子模块

2)git pull 命令,更新子模块

子模块本质也是个 git 仓库,因此,也可以进入子模块目录,执行 git pull 命令,更新子模块

cd packages
git pull

注意,在更新之后,需要在主仓库把子模块的变更记录,也就是那个特殊的文件提交上去。

4、删除子模块

git rm <子模块名字> # 删除子模块
git deinit <子模块名字> # 解除子模块与父仓库的关联

三、使用流程

1、拉取代码

git clone https://code.xxx.com/xxx/xxx.git

2、先拉取生产分支/更新生产分支

先拉取生产分支:

git fetch origin release:release
git checkout release

更新生产分支:

git checkout release
git pull origin release

3、创建自己的分支

git checkout -b feat-0131-jie
# 分支名称是有规范和含义的,不能乱取。
# 推荐格式:`分支责任-需求日期/需求号-开发人姓名`,一般按部门规范来,常见的有以下几种
# feat:新功能
# fix:修补bug
# doc:文档
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:测试
# chore:构建过程或辅助工具的变动

4、本地提交代码

git add .
git commit -m "提交描述"

5、合并及推送到远程

1)线上合并

先推送到远程,然后线上解决冲突并合并

git push origin feat-0131-jie

2)本地合并

## 先切换到你要提交的环境分支上,如果本地还没有就先拉取下来
git fetch origin test:test

git checkout test

## 然后将自己的分支合并到环境分支上(在编辑器解决冲突)
git merge feat-0131-jie

## 最后将环境分支推送到远程仓库
git push origin test

## 先切换到你要提交的环境分支上,如果本地已有该分支,则需要先拉取最新代码
git checkout test

git pull origin test

## 然后将自己的分支合并到环境分支上(在编辑器解决冲突)
git merge feat-0131-jie

## 最后将环境分支推送到远程仓库
git push origin test

两种方式有何区别?为什么推荐第一种?

这是因为在团队协作开发的过程中,将合并操作限制在线上环境有以下几个好处:

  1. 避免本地合并冲突:如果多个开发人员同时在本地进行合并操作,并且对同一段代码进行了修改,可能会导致冲突。将合并操作集中在线上环境可以减少此类冲突的发生,因为不同开发人员的修改会先在线上进行合并,然后再通过更新拉取到本地。
  2. 更好的代码审查:将合并操作放在线上环境可以方便其他开发人员进行代码审查。其他人员可以在线上查看合并请求的代码变动、注释和讨论,并提供反馈和建议。这样可以确保代码的质量和可维护性。
  3. 提高可追溯性和可回滚性:将合并操作记录在线上可以更容易地进行版本控制和管理。如果出现问题或需要回滚到之前的版本,可以更轻松地找到相关的合并记录并进行处理。

当然,并非所有情况都适用于第一种方式。在某些特定情况下,例如个人项目或小团队内部开发,允许本地合并也是可以的。但在大多数团队协作的场景中,将合并操作集中在线上环境具有更多优势。

6、验收完成,删除分支

git branch -d <分支名>
# 如果要强制删除分支(即使分支上有未合并的修改)
git branch -D <分支名>

四、参考

1、Git 子模块 (Submodule) 使用介绍 2、大厂真实 Git 开发工作流程