Git的使用
以前使用git总是在IDEA里使用集成的可视化面板操作,今天梳理了以下常用的命令以及基本概念
基本概念
我们先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
-
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
-
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
-
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
-
当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
-
当执行 git rm --cached
命令时,会直接从暂存区删除文件,工作区则不做出改变。 -
当执行 git checkout . 或者 git checkout --
命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。 -
当执行 git checkout HEAD . 或者 git checkout HEAD
命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。 来自: https://www.runoob.com/git/git-workspace-index-repo.html
安装
配置
-
git config
作用域# 仅对某个仓库有效 git config --local # 对当前用户的所有仓库有效 git config --global # 对所有用户的所有仓库有效 git config --system
-
git config --list --作用域
即可查看配置信息# 例如: git config --list --global
-
配置提交代码时的用户信息
git config --global user.name '用户名' git config --global user.email '邮箱'
常用命令
创建仓库
-
已有项目
# cd 进入 项目文件夹 cd /home/dev/项目 # 初始化仓库 git init
-
新项目
# 初始化仓库 git init [项目]
-
拉取远程仓库代码
git clone [url] # url : 远程仓库地址
提交与修改
-
加入git暂存区
# 加入git暂存区 git add [name|path] # name : 文件名或者文件夹 . 代表当前文件夹下所有文件
-
查看当前仓库状态 并显示变更信息
# 查看当前仓库状态 并显示变更信息 git status [-s] # -s : 输出简要信息
-
比较文件的不同
# 尚未缓存的改动 git diff # 查看已缓存的改动 git diff --cached # 查看已缓存的与未缓存的所有改动 git diff HEAD # 显示摘要而非整个 diff git diff --stat # 显示暂存区与工作区的差异 git diff [file] # 显示暂存区和上一次提交(commit)的差异 git diff --cached [file] # file : 文件 # 显示两次提交的差异 git diff [first-branch]...[second-branch] # 显示摘要 git diff --stat
-
将暂存区文件提交到本地仓库
# 从暂存区提交到本地仓库 git commit -m '提交说明' # 添加-a 命令则直接从工作区提交了变更到本地仓库 git commit -am '提交说明'
-
删除文件
# 删除工作区文件 git rm <file> # -r : 递归删除 # -f : 强制删除 工作区 暂存区 本地仓库都会删除 # --cached : 从暂存区删除 停止跟踪
-
版本回退
# 回退 git reset [--soft | --mixed | --hard] [HEAD] # --mixed : 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变 git reset HEAD^ # 回退所有内容到上一个版本 git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本 git reset 052e # 回退到指定版本 # --soft : 参数用于回退到某个版本 git reset –hard HEAD~3 # 回退上上上一个版本 git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。 git reset --hard origin/master # 将本地的状态回退到和远程的一样 # --hard : 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交 git reset –hard HEAD~3 # 回退上上上一个版本 git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。 git reset --hard origin/master # 将本地的状态回退到和远程的一样
注意:谨慎使用 –hard 参数,它会删除回退点之前的所有信息。
HEAD 说明:
- HEAD 表示当前版本
- HEAD^ 上一个版本
- HEAD^^ 上上一个版本
- HEAD^^^ 上上上一个版本
- 以此类推...
可以使用 ~数字表示
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD^2 上上一个版本
- HEAD^3 上上上一个版本
- 以此类推...
-
移动文件
git mv 命令用于移动或重命名一个文件、目录或软连接。
git mv [-f] < file > < newfile > # -f : 强制重命名、移动 如果存在则会覆盖掉原来的文件
提交历史
-
查看提交历史
详细使用 https://blog.csdn.net/runfan1014/article/details/54584448
# 查看历史提交记录 git log # 查看单个文件的提交历史 git blame <file>
远程操作
-
远程仓库操作
# 查看所有的远程仓库 git remote -v # 显示某个远程仓库的信息 git remote show [别名] # 添加远程仓库 git remote add [别名 origin] [url] # 删除远程仓库 git remote rm name # 修改仓库名 git remote rename old_name new_name
-
拉取远程仓库的代码&并对本地仓库进行合并
# 拉取远程仓库代码 git fetch [origin] [branch] # 将拉取下来的代码进行合并 git merge [origin]/[branch] # 最好在git fetch 后进行 git diff 查看区别 确认无误后再次进行合并 git diff [localBranch] [origin]/[branch] # 拉取远程代码并进行合并 git pull <origin> <branch>:<localBranch> # 如果要远程分支名和本地分支名一样则不需要添加localBranch # origin : 远程仓库别名 # branch : 远程分支名 # localBranch : 本地分支名
-
本地分支与远程分支合并
# 推送到远程 git push [--force] <远程主机名> <本地分支名>:<远程分支名> # --force : 强制推送 # 如果要推送的远程分支名与本地分支一致则不需要添加远程分支名
-
删除远程分支
git push <远程主机名> --delete <远程分支名>
分支管理
-
创建分支
# 创建分支 git branch <branch>
-
切换分支
# 切换分支 git checkout <branch> # 创建并切换分支 git checkout -b <branch>
-
删除分支
# 删除分支 git branch -d <branch>
-
合并分支
# 将指定分支合并到当前分支 git merge <branch>