cheatsheet最后更新于:2020年6月30日

Git Cheat Sheet

安装

配置工具

  • 列出当前配置:
$ git config --list
  • 列出repository配置:
$ git config --local --list
  • 列出全局配置:
$ git config --global --list
  • 列出系统配置:
$ git config --system --list
  • 对所有本地仓库的用户信息进行配置。
$ git config --global user.name "[name]"
  • 对你的commit操作设置关联的用户名。
$ git config --global user.email "[email address]"
  • 对你的commit操作设置关联的邮箱地址。
$ git config --global color.ui auto
  • 设置git命令输出为彩色:
$ git config --global color.ui auto
  • 设置git使用的文本编辑器设:
$ git config --global core.editor vi

配置文件

  • Repository配置对应的配置文件路径[--local]:
<repo>/.git/config
  • 用户全局配置对应的配置文件路径[--global]:
~/.gitconfig
  • 系统配置对应的配置文件路径[--local]:
/etc/gitconfig

创建

  • 复制一个已创建的仓库:
# 通过 SSH
$ git clone ssh://user@domain.com/repo.git

#通过 HTTP
$ git clone http://domain.com/user/repo.git
  • 创建一个新的本地仓库:
$ git init

本地修改

  • 显示工作路径下已修改的文件:
$ git status
  • 显示与上次提交版本文件的不同:
$ git diff
  • 把当前所有修改添加到下次提交中:
$ git add .
  • 把对某个文件的修改添加到下次提交中:
$ git add -p <file>
  • 提交本地的所有修改:
$ git commit -a
  • 提交之前已标记的变化:
$ git commit
  • 附加消息提交:
$ git commit -m 'message here'
  • 提交,并将提交时间设置为之前的某个日期:
git commit --date="`date --date='n day ago'`" -am "Commit Message"
  • 修改上次提交

请勿修改已发布的提交记录!

$ git commit --amend
  • 修改上次提交的committer date:
GIT_COMMITTER_DATE="date" git commit --amend
  • 修改上次提交的author date:
git commit --amend --date="date"
  • 把当前分支中未提交的修改移动到其他分支:
git stash
git checkout branch2
git stash pop
  • 将 stashed changes 应用到当前分支:
git stash apply
  • 删除最新一次的 stashed changes:
git stash drop

搜索

  • 从当前目录的所有文件中查找文本内容:
$ git grep "Hello"
  • 在某一版本中搜索文本:
$ git grep "Hello" v2.5

提交历史

  • 从最新提交开始,显示所有的提交记录(显示hash, 作者信息,提交的标题和时间):
$ git log
  • 显示所有提交(仅显示提交的hash和message):
$ git log --oneline
  • 显示某个用户的所有提交:
$ git log --author="username"
  • 显示某个文件的所有修改:
$ git log -p <file>
  • 仅显示远端分支与远端分支提交记录的差集:
$ git log --oneline <origin/master>..<remote/master> --left-right
  • 谁,在什么时间,修改了文件的什么内容:
$ git blame <file>
  • 显示reflog:
$ git reflog show
  • 删除reflog:
$ git reflog delete

###分支与标签

  • 列出所有的分支:
$ git branch
  • 列出所有的远端分支:
$ git branch -r
  • 切换分支:
$ git checkout <branch>
  • 创建并切换到新分支:
$ git checkout -b <branch>
  • 基于当前分支创建新分支:
$ git branch <new-branch>
  • 基于远程分支创建新的可追溯的分支:
$ git branch --track <new-branch> <remote-branch>
  • 删除本地分支:
$ git branch -d <branch>
  • 强制删除一个本地分支:

将会丢失未合并的修改!

$ git branch -D <branch>
  • 给当前版本打标签:
$ git tag <tag-name>
  • 给当前版本打标签并附加消息:
    $ git tag -a <tag-name>

更新与发布

  • 列出当前配置的远程端:

    $ git remote -v

  • 显示远程端的信息:

    $ git remote show <remote>

  • 添加新的远程端:

    $ git remote add <remote> <url>

  • 下载远程端版本,但不合并到HEAD中:

    $ git fetch <remote>

  • 下载远程端版本,并自动与HEAD版本合并:

    $ git remote pull <remote> <url>

  • 将远程端版本合并到本地版本中:

    $ git pull origin master

  • 以rebase方式将远端分支与本地合并:

    git pull --rebase <remote> <branch>

  • 将本地版本发布到远程端:

    $ git push remote <remote> <branch>

  • 删除远程端分支:

    $ git push <remote> :<branch> (since Git v1.5.0)
    or
    git push <remote> --delete <branch> (since Git v1.7.0)

  • 发布标签:

    $ git push --tags
    ### 合并与重置(Rebase)

  • 将分支合并到当前HEAD中:

    $ git merge <branch>

  • 将当前HEAD版本重置到分支中: 请勿重置已发布的提交!

    $ git rebase <branch>

  • 退出重置:

    $ git rebase --abort

  • 解决冲突后继续重置:

    $ git rebase --continue

  • 使用配置好的merge tool 解决冲突:

    $ git mergetool

  • 在编辑器中手动解决冲突后,标记文件为已解决冲突

    $ git add <resolved-file>

