01 储藏功能(Stash)
git stash list [<log-options>]
git stash push(原 git stash save)
1.1 git stash 保存部分文件
git stash
是git stash push
命令省略写法
git stash push
指令本身就支持指定文件。
$ git stash push <file1> <file2> <file3> [file4 ...]
$ git stash push -m "测试" src/java/**/*.java Help.java OK.java
1.2 git stash -u 保存未跟踪文件
$ git stash save
[-p|--patch]
[-k|--[no-]keep-index]
[-q|--quiet]
[-u|--include-untracked] *
[-a|--all]
[<message>]
02 恢复功能(Reset)
2.1 git reset 取消 Add
误 add 多个文件,只撤销部分文件
$ git reset HEAD /path/to/dir/or/file
$ git reset HEAD szy-admin/src/test/com/szy/web/SysUserServiceTest.java
Unstaged changes after reset:
M szy-analysis/src/main/resources/mapper/analysis/fbt/FbtRequestLogMapper.xml
M szy-system/src/main/resources/mapper/system/SysUserMapper.xml
2.2 git reset 取消 commit
# 取消提交,回复修改的文件
$ git reset --soft HEAD^
# 取消提交,丢弃修改
$ git reset --hard HEAD^
# 回退上上上一个版本
$ git reset --soft HEAD~3
03 标签(Tag)
3.1 查询
# 列出所有
$ git tag
# 搜索符合模式的Tag
$ git tag -l 'v0.1.*''
3.2 打标签
# 轻量标签
$ git tag v0.1.2
# 附带说明的标签
$ git tag -a v0.1.2 -m "0.1.2 测试版本"
# 打在指定 commit 上,只需在上面两个命令后加上 commit id
$ git tag v0.1 88772sa00
3.3 删除标签
$ git tag -d v0.1.2
3.4 推送标签
# 将v0.1.2 Tag提交到git服务器
$ git push origin v0.1.2
# 将本地所有Tag一次性提交到git服务器
$ git push origin --tags
3.5 获取最新 tag
- Shell sort 排序
- 获取当前分支标签:
--merged BRANCH_NAME/commitId
,不指定默认 HDEA(默认当前分支) - Shell 排序:sort
-t
:指定分隔符-n
:依照数值的大小排序-r
:以相反的顺序来排序-k
:指定需要排序的列
- 获取当前分支标签:
$ git tag --merged test | sort -t. -n | tail -n 1
- git 自带
--srot=<key>
参数version:refname
:tag 被当成版本号排序,同<v:refname>
$ git tag --sort=version:refname --merged | tail -n 1
04 分支操作
4.1 分支基本操作
# 查看本地分支
> git branch
# 查看远程分支
> git branch -r
# 创建分支但不切换
> git branch <branch-name>
# 切换到指定分支
> git checkout <branch-name>
# 创建并切换到新分支(以当前所在分支为基础)
> git checkout -b <branch-name>
# git 2.23+
> git switch -c <branch-name>
# 删除本地分支
> git branch -d <branch-name>
# 强制删除本地分支(即使有未合并的更改)
> git branch -D <branch-name>
# 重命名本地分支
> git branch -m <new-branch-name>
# 从指定分支新建分支并切换(或 switch -c)
> git checkout -b <branch-name> a123213cid
Switched to a new branch <branch-name>
# 注意:这里不能指定分支名称,否则会把新分支关联到该分支,相当于该分支的别名
# 等于是直接在操作原分支,如果指定的是 master,会直接操作 master
> git switch -c hotfix/hello origin/master
branch 'hotfix/hello' set up to track 'origin/master'.
Switched to a new branch 'hotfix/hello'
4.2 分支合并
- 合并提交,并生成一个合并提交
- 不能保持 master 分支干净,但是保持了所有的 commit history,大多数情况下都是不好的,个别情况挺好
$ git merge <branch-name>
- 压缩合并,多个提交合并成一个提交
- 以保持 master 分支干净,但是 master 中 author 都是 maintainer,而不是原 owner
$ git merge <branch-name> --squash # 这时候,修改的文件在当前分支都变成未提交 # 下一步,提交这些记录,生成一个新的提交(可能要解决冲突) $ git commit -m "feat: xxx"
- 变基合并,可以尽可能保持 master 分支干净整洁,并且易于识别 author
- 变基:在要合并的分支
git rebase -i 要合并进去的目标分支
- 合并:在目标分支合并
git merge 要合并的分支
- 变基其实就是找到两个分支共同的祖先,然后在当前分支上合并从共同祖先到现在的所有 commit
ce6ecf4 - (HEAD -> master, test) add sth.3 (8 minutes ago) \<zqq> (test commit, master merged) 82f08db - add sth.2 (29 minutes ago) \<zqq> (test commit) 3d9a1f4 - add sth. (35 minutes ago) \<zqq> (test commit) f620135 - init (37 minutes ago) \<zqq>
- 变基:在要合并的分支
References
[1] 魔地主. Git tag 给当前分支打标签. https://blog.csdn.net/u013802160/article/details/55103186 , 2017-02-14.