开始一个工作区(参见:git help tutorial)

clone:克隆仓库到一个新目录

  • 默认

    1
    git clone <remote-url>
  • 重命名本地仓库文件夹名

    1
    git clone <remote-url> <new-local-folder-name>
  • 克隆指定分支

    1
    git clone -b <branch-name> <remote-url>

init:创建一个空的 Git 仓库或重新初始化一个已存在的仓库

该命令不需要 Git Config 中的 user.nameuser.email

在当前变更上工作(参见:git help everyday)

add:添加文件内容至索引

mv:移动或重命名一个文件、目录或符号链接

Git 对文件名大小写不敏感。

  • 如需修改文件名(包含文件类型后缀),需要这样做:

    1
    git mv <old-file-path> <new-file-path>
  • 将目录 A 下所有文件夹/文件移动到目录 B 下:

    1
    2
    3
    4
    git mv <folder-a>/* <folder-b>/

    # for example:
    git mv src/img/* src/images

restore:恢复工作区文件

rm:从工作区和索引中删除文件

--cached:仅从索引中删除文件

  • 仅仅在索引中删除文件,而不会从(本地)工作区中删除文件。
  • commitpush 本次操作,才会在远程仓库中删除文件。
1
git rm --cached <file-name>

--f / --force:强制删除文件

  • 会在本地工作区和索引中删除文件,并且不会提示用户。

  • commitpush 本次操作,才会在远程仓库中删除文件。

    1
    2
    git rm --f <file-name>
    git rm --force <file-name>

--ignore-unmatch:忽略不匹配的文件

sparse-checkout:初始化及修改稀疏检出

检查历史和状态(参见:git help revisions)

bisect:通过二分查找定位引入 bug 的提交

diff:显示提交之间、提交和工作区之间等的差异

grep:输出和模式匹配的行

log:显示提交日志

show:显示各种类型的对象

status:显示工作区状态

扩展、标记和调校您的历史记录

branch:列出、创建或删除分支

-d / -D

  • 删除远程分支:

    1
    git push -d origin remote-branch-name

删除在远程已被删除的本地/远程分支记录

  • 删除“无用”的本地分支

    1
    git branch -D branch-name
  • 批量删除“无用”的本地分支

    • 一次性删除所有包含特殊字段的已合并分支
    1
    2
    git branch | grep 'change-*' | xargs git branch -d
    // 切记不要用 -D,否则会删除未合并的分支
  • 删除“无用”的远程分支

    这里所谓“‘无用’的远程分支”,是指在远程已经删除了的分支,在本地哪怕是 git pull 后,本地依旧还是显示存在该远程分支的记录。

    • 一次性删除本地所有无用的远程分支记录

      1
      git remote prune origin

      在这之前其实建议先查看远程和本地的分支对应情况

      • 有对应关系的,则为 tracked
      • 无对应远程关系的,则为 stale
      1
      git remote show origin

      git-common-commands-0.png

      在执行了 git branch -D branch-name,会得到以下执行结果

      git-common-commands-1.png

-m:修改分支名

1
git branch -m <old-branch-name> <new-branch-name>

commit:记录变更到仓库

--amend

  • 修改 commit message,或者并且要追加改动内容

    1
    git commit --amend

--no-edit

  • 仅仅追加改动内容

    1
    git commit --amend --no-edit

merge:合并两个或更多开发历史

--abort:终止合并

当你想终止当前的合并进程时,可此时的 Ctrl + C / control + C 是毫无作用的)。

但你可以使用 git merge--abort 参数。

1
git merge --abort

cherry-pick:应用一些现有的提交所引入的修改(分支之间)

  • 默认。若无冲突,直接合并。提交时间为引用提交的提交时间,但 commit id 与引用提交的 commit id 不一致。

    1
    git cherry-pick <commit-id>
  • <commit-id>:仅需要前 7 位即可

  • 更多参考

    git cherry-pick 教程

rebase:在另一个分支上重新应用提交

谨慎使用

reset:重置当前 HEAD 到指定状态

  • 回滚某个提交,1 ~ n。这会将提交记录,和代码改动一起回滚

    1
    git reset HEAD~n

—-soft

  • 仅仅撤销提交记录,代码改动不撤销(常用)

    1
    git reset --soft HEAD~n

switch:切换分支

checkout “分支管理“功能的替代者,在 Git v2.23 中引入

  • 切换已有分支

    1
    git switch branch-name

-c

  • 创建并切换到新分支

    • 基于当前所在的本地分支创建新的本地分支
    1
    git switch -c branch-name
    • 基于远程分支创建新的本地分支
    1
    2
    git switch -c <new-branch-name> origin/branch-name
    git switch -c <new-branch-name> upstream/branch-name

--orphan

  • 创建并切换到一个不包含任何内容的分支,无文件,无提交:

    1
    git switch --orphan <new-branch-name>

但当前所在分支必须要提交完所有已改动文件,不然无法创建。

假如想创建一个文件存在但不包含提交信息的新分支,则使用 checkout--orphan 参数:git checkout --orphan <new-branch-name>

tag:创建、列出、删除或校验一个 GPG 签名的标签对象

创建

Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。

轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。

而附注标签是存储在 Git 数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用 GNU Privacy Guard(GPG)签名并验证。通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。

—《Git Pro》

附注标签(annotated)

创建附注标签:

1
git tag -a <tag-name> -m "tag message"
  • -a:指定创建附注标签
  • -m:指定标签信息

轻量标签(lightweight)

轻量标签本质上是将提交校验存储到一个文件中——没有保存任何其他信息。创建轻量标签,不需要使用 -a-s(笔者注:-s, –sign:annotated and GPG-signed tag) 或 -m 选项,只需要提供标签名字。

—《Git Pro》

1
git tag <tag-name>

列出

  • 所有

    1
    2
    # 列出 - 所有的
    git tag
  • 检索

    1
    2
    # 列出 - 检索
    git tag -l "tag-name-keywords"

删除

  • 仅删除本地 tag

    1
    2
    # 删除
    git tag -d <tag-name>
  • 删除本地和远程 tag

    1
    2
    git tag -d <tag-name>
    git push origin :refs/tags/<tag-name>
  • 仅删除远程 tag

    1
    git push origin --delete <tag-name>

推送

新建的 tag 记录并不会跟随 git push / git push origin branch-name 一起推送,需要在 git push 时显式地指定 tag name 以推送 tag 记录:

1
git push origin <tag-name>

协同(参见:git help workflows)

fetch:从另外一个仓库下载对象和引用

pull:获取并整合另外的仓库或一个本地分支

git pull,是“先执行 git fetch 然后在执行 git merge FETCH_HEAD ”的操作简写。

push:更新远程引用和相关的对象

--force/ -f:强制

使用本地分支的提交覆盖远程仓库分支的提交。有安全隐患,会覆盖掉其他人在该分支的新提交。

1
2
git push --force
git push -f

--force-with-lease

使用该参数,如果远程仓库有其他人推送了新的提交,那么你本次的覆盖推送将被拒绝。

1
git push --force-with-lease

--mirror禁止使用

该命令,会把本地仓库的所有本地分支作为新的源/版本,推送到远程仓库,覆盖仓库原有内容。

假如本地分支中没有远程仓库中的某些分支,那么远程仓库上的这些分支将被删除……

1
git push --mirror

Tool

Fork - a fast and friendly git client for Mac and Windows