GIT 常用指令

文章定义是基础篇,作者结合平时常用以及仅自身的理解所做的日常记录
在这里插入图片描述
上图说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库/本地仓库
  • remote repository:远程仓库

官方文档:Git-Book

配置

Git 的配置文件是 .gitconfig ,它的配置可以是 全局配置在用户主目录下),也可以是 局部配置在项目目录下)。

查看当前配置

git config --list

```bash
Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso
$ git config --list
http.sslcainfo=D:/itwork/developer/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
credential.helper=manager-core
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.name=itsdf07
user.email=923xxx742@qq.com
http.proxy=localhost:10888
credential.helper=manager-core	
```

编辑配置文件

  • git config -e [--global]
    --global 参数为编辑全局用户配置文件

工程配置-账号 git config user.name “itsdf07”

工程配置-邮箱 git config user.email “923xxx742@qq.com”

全局配置-账号 git config --global user.name “itsdf07”

全局配置-邮箱 git config --global user.email “923xxx742@qq.com”

ssh 公钥/私钥 信息

  • 本地生成公钥和私钥 ssh-keygen -t rsa -C "923xxx742@qq.com"
    上面指令之后,一路回车到最后
    rsa
  • 公钥和私钥的本地路径 C:\Users\xxx\.ssh
    在这里插入图片描述
  • 提取 SSH 公钥配置
    • 提取方案一:打开公钥文件 id_rsa.pub ,取出文件里的内容
    • 提取方案一:执行 cat ~/.ssh/id_rsa.pub
      id_rsa.pub

Terminal git log 中文乱码解决

在 Android Studio 的 Terminal 命令窗口中使用 git 指令进行输出 历史提交记录时,出现信息乱码时,如下图
不支持中文编码

  • 解决方案:文件 ...\Git\etc\bash.bashrc 添加如下内容(可在最后一行添加),之后重启 Git 命令窗口即可(另起 Terminal 窗口即可)

    export LANG="zh_CN.UTF-8"
    export LC_ALL="zh_CN.UTF-8"
    

    正常显示中文编码

操作指令

新建版本库

  • git init
    在当前目录新建一个 Git 版本库,此时当前目录下会生成一个 .git 文件夹
  • git init [project-name]
    新建一个目录,并把新建目录初始化成一个 Git 版本库,在新目录下会生成一个 .git 文件夹
  • git clone [url]
    在当前目录下下载一个远程 Git 版本库,且包含它的所有历史提交记录
    Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso
    $ git clone git@gitee.com:itsdf07/preview-only.git
    Cloning into 'preview-only'...
    warning: You appear to have cloned an empty repository.
    

文件操作

  • git add [args]
    • git add [file1] [file2] ...
      添加指定文件到 暂存区
    • git add [dir]
      添加指定目录到 暂存区包括子目录
    • git add .
      添加当前目录下的所有文件到 暂存区
    • git add -p
      添加当前目录的所有文件到 暂存区,且在添加每个变化文件前都会被要求确认(对于同一个文件的多处变化,可以实现分次提交)
  • git rm --cached [file]
    停止追踪 暂存区 的指定文件,但该文件会保留在 工作区
  • git mv [file-original] [file-renamed]
    重命名文件(该文件需可跟踪的),并且将这个改名放入 暂存区
  • git rm [file1] [file2] ...
    删除 工作区 文件(该文件需可跟踪的),并且将这次删除放入 暂存区

