1. reset
git reset
命令用于将当前 HEAD
复位到指定状态。一般用于撤消之前的一些操作,如:git add
、git commit
等。
HEAD
说明:
HEAD
表示当前版本HEAD^
上一个版本HEAD^^
上上一个版本- 以此类推…
可以使用~
+数字表示:
HEAD~0
表示当前版本HEAD~1
上一个版本HEAD^2
上上一个版本- 以此类推…
1.1 将文件移出暂存区
git reset HEAD [file]
1.2 回退版本
git reset [--mixed | --hard | --soft] [HEAD | commit]
- –soft 修改版本库,不修改暂存区,不修改工作区;仅移动 HEAD 指针;
- –mixed 为默认值,修改版本库,修改暂存区,不修改工作区,用于重置暂存区的文件与上一次的提交(commit)保持一致;移动 HEAD 指针,并将暂存区内容重置为未暂存状态;
- –hard 修改版本库,修改暂存区,修改工作区。自从 commit 以来在工作目录中的任何改变都被丢弃,并把 HEAD 指向 commit;
2. rebase
2.1 修改操作历史
git rebase -i [startpoint] [endpoint]
- -i: –interactive,弹出交互式操作界面
如修改最近 4 次提交历史:
git rebase -i HEAD~3
弹出的交互式命令:
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
查看更多用法,可运行以下命令:
git --help rebase
2.2 提取一段 commits 到另一个分支
git rebase --onto <base> <branch1> <branch2>
将区间 (branch1最后的commit, branch2最后的commit] (左开右闭)的 commits 打到 base 分支上。
git rebase --onto <base> <commit1> <commit2>
将区间 (commit1, commit2] (左开右闭)的 commits 打到 base 分支上。
3. cherry-pick
将单个或多个 commit 提取到其他分支,从 1.7.2 版本开始,支持批量 cherry pick。
简单用法:
git cherry-pick -x <commit>
- -x: 会保留原提交信息 “(cherry picked from commit …)”
- 执行该命令后,会生成新的 commit,其哈希值与原来的不同,但标识名相同;
-
如果出现冲突,解决方法与普通提交一样;
git cherry-pick (--continue | --skip | --abort | --quit)
批量提取:
git cherry-pick <start-commit-id>..<end-commit-id> #左开右闭区间
git cherry-pick <start-commit-id>^..<end-commit-id> #闭区间
4. stash
4.1 暂存工作进度
git stash save [<message>] [-k|--no-keep-index] [--patch]
-k
和--no-keep-index
指定保存进度后,是否重置暂存区--patch
会显示工作区和 HEAD 的差异,通过编辑差异文件,排除不需要保存的内容。和git add -p
命令类似
4.2 列显进度列表
git stash list [<options>]
4.3 恢复工作进度
git stash pop [--index] [-q|--quiet] [<stash>]
- 会从暂存进度列表中删除已恢复的进度
--index
参数:不仅恢复工作区,还恢复暂存区<stash>
指定恢复某一个具体进度。如果没有这个参数,默认恢复最新进度
git stash apply [--index] [-q|--quiet] [<stash>]
- 同
git stash pop
,但不删除已恢复的进度
4.4 删除工作进度
git stash drop [-q|--quiet] [<stash>] #没有 stash, 会删除最新的进度
git stash clear #删除所有进度
4.5 基于进度创建分支
git stash branch <branchname> [<stash>]
5. 其他常用命令
5.1 删除分支
git branch -d [branchName] #删除本地分支
git push origin --delete [branchName] #删除远程分支
git push origin :[branchName] #删除远程分支
5.2 删除 tag
git tag -d [branchName] #删除本地tag
git push origin --delete tag [tagName] #删除远程tag
git push origin :refs/tags/[tagName] #删除远程tag
5.3 清除远端无效分支
git remote prune origin [--dry-run | -n]
-n
,--dry-run
: Do not actually prune any entries; just show what would have been pruned.
5.4 清除缓存
git rm <file> --cached
git rm -r --cached
5.5 修改历史 Author Email
git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' \
--email-callback 'return email.replace(b"old@email.com", b"new@email.com")'