Git-command

2020-08-29

Git

Git 常用命令以及使用情况

1. 配置 Git

  • 配置全局用户

    1
    2
    $ git config --global user.name "用户名"
    $ git config --global user.email "git账号"
  • 配置别名 (非必要)

    1
    2
    3
    4
    5
    $ git config --global co checkout
    $ git config --global ss status
    $ git config --global cm commit
    $ git config --global br branch
    $ git config --global rg reflog
  • 删除全局配置

    1
    2
    $ git config --global --unset (别名配置)
    $ git config --global --unset user.xxx

2. 查看 Git 信息

  • 查看系统配置

    1
    $ git config --list
  • 查看用户配置

    1
    $ cat ~/.gitconfig
  • 查看当前项目的 git 配置

    1
    $ cat .git/config
  • 查看暂存区文件

    1
    $ git ls-files
  • 查看本地 git 命令历史

    (显示的是一个 HEAD 指向发生改变的时间列表,
    在切换分支、git commit 提交、git reset 撤销 commit时 HEAD 指向改变,可以使用 git reset --head 02b5293 恢复
    git checkout -- <filename> 撤销、git stash 存储文件时 HEAD 不会改变,这些修改也没有被提交,不可恢复
    git reflog 会被定期清理)
    1
    $ git reflog
  • 查看所有 git 命令

    1
    $ git --help -a
  • 查看当前 HERD 指向

    1
    $ cat .git/HEAD
  • git 查看多页文件时, D 向下翻一行, F 向下翻页, B 向上翻页, Q 退出

  • git 查看提交历史

    • git 中一条分支就是一个指针,新建一条分支就是基于当前指针新建一个指针
    • 切换分支 : 将HEAD指向某条分支 (指针)
    • 切换至某个 commit : 将 HEAD 指向某个 commit
    • git log --graph 图形化符号含义
      • * : 一次 commit
      • | : 分支前进
      • / : 分叉
      • \ : 分之合入
      • |/ : 新分支
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        $ git log --online                --> 将 commit 记录 逐行显示
        --grep="关键字" --> 查找 commit 提交注释 中与关键字有关的记录
        --graph --> 记录图形化显示
        --all --> 将所有记录详细显示出来
        --author "username" --> 查找此作者的提交记录
        --reverse --> 将 commit 提交记录倒序显示
        -num --> 显示最近 num 次提交 git log -10
        -p --> 显示每次提交引入的差异 (按 补丁 的格式输出)
        --before = 1 day/1 week/1 "2020-08-29" --> 查找规定时间之前的记录 (一天, 一周)
        --after = "2020-8-23" --> 查找规定时间之后的操作
        --stat --> 显示每次更新的文件修改信息统计,会列出具体文件列表
        --abbrev-commit --> 仅显示 SHA-1 的前几个字符,而非所有 40 个字符
        --pretty=format:"xxx" --> 可以定制要显示的记录格式

