常用 Git 命令

Git 基础命令与运用

从根本上来讲,Git 是一个内容寻址文件系统,并在此之上提供了一个版本控制系统的用户界面。这意味着 Git 的核心部分是一个简单的键值对数据库。

基础命令

  • 配置 Git

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 配置全局用户
    git config --global user.name "Your name"
    git config --global user.email "Your email"
    # 配置命令的别名
    git config --global alias.co checkout
    git config --global alias.ss status
    git config --global alias.cm commit
    git config --global alias.br branch
    git config --global alias.rg reflog
    # 删除全局配置
    git config --global --unset alias.xxx
    git config --global --unset user.xxx
  • 查看信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # 查看 git 配置
    git config --list
    # 查看用户配置
    git ~/.gitconfig
    # 查看当前项目的 git 配置
    git .git/config
    # 查看暂存区的文件
    git ls-files
    # 查看本地 git 命令历史
    git reflog
    # 查看当前 HEAD 指向
    cat .git/HEAD
    # git 中 D 向下翻一行 F 向下翻页 B 向上翻页
    # git 查看提交历史
    git log --oneline
    # 查找和关键字有关的 log
    git log --grep="关键字"
    # 图形化显示 log
    git log --graph
    # 查找指定作者的 log
    git log --author "username"
    # 显示最近 num 次提交
    git log -num
    # 显示每次更新的文件修改统计信息
    git log --stat
  • 初始化 git 仓库

    1
    git init    

    在本地创建一个新的仓库

  • Clone

    1
    git clone /path/to/repository 

    创建一个本地仓库的备份

    1
    git clone username@host:/path/to/repository

    创建一个服务上仓库的备份

    1
    git clone [url] <custom_name>

    为克隆的仓库指定别名

  • Add

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 添加一个或多个文件到索引
    git add [file1] [file2] ...
    # 将当前目录的所有文件变更提交到暂存区,不包括被删除的文件
    git add .
    # 将工作区已经追踪的文件变更提交到暂存区,不会提交新文件(即 untracked file)
    git add -u
    # 将工作区的所有文件变更提交到暂存区
    git add -A
    # 删除工作区/暂存区的文件
    git rm [file1] [file2] ...
    # 停止追踪指定文件,但此文件会保留在工作区
    git rm --cached [file]
    # 修改工作区/暂存区的文件的名称
    git mv [file_original] [file_renames]
  • Commit

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 提交变更到本地仓库
    git commit -m "Commit message"
    # add 和 commit 的合并的便捷写法
    git commit -am "Commit message"
    # 跳过验证继续提交
    git commit --no-verify
    git commit -n
    # 修改上一次提交的信息
    git commit --amend
    # 修复提交并修改提交信息
    git commit --amend -m "commit message"
  • Push/Pull

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 将本地仓库的文件推送到远程分支
    # 如果远程仓库没有这个分支,会创建一个同名的远程分支
    # 如果两者同名,则可省略远程分支名称
    git push <远程主机名> <本地分支名>:<远程分支名>
    # 如果省略本地分支名称,则表示删除指定的远程分支
    git push origin :<远程分支名>
    # 相当于
    git push origin --delete <远程分支名>
    # 将当前分支与远程分支进行关联
    git push -u origin <远程分支名>
    # 将本地的所有分支推送到远程仓库
    git push --all origin
    # 从关联的远程分支拉取更改到当前分支
    git pull
    # 拉取其它分支并合并到当前分支
    git pull origin <远程分支名>
  • Diff

    1
    2
    3
    4
    # 比较的是工作目录文件与暂存区文件的区别
    git diff
    # 比较的是暂存区的文件与仓库分支里的文件的区别
    git diff --cached
  • Status

    1
    git status

    列出你已经更改过但是还没有添加或提交的文件

  • Remote

    1
    2
    3
    4
    5
    6
    7
    8
    # 查看所有远程主机
    git remote
    # 查看关联的远程仓库的详细信息
    git remote -v
    # 移除与远程仓库的关联
    git remote rm <仓库名称>
    # 设置关联的远程仓库
    git remote set-url origin <远程仓库地址>
  • Branches

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 查看本地分支
    git branch | git branch -l
    # 查看远程分支
    git branch -r
    # 查看所有分支
    git branch -a
    # 查看所有分支和最新的提交
    git branch -av
    # 新建分支,新分支会复制当前分支已经提交到仓库的内容
    git branch <分支名>
    # 切换分支
    git checkout <分支名>
    # 创建一个新分支并切换到新分支
    git checkout -b <分支名>
    # 删除本地分支,会阻止删除包含未合并更改的分支
    git branch -d <分支名>
    # 强制删除一个本地分支,即使是包含未合并更改的分支
    git branch -D <分支名>
    # 删除远程分支
    git push origin :<分支名>
    # 或
    git push origin --delete <分支名>
    # 修改当前分支名称
    git branch -m <分支名>
  • Merge

    1
    2
    3
    4
    5
    6
    # 默认的合并方式,fast-forward,HEAD 指针直接指向被合并的分支
    git merge
    # 禁止快进式合并
    git merge --no-ff
    #
    git merge --squash
  • Tags

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 在指定的 commit id 上创建一个标签
    git tag <标签名> <commit_id>
    # 默认在 HEAD 上创建一个标签
    git tag <标签名>
    # 创建带有说明的表亲啊
    git tag -a <标签名> -m "tag message"
    # 查看所有标签
    git tag
    # 推送一个本地标签
    git push origin <标签名>
    # 推送所有本地标签
    git push origin --tags
    # 删除本地标签
    git tag -d <标签名>
    # 删除一个远程标签
    git push origin :refs/tags/<标签名>
  • Checkout

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 恢复暂存区的指定文件到工作区
    git checkout <filename>
    # 恢复暂存区的所有文件到工作区
    git checkout .
    # 回滚到最近的一次提交
    git checkout HEAD
    # 回滚到最近一次提交的上一个版本
    git checkout HEAD^
    # 切换到指定 commit
    git checkot <commit id>
  • Clean

    从当前文件夹开始,通过递归删除的方式删除不在版本控制中的文件。

    1
    2
    3
    4
    5
    6
    # 从工作区移除没有被追踪的文件
    git clean -f
    # 从工作区移除没有被追踪的目录和文件
    git clean -fd
    # 查看 clean 命令会删除哪些文件
    git clean -nfd
  • Reset

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 从暂存区撤销指定文件的修改,但并不改变工作区
    git reset <file>
    # 重置暂存区最近的一次提交
    git reset
    # 相当于
    git reset HEAD
    # 重置工作区和暂存区
    git reset --hard
    # 将当前分支的指针指向指定的 commit,同时重置暂存区,工作区不变
    git reset <commit id>
    # 等价于
    git reset --mixed <commit id>
    # 将当前分支的指针指向指定的 commit,不改变暂存区和工作区
    git reset --soft <commit id>
    # 将当前分支的指针指向指定的 commit,同时重置暂存区和工作区
    git reset --hard <commit id>
  • Revert

    1
    2
    3
    4
    5
    6
    # 生成一个撤销最近一次提交的新提交
    git revert HEAD
    # 生成一个撤销最近一次提交的上num次提交的新提交
    git revert HEAD~num
    # 生成一个撤销指定提交的新提交
    git revert <commit id>
  • Cherry-pick

    1
    2
    # 将指定的提交应用于当前分支
    git cherry-pick <commit id>
  • Search

    1
    git grep "search key word"

    在工作目录中查找指定的关键字

