一、常用指令
| 指令 | 含义 |
|---|---|
| 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 –a | git 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-only | Git 导出某两次提交之间的差异文件 |
| 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
两种方式有何区别?为什么推荐第一种?
这是因为在团队协作开发的过程中,将合并操作限制在线上环境有以下几个好处:
- 避免本地合并冲突:如果多个开发人员同时在本地进行合并操作,并且对同一段代码进行了修改,可能会导致冲突。将合并操作集中在线上环境可以减少此类冲突的发生,因为不同开发人员的修改会先在线上进行合并,然后再通过更新拉取到本地。
- 更好的代码审查:将合并操作放在线上环境可以方便其他开发人员进行代码审查。其他人员可以在线上查看合并请求的代码变动、注释和讨论,并提供反馈和建议。这样可以确保代码的质量和可维护性。
- 提高可追溯性和可回滚性:将合并操作记录在线上可以更容易地进行版本控制和管理。如果出现问题或需要回滚到之前的版本,可以更轻松地找到相关的合并记录并进行处理。
当然,并非所有情况都适用于第一种方式。在某些特定情况下,例如个人项目或小团队内部开发,允许本地合并也是可以的。但在大多数团队协作的场景中,将合并操作集中在线上环境具有更多优势。
6、验收完成,删除分支
git branch -d <分支名>
# 如果要强制删除分支(即使分支上有未合并的修改)
git branch -D <分支名>