代码提交

  • git commit -m [message]
    提交 暂存区本地仓库

  • git commit [file1] [file2] ... -m [message]
    提交 暂存区 的指定文件到 本地仓库

  • git commit -a
    提交 工作区 自上次 commit 之后的变化,直接到 本地仓库

  • git commit -v
    提交时显示所有 diff 信息

  • git commit --amend -m [message]
    使用一次新的 commit ,替代上一次提交,如果代码没有任何新变化,则用来改写上一次 commit 的提交信息

  • git commit --amend [file1] [file2] ...
    重做上一次 commit ,并包括指定文件的新变化

  • git push <远程主机名> <本地分支名>:<远程分支名>
    把指定的 本地分支 推送到 远程主机名 上对应的 远程分支名

    • git push origin master:refs/for/master
      origin远程主机名
      第一个 master本地分支名
      第二个 master远程分支名
    • git push origin master
      如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
    • git push origin HEAD:refs/for/master
      origin远程主机名
      HEAD 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git 这样就可以知道你工作在哪个分支
      refs/for 意义在于我们提交代码到服务器之后是需要经过 code review 之后才能进行 merge
      refs/heads 不需要

查看信息

选项说明
-n(按 数量)显示前n条log
–author=[name](按 作者)显示指定作者的提交日志
–grep=[keyworkd](按 commit 描述)指定提交内容进行 模糊匹配 提交记录
-p [file]显示 指定文件 的每一次 commit 的 内容差异
–stat显示 commit 提交日志,以及每次 commit 发生变更的文件清单及其信息
–name-only显示 commit 提交日志,以及每次 commit 发生变更的文件清单
–name-status显示 commit 提交日志,并显示 新增、修改、删除 等状态的 文件清单
–abbrev-commit显示 commit 提交日志,并仅显示 SHA-1 校验和所有 40 个字符中的前几个字符
–relative-date显示 commit 提交日志,并使用较短的 相对时间 而不是完整格式显示日期(比如 2 weeks ago
–graph显示 commit 提交日志,并在日志旁以 ASCII 图形显示分支与合并历史
–pretty使用其他格式显示 commit 提交日志。可用的选项包括 onelineshortfullfullerformat(用来定义自己的格式)
–oneline以精简模式显示 commit 提交日志

筛选参数参考文章

  • git status
    可以用来查看当前 工作区暂存区 的改动文件,其中对文件的状态描述中, new file 表示该文件是新增,modified 表示改文件是修改,当然文件状态并非只有这两种
    Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
    $ git status
    On branch master
    Your branch is based on 'origin/master', but the upstream is gone.
      (use "git branch --unset-upstream" to fixup)
    
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            new file:   GIT_TEST_FILE_1.txt
            modified:   README.md
            deleted:    GIT_TEST_FILE_2.txt
    
  • git log
    用于查看当前分支的 commit 提交日志,且会按时间先后顺序列出所有的提交日志,最近的更新排在最上面
    – 如果记录过多,则可向上或者向下控制显示
    – 按 q 可退出历史记录列表查看
    Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
    $ git log
    commit aff03419bc01a86ef8a33fc9fdc6e5a2971d4260 (HEAD -> master, origin/master)
    Author: itsdf07 <923xxx742@qq.com>
    Date:   Fri Jun 24 10:32:35 2022 +0800
    
       第三次提交内容
    
    commit 61efd9000b1ebedb2366801de61f3f7bef4f8f31
    Author: itsdf07 <923xxx742@qq.com>
    Date:   Fri Jun 24 10:31:59 2022 +0800
    
       第二次提交内容
    
    commit 418576c770b8eb66f3ff513a0b93eef9aebf1812
    Author: itsdf07 <923xxx742@qq.com>
    Date:   Fri Jun 24 10:30:58 2022 +0800
    
       第一次提交内容
    
    
    针对性的过滤参数如下:
    • git log -p [file]
      显示 指定文件 的每一次 commit内容差异
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $ git log -p README.md
      commit aff03419bc01a86ef8a33fc9fdc6e5a2971d4260 (HEAD -> master, origin/master)
      Author: itsdf07 <923xxx742@qq.com>
      Date:   Fri Jun 24 10:32:35 2022 +0800
      
        第三次提交内容
      
      diff --git a/README.md b/README.md
      index ab59ce0..fe2656d 100644
      --- a/README.md
      +++ b/README.md
      @@ -1,2 +1,3 @@
      1.第一次提交内容<br>
      -2.第二次提交内容<br>
      \ No newline at end of file
      +2.第二次提交内容<br>
      +3.第三次提交内容<br>
      \ No newline at end of file
      
      commit 61efd9000b1ebedb2366801de61f3f7bef4f8f31
      Author: itsdf07 <923xxx742@qq.com>
      Date:   Fri Jun 24 10:31:59 2022 +0800
      
        第二次提交内容
      
      diff --git a/README.md b/README.md
      index 19ba7f3..ab59ce0 100644
      --- a/README.md
      +++ b/README.md
      @@ -1 +1,2 @@
      -1.第一次提交内容<br>
      \ No newline at end of file
      +1.第一次提交内容<br>
      +2.第二次提交内容<br>
      \ No newline at end of file
      
      commit 418576c770b8eb66f3ff513a0b93eef9aebf1812
      Author: itsdf07 <923xxx742@qq.com>
      Date:   Fri Jun 24 10:30:58 2022 +0800
      
        第一次提交内容
      
      diff --git a/README.md b/README.md
      new file mode 100644
      index 0000000..19ba7f3
      --- /dev/null
      +++ b/README.md
      @@ -0,0 +1 @@
      +1.第一次提交内容<br>
      \ No newline at end of file
      
      
    • git log --stat
      显示 commit 提交日志,以及每次 commit 发生变更的文件清单及其信息
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $  git log --stat
      commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master)
      Author: itsdf07 <923255742@qq.com>
      Date:   Sun Dec 4 09:28:56 2022 +0800
      
          修改 README.md,新增 GIT_TEST_FILE_1.txt
      
       GIT_TEST_FILE_1.txt | 0
       README.md           | 1 +
       2 files changed, 1 insertion(+)
      
      commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201
      Author: itsdf07 <923255742@qq.com>
      Date:   Sun Dec 4 08:26:52 2022 +0800
      
          创建空文件:README.md
      
       README.md | 0
       1 file changed, 0 insertions(+), 0 deletions(-)
      
      
    • git log --name-only
      显示 commit 提交日志,以及每次 commit 发生变更的文件清单
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $ git log --name-only
      commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master)
      Author: itsdf07 <923255742@qq.com>
      Date:   Sun Dec 4 09:28:56 2022 +0800
      
          修改 README.md,新增 GIT_TEST_FILE_1.txt
      
      GIT_TEST_FILE_1.txt
      README.md
      
      commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201
      Author: itsdf07 <923255742@qq.com>
      Date:   Sun Dec 4 08:26:52 2022 +0800
      
          创建空文件:README.md
      
      README.md
      
      
    • git log --name-status
      显示 commit 提交日志,以及每次 commit文件状态清单,如 新增修改删除
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $ git log --name-status
      commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master)
      Author: itsdf07 <923255742@qq.com>
      Date:   Sun Dec 4 09:28:56 2022 +0800
      
          修改 README.md,新增 GIT_TEST_FILE_1.txt
      
      A       GIT_TEST_FILE_1.txt
      M       README.md
      
      commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201
      Author: itsdf07 <923255742@qq.com>
      Date:   Sun Dec 4 08:26:52 2022 +0800
      
          创建空文件:README.md
      
      A       README.md
      
      
    • git log --relative-date
      显示 commit 提交日志,并使用较短的 相对时间 而不是完整格式显示日期(比如 2 weeks ago
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $ git log --relative-date
      commit 4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master)
      Author: itsdf07 <923255742@qq.com>
      Date:   6 hours ago
      
          修改 README.md,新增 GIT_TEST_FILE_1.txt
      
      commit ab0ff6da938fa1f43f0d3ba94ba7341b1d658201
      Author: itsdf07 <923255742@qq.com>
      Date:   7 hours ago
      
          创建空文件:README.md
      
      
    • git log --graph
      以图形模式显示 commit 提交日志,在日志旁以 ASCII 图形显示分支与合并历史
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $ git log --graph
      * commit aff03419bc01a86ef8a33fc9fdc6e5a2971d4260 (HEAD -> master, origin/master)
      | Author: itsdf07 <923xxx742@qq.com>
      | Date:   Fri Jun 24 10:32:35 2022 +0800
      |
      |     第三次提交内容
      |
      * commit 61efd9000b1ebedb2366801de61f3f7bef4f8f31
      | Author: itsdf07 <923xxx742@qq.com>
      | Date:   Fri Jun 24 10:31:59 2022 +0800
      |
      |     第二次提交内容
      |
      * commit 418576c770b8eb66f3ff513a0b93eef9aebf1812
        Author: itsdf07 <923xxx742@qq.com>
        Date:   Fri Jun 24 10:30:58 2022 +0800
      
            第一次提交内容
      
      
    • git log --oneline
      以精简模式显示 commit 提交日志
      Aso@LAPTOP-VEM50ICQ MINGW64 /d/itwork/Workspaces/aso/preview-only (master)
      $ git log --oneline
      4a70dbb (HEAD -> master) 修改 README.md,新增 GIT_TEST_FILE_1.txt
      ab0ff6d 创建空文件:README.md
      
    • git log --pretty=[oneline] [short] [full] [fuller]
      使用其他格式显示 commit 提交日志。可用的选项包括 onelineshortfullfullerformat(用来定义自己的格式)
      $ git log --pretty=oneline
      4a70dbb54f72a16d31ee74ab2904a133772ba9d2 (HEAD -> master) 修改 README.md,新增 GIT_TEST_FILE_1.txt
      ab0ff6da938fa1f43f0d3ba94ba7341b1d658201 创建空文件:README.md
      
    • git log --author=[name]
      (按 Author )显示指定 作者 的提交日志
      按照作者查找
    • git log --grep=[keyword]
      (按 commit 描述)显示指定 提交描述 进行模糊匹配的提交日志
      在这里插入图片描述
    • git log -n
      (按 数量)显示前 n 条提交日志
      在这里插入图片描述

