something about git
Git-Flow
不同分支 , 各司其职 。
分支类型 | 命名规范 | 创建自 | 合并至 | 说明 |
---|---|---|---|---|
main | main | - | - | 部署版本分支 |
develop | develop | - | - | 代码集成分支 |
feature | feature/* | develop | develop | 新功能分支 |
release | release/* | develop | develop和master | 新版本发布 |
hotfix | hotfix/* | master | develop和master | 生产环境中发现的紧急bug的修复 |
git command
分支(branch)
使用 checkout 创建分支
1
2# 基于main分支创建develop分支
git checkout -b develop main使用 switch 创建分支
1
2# 基于当前分支创建feature/switch分支
git switch -c feature/switch使用 switch 切换分支
1
2# 切换到feature/switch分支
git switch feature/switch合并分支(merge)
1
2
3
4# 合并feature/switch分支到当前分支(develop)
git switch develop
# --no-ff => no-fast-forward
git merge --no-ff feature/switch
暂存区(stage)
将内容添加至暂存区
1
2
3
4# 添加当前目录下所有文件更改:
git add .
# 添加file文件更改:
git add file将文件的部分内容添加至暂存区
1
2
3
4
5
6
7# 对于已经暂存的文件, 开启交互模式后选择需要暂存的hunk
git add -p <filename>
# ######################
# 对于未暂存的文件 先将文件添加至暂存区,但是文件内容不暂存
git add -N <filename>
# 然后再开启交互模式选择需要暂存的hunk
git add -p <filename>误添加至暂存区的内容 取消添加
将
add
进暂存区的内容(还未提交),取消add
,但是本地文件内容不做删除。1
2
3
4# 将 filename.txt 文件取消 `add`
git reset HEAD -filename.txt
# 将当前目录下所有已添加文件,取消`add`
git reset HEAD .
提交(commit)
将暂存区内容做一次提交
提交至本地仓库,正式纳入版本记录。
一次提交,看作一次版本的 原子 操作。1
2
3git commit
# 随之而来的vim提交窗口中补充commit的对应message。
# message保持Angular规范Angular规范保持 <type>(<scope>): <subject> 格式
具体要求如下:- 主要type
- feat: 增加新功能
- fix: 修复bug
- 特殊type
- docs: 只改动了文档相关的内容
- style: 不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
- build: 构造工具的或者外部依赖的改动,例如webpack,npm
- refactor: 代码重构时使用
- revert: 执行git revert打印的message
- 暂不使用type
- test: 添加测试或者修改现有测试
- perf: 提高性能的改动
- ci: 与CI(持续集成服务)有关的改动
- chore: 不修改src或者test的其余修改,例如构建过程或辅助工具的变动
- 主要type
修改最后一次提交
发现提交错了:
少提交文件
、comment写错了
时都可以使用git commit
命令的--amend
参数。修改
comment
1
2
3git commit --amend -m "new comment"
# 或进入vim中编辑`comment`
git commit --amend补充漏提交文件
1
2
3
4# 将文件添加至暂存区
git add file
# 附加提交
git commit --amend删除多提交文件时,
git rm file
将文件从暂存区中移除,其它相同。修改提交时不修改
comment
1
2# 多使用`--no-edit`参数,将以不修改`comment`的方式修改上次的提交内容
git commit --amend --no-edit
备份(stash)
备份当前工作区内容
将当前工作区内容保存到Git栈中,工作区回到最近提交状态。
1
git stash
从Git栈中恢复最近一次保存的内容
1
git stash pop
清空Git栈
1
git stash clear
子模块(submodule)
添加子模块
可以将不同仓库的模块添加至本模块中。
1
2# git submodule add <url> <path>
git submodule add git@github.com:username/otherModule.git ~/localModule/otherModule子模块内容获取
克隆包含子模块的项目时,子模块信息会克隆下来,但其包含的项目文件未克隆。
1
2
3
4
5
6
7
8# 使用 init 进行 子模块初始化
git submodule init
# 使用 update 进行 子模块获取
git submodule update
# 使用 --recursive 参数,获取子模块及包含的"子...子"模块
git submodule update --recursive
# 使用 --remote 参数获取子模块最新版本到本地仓库中
git submodule update --remote子模块删除
不需要子模块时,删除相应子模块。
1
2
3
4
5
6
7
8
9
10# 1. 删除本地仓库中子模块目录
rm -rf path/to/remoteModule
# 2. 删除.gitmodules中相关内容
vim .gitmodules
# 3. 删除 .git/config 文件中相关内容
vim .git/config
# 4. 删除子模块的追踪块
rm -rf .git/module/remoteModule
# 5. 删除子模块缓冲区
git rm --cached remoteModule
git add -p 参数
选项 | 说明 |
---|---|
y | 暂存当前块 |
n | 不暂存当前块 |
a | 暂存当前块及剩余块 |
d | 不暂存当前块及剩余块 |
g | 选择并跳转至指定的块 |
/ | 正则搜索指定的块 |
j | 离开当前未定块,处理下一个 未定 块 |
J | 离开当前未定块,处理下一个块 |
k | 离开当前未定块,处理上一个 未定 块 |
K | 离开当前未定块,处理上一个块 |
s | 将当前块分为更小的块 |
e | 手动编辑当前块 |
? | help |
something about github
- 更改github邮箱导致贡献丢失
- 克隆目标仓库
1
2git clone git@github.com:username/target.git
cd target/ - 制作脚本文件
1
touch run.sh
- 将以下内容添加至 run.sh 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# OLD_EMAIL 为旧邮箱
# CORRECT_NAME 为用户名
# CORRECT_EMAIL 为新邮箱
git filter-branch --env-filter '
OLD_EMAIL="old_mail@xxx.com"
CORRECT_NAME="correctName"
CORRECT_EMAIL="new_mail@xxx.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags - 在仓库中运行 run.sh
1
2
3# 添加执行权限
chmod u+x ./run.sh
bash ./run.sh - 检查git log 中对应邮箱是否更改
1
git log
- 提交至远端
1
git push --force --tags origin 'refs/heads/*'
- 克隆目标仓库