常用 git 命令总结

一江春水   2016/02/26


1. reset

git reset 命令用于将当前 HEAD 复位到指定状态。一般用于撤消之前的一些操作,如:git addgit 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")'