分支

用于切换分支或恢复工作树文件

  • git branch
    列出所有 本地分支

    • git branch -r
      列出所有 远程分支
    • git branch -a
      列出所有 本地分支远程分支
    • git branch [local-branch]
      新建一个 本地分支,但依然停留在当前分支
    • git branch [local-branch] [commit]
      新建一个 指向指定 commit本地分支
    • git branch --track [local-branch] [remote-branch]
      新建一个 本地分支,并与指定的 远程分支 建立追踪关系
    • git branch --set-upstream [local-branch] [remote-branch]
      现有本地分支指定的远程分支 之间建立追踪关系
    • git branch -d [local-branch]
      删除 本地分支
    • git branch -dr [remote/remote-name]
      删除 远程分支git push origin --delete [remote-name]
  • git checkout local-branch
    切换到 已存在 的指定 本地分支,并 更新 工作区

  • git checkout -b local-branch
    新建一个 本地分支,并切换到该分支

  • git checkout -
    切换到上一个分支

  • git checkout -b [local-branch] origin/[remote-name]
    将远程仓库里指定的分支拉取到本地,并在本地创建一个分支与指定远程仓库分支关联起来(其中,本地分支明白不一定要与远程分支名称相同),在通过本地分支切换、检出文件进行实现远程分支的切换

  • 放弃修改

    git checkout [-q] [-f] [-m] [<branch>]
    git checkout [-q] [-f] [-m] --detach [<branch>]
    git checkout [-q] [-f] [-m] [--detach] <commit>
    git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
    git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…​
    git checkout [-p|--patch] [<tree-ish>] [--] [<paths>]
    
  • git checkout .
    放弃工作区的所有内容修改

    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git status
    On branch branch_1
    Your branch is up to date with 'origin/feat/branch_1'.
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git checkout .
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git status
    On branch branch_1
    Your branch is up to date with 'origin/feat/branch_1'.
    
    nothing to commit, working tree clean
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $
    
    
  • git checkout [file]
    放弃工作区的指定文件的内容修改

    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git status
    On branch branch_1
    Your branch is up to date with 'origin/feat/branch_1'.
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git checkout README.md
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git status
    On branch branch_1
    Your branch is up to date with 'origin/feat/branch_1'.
    
    nothing to commit, working tree clean
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $
    
    
  • git checkout -f
    放弃工作区暂存区的所有内容修改

    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git status
    On branch branch_1
    Your branch is up to date with 'origin/feat/branch_1'.
    
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
            new file:   README_2.md
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   README.md
    
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git checkout -f
    Your branch is up to date with 'origin/feat/branch_1'.
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ git status
    On branch branch_1
    Your branch is up to date with 'origin/feat/branch_1'.
    
    nothing to commit, working tree clean
    
    itsdf07@DESKTOP-8QN3MAG MINGW64 /d/Users/itsdf07/itwork/Workspace/aso/git-opt (branch_1)
    $ 
    

