阅读 121

git 常用命令以及其他使用笔记

本篇文章记录了 git 的使用过程中的笔记,大部分为常用命令行记录。内容倾向查阅使用,而非教程,详细教程文中有链接。博客会不定时持续更新。

推荐详细教程

名词解释与目录结构

1. .git 目录

/stage 或 /index:暂存区,具体见名称解释 /HEAD:版本指针 /config:配置文件

2. 名词解释

  1. 工作区(Working Directory):就是你在电脑里能看到的目录,不解释
  2. 版本库(Repository):就是 .git 目录
  3. 暂存区:命令 git add . 就是将修改内容放置到暂存区,而命令 git commit 则是将暂存区的内容提交到当前分支

初始配置

效果:在"~"目录下会生成隐藏文件: .gitconfig

# 配置用户
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

# 查看用户
git config --global user.name
git config --global user.email
复制代码

仓库创建

# 建立本地仓库
git init

# 建立远程仓库(服务器使用命令)
git --bare init

# 从远端克隆仓库(只会克隆默认分支,一般是 master)
git clone https://github.com/ReactiveX/RxJava.git RxJava/
复制代码

远程库与本地交互操作

关联远程库

# 本地与远程库关联
git remote add origin https://github.com/hanhailong/CustomRatingBar

# 显示出详细的 remote 信息
git remote -v

# 删除添加的远程库
git remote remove origin
复制代码

远程分支管理

# 从远程库更新到本地(不自动 merge)
git fetch

git fetch origin master

# 从远程库更新到本地(自动 merge)
git pull

git pull origin master

# 将本地分支推送到远程库(影响远程库,并自动关联本地分支与远程分支)
# git push -u 远程库名称 本地分支名称:远程库分支名称
git push -u origin master:master

# 将本地分支推送到远程库(影响远程库,不关联本地分支与远程分支)
git push origin master:master

git push origin master

# 将本地当前分支推送到远程库(影响远程库,当前分支与远程分支已关联才可使用)
git push

# 查看远程库的分支信息
git branch -r

# 拉取远程分支并创建本地分支
# git checkout -b 本地分支名称 远程库名称/远程库分支名称
git checkout -b dev origin/dev

# 删除远程分支
git push origin --delete dev

# 更新远程分支列表
git remote update origin --prune
复制代码

远程标签管理

# 拉取远程标签到本地标签(指定)
git fetch origin tag v1.1.0

# 将本地标签推送到远程库(指定)
git push origin v1.1.0

# 将本地标签推送到远程库(所有)
git push origin --tags

# 删除远程库标签(指定)
git push origin :v1.1.0

# 其实不论是推送到远程,还是从远程库删除,命令均转换成以下语句,删除是源标签为空
git push origin refs/tags/源标签:refs/tags/目的标签

git push origin refs/tags/v1.1.0:refs/tags/v1.1.0
复制代码

备注:

  1. origin:远程库名称
  2. master, deve, dev:是远程/本地分支名称,自定义
  3. 1.1.0:本地标签名称,自定义

影响远程库的操作:

  1. git push 系列命令

本地仓库操作

1. 查看帮助

# 查看帮助
git help
复制代码

2. 添加、删除、提交

# 添加(内容更新到暂存区)
git add .

git add readme.txt

# 删除(内容更新到暂存区,同时删除工作区文件)
git rm readme.txt

# 提交
git commit -m "Wrote a readme file"
复制代码

3. 对比

状态对比

# 查看状态:当前代码库与最新版本的简单对比
git status

git status readme.txt
复制代码

内容对比

# 工作区与暂存区对比
git diff -- readme.txt ## 有时可以省略 --,但不推荐,具体见下面的说明

# 工作区与版本区对比
git diff HEAD readme.txt

git diff HEAD -- readme.txt

# 暂存区与版本区对比
git diff --staged readme.txt

git diff --cached readme.txt

# 工作区与指定分支的版本区对比
git diff deve readme.txt

#
git diff 1094a readme.txt
复制代码

说明:

  1. 绿色表示文件被 git add,红色表示文件没有被 git add
  2. git diff -- readme.txt:其中 -- 作用是防止命令变成分支对比,如果不存在该分支,则可以省略 --,但不推荐
  3. deve:是分支名称,自定义
  4. 1094a:是版本号,就是 commit id

4. 日志

# 查看项目 log
git log

# 查看某文件 log
git log -- readme.txt

git log readme.txt

# 只查看 10 个 log
git log -10

# 一行显示 log,只显示哈希值和提交说明
git log --pretty=oneline

git log --oneline

# 查看图形 Log
git log --oneline --graph --abbrev-commit

git log --pretty=format:"%C(auto)%h %ad | %C(auto)%s%d  %C(bold blue)<%an>" --date=short --graph --abbrev-commit

# 查看某文件每次提交的 Diff
git log -p readme.txt

# 查看某文件指定提交的 Diff
git show 1094a readme.txt # 1094a 是版本号,就是 commit id
复制代码

说明:

  1. 日志中 "HEAD —>" 当前版本指针,指向当前版本,以下简称 HEAD 指针

5. 版本管理

版本库管理(可能会影响到工作区)

# 版本回滚(当前版本变为指定版本,同时暂存区被清空,不影响工作区)
git reset HEAD^

# 版本穿梭(当前版本变为指定版本,同时暂存区被清空,工作区的所有 modified 文件被 Revert 到指定版本)
git reset --hard HEAD^