$ git rm <resolved-file>
  • 合并提交:
    $ git rebase -i <commit-just-before-first>

把上面的内容替换为下面的内容:

原内容:

pick <commit_id>
pick <commit_id2>
pick <commit_id3>

替换为:

pick <commit_id>
squash <commit_id2>
squash <commit_id3>
### 撤销

  • 放弃工作目录下的所有修改:

    $ git reset --hard HEAD

  • 移除缓存区的所有文件(i.e. 撤销上次git add):

    $ git reset HEAD

  • 放弃某个文件的所有本地修改:

    $ git checkout HEAD <file>

  • 重置一个提交(通过创建一个截然不同的新提交)

    $ git revert <commit>

  • 将HEAD重置到指定的版本,并抛弃该版本之后的所有修改:

    $ git reset --hard <commit>

  • 用远端分支强制覆盖本地分支:

    git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature

  • 将HEAD重置到上一次提交的版本,并将之后的修改标记为未添加到缓存区的修改:

    $ git reset <commit>

  • 将HEAD重置到上一次提交的版本,并保留未提交的本地修改:

    $ git reset --keep <commit>

  • 删除添加.gitignore文件前错误提交的文件:

    $ git rm -r --cached .
    $ git add .
    $ git commit -m "remove xyz file"

操作列表

操作 指令
常用操作
仓库初始化 git init
添加至暂存区 git add <file>
提交代码 git commit -m "message"
仓库状态 git status
改动查询 git diff
历史记录 git log
历史记录(简化) git log --pretty=oneline
历史记录(分支图) git log --graph
停止追踪某一文件 git rm --cached <file>
远程库信息 git remote
远程库信息(详细) git remote -v
操作记录 git reflog
分支操作
查看分支 git branch
创建分支 git branch <branch>
切换分支 git checkout <branch>
创建并切换 git checkout -b <branch>
合并至当前分支 git merge <branch>
删除分支 git branch -d <branch>
强制删除 git branch -D <branch>
删除远程仓库分支 git push origin --delete <branch>
标签操作
查看所有标签 git tag
给当前版本设置标签 git tag <tag>
给之前某版本设置标签 git tag <tag> <SHA>
查看标签信息 git show <tag>
删除标签 git tag -d <tag>
推送标签 git push origin <tag>
推送所有标签 git push origin --tags
删除远程标签 git push origin --delete tag <tag>
暂存操作
暂存当前工作目录 git stash
查看暂存工作目录 git stash list
恢复工作目录 git stash apply <stash>
删除工作目录 git stash drop <stash>
恢复并删除 git stash pop <stash>

开发流程

git checkout -b NewFeature #新建并切换至新分支
git add .                  #将修改后的文件提交至暂存区
git commit -m "message"    #提交代码
git checkout dev           #回到主分支
git pull origin dev        #拉取代码,避免已有其他提交
git merge NewFeature       #合并分支
git branch -d NewFeature   #删除新分支
git push origin dev        #推送至远程仓库

删除未跟踪文件

git clean #默认只删除工作目录下未跟踪文件

常见参数如下:

  • -d 删除未跟踪文件及目录
  • -i 进入交互模式
  • -f 强制执行,如果 clean.requireForce 设置为 true (默认情况)则需要配合此参数
  • -n 查看会被删除的文件

撤销未提交的修改

git checkout .   # 单独一个文件用git checkout filename
git reset --hard # 默认--soft 回到之前版本但不修改文件

撤销提交(回滚版本)

git reset --hard <SHA> # 将工作区还原到所指定的SHA

版本落后于远程仓库,使用 git push -f 强制推送。

修改上一次提交信息

git commit --amend # 也可以用 git commit --ament -m "message

远程库设置

git remote add <name> <url>

远程仓库名字 <name> 默认为 origin ,但也可以自行命名。远程库地址 <url> 有 SSH 和 HTTPS 两种方式,其中 SSH 可以实现免密操作但是必须先设置密钥。

可以以如下方式添加多个远程仓库实现一次向多个仓库推送。

git remote add <name> <url1>
git remote set-url --add <add> <url2>
git push <name> --all

远程库拉取

对于一个网络上的库,如果本地没有,则需要以克隆的方式拉取到本地。

git clone <url>

如果对于本地已经有的库,但是落后于远程库,需要更新,则可以用如下两个指令拉取。

git pull
git fetch
  • git pull 会自动与本地完成 merge 这一操作
  • git fetch 则需要自己手动完成。

远程库推送

git push <remote> <branch>

在第一次推送时可以加上 -u ,就可以和远程库绑定,以后只用 git push 就可以推送了。