文件差异

  • git diff [file]
    1. 工作区 有改动,暂存区 为空,对比的是 工作区最后一次提交 到仓库的文件差异;
      工作区与最后一次提交到仓库的文件差异
    2. 工作区 有改动,暂存区 不为空,对比的是 工作区暂存区 的文件差异
      工作区与暂存区的文件差异
  • git diff --cached [file]
    对比的是 暂存区最后一次提交 到仓库的文件差异(git diff --cachedgit diff –staged 相同作用)
    暂存区与最后一次提交到仓库的文件差异
  • git diff HEAD [file]
    对比 工作区最后一次提交 到仓库的文件差异。
    工作区与最后一次提交到仓库的文件差异
  • git diff HEAD~1 [file]
    对比 工作区最后一次提交往前数 X 个版本 的文件差异,其中X为正整数
    工作区与指定过去数X版本的文件差异

git cherry-pick

  • git cherry-pick <提交的commit ID>
    把指定的提交(commit)应用于其他分支,如有 A、B 两分支,想把 A 中的指定提交同步到 B 分支,则先 checkout 到 B 分支后,执行 cherry-pick 对应的 commit 号,即把 A 的 该次提交应用到了当前分支(B分支)

    该过程中,如果出现了代码冲突,那么 cherry-pick 就会停下来,让用户决定如何继续操作

  • --continue
    用户解决代码冲突后,第一步将修改后的文件重新加入暂存区(git add .),第二步使用 continue 参数,让 cherry-pick 过程继续执行。

    $ git cherry-pick --continue
    
  • --abort
    用户选择放弃代码冲突后的合并动作,回到 cherry-pick 动作之前的状态

    $ git cherry-pick --abort
    
  • --quit
    用户选择退出 cherry-pick ,但是合并内容不会回到动作之前的状态

    $ git cherry-pick --quit
    

cherry-pick使用参考

实际场景

  • 分支间差异内容同步
    Release 分支:发布版本
    AD 分支:开发版本
    场景:Release 分支发布之后,新增了功能 ①,且新增部分并未同步至 AD 分支中;同理,AD 新增功能 ② 尚未通过测试,故暂时不能同步至 Release 分支中;
    需求:便捷的把功能 ① 同步至 AD 分支中
    瓶颈:提交内容较多,且可能存在冲突,无法简单的使用 cherry-pick 进行同步
    操作流程:
    • 仅在本地仓库中,把 AD 分支新增的 ② 功能同步至 Release 中:实现本地 Release 分支拥有全部功能
    • commit 到本地后得到 commitId
    • checkout 到 AD 分支,然后:
      git reset --hard [刚刚的commitId]:实现 AD 分支滚动至与 Release 分支的功能保持一致
      git reset --soft origin/AD:
    • git commit -m “提交记录”
      在这里插入图片描述

更新中。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值