3. Git 常用命令

  • 查看工作区和暂存区的状态

    1
    $ git status
  • add 将工作区的文件提交到暂存区

    • 添加指定文件到暂存区 (追踪新增的指定文件)
      1
      $ git add [file1] [file2] ...
    • 添加指定文件到暂存区,包括子目录
      1
      $ git add [dir]
    • 添加当前目录的所有文件到暂存区(追踪所有新增的文件)
      1
      2
      3
      $ git add .
      <==>
      $ git add -a
    • 删除工作区/暂存区的文件
      1
      git rm [file1] [file2] ...
    • 停止追踪指定文件,但该文件会保留在工作区
      1
      git rm --cached [file]
    • 改名工作区/暂存区的文件
      1
      git mv [old_filename] [new_filename]
  • commit 将暂存区文件提交到本地仓库

    • 将暂存区的文件提交到本地仓库并添加提交说明
      1
      $ git commit -m "本次提交说明"
    • 跳过验证继续提交
      1
      2
      $ git commit --no-verify
      $ git commit -n
    • add 和 commit 合并,便捷写法 (未追踪的文件无法提交)
      1
      $ git commit -am "本次提交说明"
    • 编辑器会弹出上一次提交的信息,可以在这里修改提交信息 (既可以修改上次提交的文件内容,也可以修改上次提交的说明)
      如果暂存区有内容,这个新的 commit 会把任何修改内容和上一个 commit 的内容结合起来。如果暂存区没有内容,那么这个操作就只会把上次的 commit 消息重写一遍。[永远不要修复一个已经推送到公共仓库中的提交,会拒绝推送到仓库]
      1
      $ git commit --amend
    • 修复提交,同时修改提交信息
      1
      $ git commit --amend -m "本次提交说明"
    • 加入 –no-edit 标记会修复提交但不修改提交信息,编辑器不会弹出上一次提交的信息
      1
      git commit --amend --no-edit
  • 将本地分支与远程分支关联

    1
    $ git push -u origin BranchName
  • 将本地仓库文件推送到远程分支,如果远程仓库没有这个分支,会新建一个同名远程分支,省略分支名代表两者同名 (分支推送顺序 [<来源地> : <目的地>])

    1
    2
    $ git push <远程主机名> <本地分支名>:<远程分支名>
    $ git push origin BranchName
    • 省略本地分支名,表示删除指定的远程分支 <==> 推送一个空的本地分支到远程分支
      1
      2
      3
      $ git push origin :master
      <==>
      $ git push origin --delete master
    • 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
      1
      $ git push --all origin
    • 建立当前分支和远程分支的追踪关系 (如果当前分支与远程分支之间存在追踪关系, 推送时则可以省略分支和 -u)
      1
      2
      3
      4
      # 不存在追踪
      $ git push -u origin master
      # 存在 追踪
      $ git push
    • 如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做 git pull 合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用 –-force 选项 (尽量避免使用)
      1
      $ git push --force origin | git push -f origin
  • 拉取远程分支的代码到本地镜像仓库

    1
    $ git pull
    • 拉取并合并项目其他人的一个分支 <==> fetch + merge
      1
      2
      3
      4
      $ git pull origin BranchName
      <==>
      $ git fetch origin BranchName
      $ git merge origin/BranchName
  • 合并分支

    1. 默认 fast-forward ,HEAD 指针直接指向被合并的分支
      在当前分支的提交历史中添加进被合并分支的提交历史
      1
      $ git merge BranchName
    2. 禁止快进式合并
      [生成一个新的提交],会让当前分支的提交历史不会那么乱
      1
      $ git merge --no-ff
    3. squash:[不会生成新的提交],会将被合并分支多次提交的内容直接存到工作区和暂存区,由开发者手动去提交,这样当前分支最终只会多出一条提交记录,不会掺杂被合并分支的提交历史
      1
      $ git merge --squash
  • 查看本地分支

    1
    2
    3
    $ git branch 
    <==>
    $ git branch -l
    • 查看本地分支对应的远程分支
      1
      $ git branch -vv
    • 查看远程分支
      1
      $ git branch -r
    • 查看所有分支 (包括本地分支与远程分支)
      1
      $ git branch -a
      • 查看所有分支包括最新的提交信息
        1
        $ git branch -av
    • 新建分支,在别的分支下新建一个分支,新分支会复制当前分支的内容,(注意:如果当前分支有修改,但是没有提交到仓库,此时修改的内容是不会被复制到新分支的)
      1
      $ git branch BranchName
    • 切换分支 (切换分支时,本地工作区,仓库都会相应切换到对应分支的内容)
      1
      $ git checkout BranchName
      • 创建并切换到新建分支
        1
        $ git checkout -b BranchName
      • 基于 master 分支新建一个分支,并切换到该分支
        1
        $ git checkout -b BranchName master
    • 删除本地分支,会阻止删除包含未合并并更改的分支
      1
      $ git branch -d BranchName
      • 强制删除一个本地分支,即使有未合并并更改的分支
        1
        $ git branch -D BranchName
    • 修改当前分支名
      1
      $ git branch -m BranchName
  • 临时将工作区文件修改保存至堆栈,用于后续恢复当前工作区内容 (以便于新建一个分支进行操作而不被当前分支影响)

    如果文件没有提交到暂存区[(使用 git add . 追踪新的文件)],使用该命令会提示 No local changes to save ,无法将修改保存到堆栈中

    1. 将所有未提交的修改(提交到暂存区)保存至堆栈中
      1
      $ git stash
    2. 给本次存储加个备注,以防时间久了忘了
      1
      $ git status save "临时存储"
    3. 查看存储记录
      1
      $ git stash list
    4. 在 Windows 上和 PowerShell 中,需要加双引号
      • 在 Windows 上和 PowerShell 中,需要加双引号
        1
        $ git stash apply "stash@{index}"
      • 恢复的同时把 stash 记录也删了
        1
        $ git stash pop "stash@{index}"
      • 删除 stash 记录
        1
        $ git stash drop "stash@{index}"
      • 删除所有存储的进度
        1
        $ git stash clear
    • 你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。
      但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash 一下,然后去修复 bug,修复后,再 git stash pop,恢复之前的工作内容。
  • diff

    • 查看工作区和暂存区单个文件的对比
      1
      $ git diff filename
    • 查看工作区和暂存区所有文件的对比
      1
      $ git diff
    • 查看工作区和暂存区所有文件的对比,并显示出所有有差异的文件列表
      1
      2
      3
      4
      $ git diff --stat
      # 1.你修改了某个文件,但是没有提交到暂存区,这时候会有对比的内容
      # 一旦提交到暂存区,就不会有对比的内容(因为暂存区已经更新)
      # 2.如果你新建了一个文件,但是没有提交到暂存区,这时候 diff 是没有结果的
    • 查看远程分支和本地分支的对比
      1
      $ git diff origin/branchname..branchname
    • 查看两个本地分支所有的对比
      1
      $ git diff branchname..branchname
  • remote

    • 查看所有远程主机

      1
      $ git remote
    • 查看关联的远程仓库的详细信息

      1
      $ git remote -v
    • 删除远程仓库的 “关联”

      1
      $ git remote rm ProjectName
    • 设置远程仓库的 “关联”

      1
      $ git remote set-url origin <newurl>