一些运用场景

  • 撤销提交到远程的某些提交

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 通过 `git log` 命令来获得指定的某次提交的 `id`
    git reset [<mode>] [<commit>]
    # 这个命令将当前分支的 `head` 指针指向指定的 `commit` 而且可能会根据选择的 `mode` 更新索引和工作树
    # 如果 `mode` 省略,则默认值是 `--mixed`
    # `--soft` 仅仅只是将 `head` 指向指定的 `commit`
    # `--mixed` 会重置索引,但不会重置工作区
    # `--hard` 重置索引和工作区,任何在指定的 `commit` 之后的修改将被丢弃
    # `--merge`
    # `--keep`
    git reset --hard <commit_id>
    # 然后将重置后的 `branch` 推送到远程仓库
    # `--force` 会使用本地分支的提交覆盖远程分支的提交
    git push origin HEAD --force
  • 保存当前未提交修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 将当前未提交的修改保存下来,工作目录的 Head 回到上一提交
    git stash
    # or
    git stash save 'message'
    # 列出通过 stash 保存的修改
    git stash list
    # 列出 stash 的修改与 上一次提交的 diff
    git stash show
    # 恢复之前通过 stash 保存的修改
    # 这个命令将第一个 stash 恢复,并从 stash 列表中删除
    git stash pop
    # 或者使用 apply 命令将修改恢复,但不从 stash 列表中删除
    git stash apply
    # 手动删除指定的 stash
    git stash drop stash@{0}
  • 更换远程仓库

    1
    2
    3
    4
    5
    6
    # 删除远程仓库地址
    git remote rm origin
    # 添加远程仓库地址
    git remote add origin <remote_git_address>
    # 推送本地所有分支
    git push --all origin -u
  • fast-forwardno-fast-forward 合并

    当执行 get merge 命令时,git 会根据当前分支和目标分支(将要合并的分支)的状况不同而选择合适的合并方式。

    • 如果当前分支与目标分支相比没有额外的提交时,执行 fast-foward 合并,fast-foward 合并不会产生新的提交,而是将目标分支的提交直接合并到当前分支
  • 如果当前分支与目标分支相比有目标分支并没有的提交,执行 no-fast-foward 合并,这会产生新的提交,这个提交的父提交既指向当前分支,也指向目标分支。

    1
    git merge dev
  • 变基

    git rebase 会将指定分支的