git reset --hard 1094a # 1094a 是版本号,就是 commit id

# 查看版本管理命令历史,可用于获取所有的版本号
git reflog
复制代码

说明:

  1. HEAD: 表示当前版本,HEAD^:表示上一个版本,HEAD^^:表示上上一个版本,HEAD~100:表示上上上...(100个上)个版本
  2. 版本号写前几位即可
  3. 版本穿梭后 git log 就只显示到指定版本,即不含指定版本之后的 log 信息

版本 Revert(不影响版本库)

# Revert 到暂存区(工作区与暂存区相同)
git checkout .

git checkout -- readme.txt ## 有时可以省略 --,但不推荐,具体见下面的说明

# Revert 到指定版本库(工作区与指定版本库相同,同时暂存区被清空)
git checkout HEAD^ .

git checkout HEAD^ readme.txt

git checkout HEAD^ -- readme.txt ## 可以省略 --
复制代码

说明:

  1. git checkout -- readme.txt:其中 -- 作用是防止命令变成分支切换,如果不存在该分支,则可以省略 --,但不推荐
  2. 误删回滚:无论是 git rm,还是直接删除导致的误删,均可通过上述方式回滚

6. 分支管理

# 查看分支
git branch

# 查看当前分支
git symbolic-ref --short -q HEAD

# 创建分支(不切换分支)
git branch deve

# 切换分支
git checkout deve

# 创建 + 切换分支
git checkout -b deve

# 删除分支
git branch -d deve

# 合并指定分支到当前分支(Fast forward 模式,不保留分支信息)
git merge deve

# 合并指定分支到当前分支(推荐,禁用 Fast forward 模式,保留分支信息)
git merge --no-ff -m "add merge" deve

# 关联分支与远程分支
git branch --set-upstream-to origin/deve deve
复制代码

备注说明:

  1. deve:是分支名称,自定义
  2. git branch:当前分支前面会标一个 * 号
  3. 切换分支:如暂存区不为空(即执行过 git add),则需 git commit 或者 git reset 才能切换分支

7. stash 模式

# 当前工作现场存储起来,用于临时切换分支
git stash

# 查看已存储的所有的工作现场信息
git stash list

# 查看工作现场文件状态信息
git stash show

git stash show --index 1

# 工作现场恢复(不删除工作现场)
git stash apply # 不推荐,具体原因见下面说明

git stash apply --index 1

# 删除工作现场(不推荐,具体原因见下面说明)
git stash drop # 不推荐,具体原因见下面说明

git stash drop --index 1

# 工作现场恢复(自动删除工作现场)
git stash pop # 不推荐,具体原因见下面说明

git stash pop --index 1
复制代码

备注说明:

  1. --index 1:1 表示索引号,可通过 git stash list 查看
  2. git stash apply:不推荐,因为如果存在多个工作现场,则容易出现工作现场存在冲突的问题。推荐追加参数 --index
  3. git stash pop:不推荐,原因同上,不过一旦冲突,工作现场并不会自动删除。推荐追加参数 --index
  4. git stash drop:不推荐,容易造成误删除,因为该命令删除的是索引号为 0 的工作现场(并不管该工作现场是哪个分支的)。推荐追加参数 --index

8. Tag 管理

# 列显已有的标签(按字母顺序排列)
git tag

# 列显已有的标签(检索模式)
git tag -l 'v1.1.*'

# 新建标签(轻量级标签:指向特定提交对象的引用)
git tag v1.1.0

# 新建标签(含附注的标签:独立对象,有自身的校验和信息)
git tag -a v1.1.0 -m 'my version 1.1.0'

# 新建标签(签署标签:含附注的标签的一种)
git tag -s v1.1.0 -m 'my signed 1.1.0 tag'

# 后期向某次提交加注标签
git tag -a v1.2 9fceb02

# 删除标签
git tag -d v1.1.0

# 验证标签
git tag -v v1.1.0

# 切换标签(切换到一个名为'(HEAD detached at v1.1.0)'的空白分支上)
git checkout v1.1.0
复制代码

备注说明:

  1. v1.1.*、v1.1.0:标签名称,自定义
  2. 9fceb02:某次 commit 信息,自定义

译注:

  • -a:取 annotated 的首字母
  • -s:取 signed 的首字母
  • -v:取 verify 的首字母

git 全局配置

# 设置[pretty]
git config --global pretty.graph '%C(auto)%h %ad | %C(auto)%s%d  %C(bold blue)<%an>'

# 设置别名:[alias]
git config --global alias.logg 'log --pretty=graph --date=short --graph --abbrev-commit'
复制代码

添加 Git 忽略配置

由目录下的[.gitignore]文件确定,使用规则如下:

通配符:

  • / :表示目录
  • * :匹配多个字符
  • ? :匹配单个字符
  • ! :包含单个字符的匹配列表
  • [] :表示不忽略(跟踪)匹配到的文件或目录

详细说明:

  • 一行一个忽略项
  • 配置按从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效
  • 规则【build/*】: 等同于【build】,忽略根目录或某一目录下的[build],以及其下的全部内容
  • 规则【/.idea/*】: 等同于【/idea】,忽略根目录下的[.idea],以及其下的全部内容
  • 以下规则,表示忽略全部内容,但是不忽略[.gitignore]文件

/*

!.gitignore

文章分类
阅读
文章标签