版本控制工具git的基本使用
什么是版本控制工具?
git 是一个分布式版本控制工具,顾名思义,是一个控制项目版本管理的工具,记录和备份版本以及回撤到不同版本等操作
git本地仓库的工作流和工作区域
git 的工作区域分为三种,如下表所示:
| 工作区域 | 说明 |
|---|---|
| 工作区 | 本地的项目目录,也就是实际的工作目录 |
| 暂存区(索引区) | 一个缓存区域,临时保存的改动 |
| git 仓库 | 最终暂存区的文件都会被提交到本地git仓库 |
git 操作文件时候,工作流顺序下表所示:
| 状态 | 说明 |
|---|---|
| modified(已修改) | 本地文件已修改了,还未被保存到暂存区 |
| staged(已暂存) | 本地文件被保存在了暂存区 |
| committed(已提交) | 本地文件被提交到本地git仓库了 |
注意,这里的修改是比较广义的。删除、编辑、增加都是属于修改
git 本地操作的常用命令
配置提交时所使用的个人信息
git config --global user.name "raoyingjun" // 用户名 git config --global user.email "raoyingjun@foxmail.com" // 邮箱如果
--global参数不存在,配置的用户信息仅在该仓库有效初始化本地 git 仓库
git init该命令在指定目录下初始化本地 git 仓库。该目录下将会生成一个
.git隐藏文件夹。就可以开始进行git的使用了查看文件的状态
git status结果包含
Untracked files或者说明文件已修改但未被提交到暂存区添加文件到暂存区
git add <file>file为要被添加到暂存区的文件名。返回的结果包含Changes to be committed说明文件被添加到了暂存区,等待被提交到本地git仓库提交更改到本地git仓库
git commit该命令将会拉起安装 git 时所选择的默认编辑器,在编辑器内写入本次提交的说明。结果显示
working tree clean说明工作区和暂存区是干净的,没有待暂存或待提交的文件。文件已经提交到了git本地仓库指定
-m参数可以直接写入提交说明,不会拉起编辑器,比较方便快捷,命令如下git commit -m <description>description为提交时的说明指定
-a参数设置修改文件后无需执行 git add 命令,直接提交。将会拉取编辑器,在编辑器写入提交说明,命令如下git commit -a可以同时指定
-am将add添加到暂存区操作和commit提交操作合并到一起。或者使用git commit * -m也可以达到同样的效果git commit -am <description> // 或者 git commit * -m <description>description为提交时的说明查看提交日志记录信息
使用
git log查看提交的日志记录信息,该命令只能查看到当前版本为止的记录HASEE@Royin MINGW64 ~/Desktop/GitProject (master) $ git log commit 73ad93b19df64c9b79b3ae886ddf63ab1daa8b0d (HEAD -> master) Author: raoyingjun <raoyingjun@foxmail.com> Date: Wed Mar 31 17:10:31 2021 +0800 本次提交的说明使用
git log --pretty=oneline查看提交的日志记录信息HASEE@Royin MINGW64 ~/Desktop/GitProject (master) $ git log --pretty=oneline 73ad93b19df64c9b79b3ae886ddf63ab1daa8b0d (HEAD -> master) 本次提交的说明使用
git log --oneline查看提交的日志记录信息HASEE@Royin MINGW64 ~/Desktop/GitProject (master) $ git log --oneline 73ad93b (HEAD -> master) 本次提交的说明使用
git log --graph查看提交的日志记录信息。方便直观的查看分支合并的情况$ git log --graph * commit 2819958ace45d4ba7377e81d539ce80ff78a16c8 (HEAD -> main) |\ Merge: 8467fbd 8d2e09d | | Author: raoyingjun <raoyingjun@foxmail.com> | | Date: Thu Apr 1 18:15:52 2021 +0800 | | | | 本次提交的说明 | | | * commit 8d2e09d39e66fd3a29eb892d0346b7de4aa11adb (hotfix) | | Author: raoyingjun <raoyingjun@foxmail.com> | | Date: Thu Apr 1 17:36:31 2021 +0800 | | | | 本次提交的说明 | | * | commit 8467fbddcffb1300f98396480290a07025def49f |/ Author: raoyingjun <raoyingjun@foxmail.com> | Date: Thu Apr 1 17:37:26 2021 +0800 | | 本次提交的说明 | * commit b4a6f5abf45d65e80b67d53da714cbccc9edb3f2 (origin/main, origin/hotfix) | Author: raoyingjun <raoyingjun@foxmail.com> | Date: Thu Apr 1 09:39:57 2021 +0800 | | 本次提交的说明 | * commit ddf4e6131e6cb13ae67b99456ebe38fa96a3f7bc Author: raoyingjun <raoyingjun@foxmail.com> Date: Wed Mar 31 23:53:54 2021 +0800 本次提交的说明
使用 git reflog 查看提交的日志信息,该命令可以查看所有版本的提交记录
HASEE@Royin MINGW64 ~/Desktop/GitProject (master)
$ git reflog
73ad93b (HEAD -> master) HEAD@{0}: commit: 本次提交的说明
从暂存区移除文件
git restore --staged <file>file为从暂存区移除的文件名丢弃修改
当文件被添加到暂存区,如果对文件进行了修改,使用以下命令来丢弃修改,回撤到文件被暂存时的状态
git restore <file>file为要恢复的文件名。比较不同工作区域的文件
使用
git diff命令来比较不同区的文件的差异无参数传入,比较工作区和暂存区的差异
git diff比较暂存区和
HEAD的差异git diff --cached // 或者 git diff --staged比较工作区和HEAD的差异
git diff HEAD比较工作区和HEAD同名文件的差异
git diff HEAD -- <file>file为要比较的文件指定版本之间的比较
比较最新的HEAD和前3次的HEAD的差异
git diff HEAD^ HEADHEAD^表示前1个版本,HEAD^^则表示前2个版本,以此类推比较最新的HEAD和前3个版本的比较
git diff HEAD~3 HEADHEAD~1表示前1个版本,HEAD~4就是前4个版本,数字为几就是前几个版本比较两个历史版本的差异
git diff hash1 hash2
命令返回的结果示例如下:
HASEE@Royin MINGW64 ~/Desktop/GitProject (master) $ git diff diff --git a/text.txt b/text.txt index 0b4bf3f..f034430 100644 --- a/text.txt +++ b/text.txt @@ -1,4 +1,5 @@ 第一行 -第二行 +我是第一个插入的行^M 第三行 +我是最后插入的行^M以下是对
git diff命令返回的结果的释义:diff --git a/text.txt b/text.txt的a/text.txt表示变动前的版本,b/text.txt表示变动后的版本index 0b4bf3f..f034430表示两个版本(a版本和b版本)的git哈希值100644表示文件的属性和权限(100表示是普通文件,644同linux权限)--- a/text.txt表示变动前的版本+++ b/text.txt表示变动后的版本@@ -1,4 +1,5 @@表示源代码的14行和目标文件的15行有差异-表示减少的部分+表示增加的部分
版本的切换
切换到指定的版本
git reset --hard <hash>hash为要切换的版本的哈希值切换到前1个版本
git reset --hard HEAD^HEAD^表示前1个版本,HEAD^^则表示前2个版本,以此类推切换到前两个版本
git reset --hard HEAD~1HEAD~1表示前1个版本,HEAD~4就是前4个版本,数字为几就是前几个版本
删除文件
在暂存区和工作区删除该文件
git rm <file>file为要删除的文件。该命令执行后无需再使用git add命令将删除操作添加到暂存区了,只用将本次删除提交到本地 git 仓库即可仅暂存区删除该文件
git rm --cached <file>file为要删除的文件。在工作区的该文件仍然保留
工作区文件误删的补救
从本地git仓库拉取一份回工作区
git checkout <file>file为要拉回的文件恢复工作区被删除的文件
git restore <file>file为要恢复的文件
分支介绍
git提供了分支相关的操作,用来切换到不同的分支。master 一般是主干分支,一般功能增加、BUG 修复、多人协同开发等不会直接在 master 上进行,需要另辟分支进行处理,最后处理完后合并到master
创建分支
git checkout -b <newbranch> // or git branch <newbranch>newbranch为要创建的分支名称。使用第一种方式创建分支时同时会切换到该分支切换分支
git checkout <branchname>branchname为要切换到的分支名称删除分支
git branch -d <branchname>branchname为要删除的分支名称。不能删除当前所在分支。如需删除,得先切换到其他分支,再执行删除查看分支
git branch带
*的表示当前所在的分支指定
-v参数可以查看各个分支最后一次提交的信息,命令如下git branch -v合并分支
git merge <branchname>branchname为要被合并的分支名称,合并到当前所在的分支重命名分支
git branch -m <oldbranchname> <newbranchname>oldbranchname和newbranchname分别为原分支名称和新分支名称。如果newbranchname分支已存在,指定-M代替-m可以强制重命名为已存在的分支添加远程仓库
git remote add <remotename> <url>remotename为远程仓库的别名,url为远程仓库的地址查看所有的远程仓库别名
git remote指定
-v参数同时显示其远程仓库所对应的地址urlgit remote -v删除远程仓库
git remote rm <remotename>remotename为要删除的远程仓库的名称修改远程仓库名称
git remote rename <oldremotename> <newremotename>oldremotename和newremotename分别表示旧名称和新名称
git 远程仓库的常用命令
从远程仓库克隆项目到本地
git clone <url>`url`为远程仓库的地址取回远程仓库最新内容
git fetch <remotehost> <remotebranch>使用
git fetch <remotehost> <remotebranch>将远程仓库的的最新内容全部取回本地。remotehost为远程仓库的地址或远程仓库的别名,remotebranch为远程分支名如果仅指定了
remotehost,则将remotehost所对应的远程仓库与本地当前同名分支的最新内容取回到本地当前分支,命令如下git fetch <remotehost>fetch操作不会对本地仓库做任何修改,仅仅是下载到本地将使用
fetch命令下载到本地的内容合并到本地仓库git merge <remotehost>/<remotebranch>remotehost为远程仓库的地址或远程仓库的别名,remotebranch为远程分支名。合并到当前所在分支查看远程分支
git branch -a同时也会显示本地的分支。在查看远程分支时,查看的是数据的快照,也就是上一次调用
git fetch的结果。并没有与远程仓库实时的连接,也就是查看到的远程分支不一定是最新的,请先使用git fetch
以确保获取到的是最新内容推送本地分支到远程仓库
git push <remotehost> <localbranch>:<remotebranch>remotehost为远程仓库的地址或远程仓库的别名,localbranch和remotebranch分别对应本地分支名和远程分支名。如果本地分支名和远程分支名相同,则可以略写为:git push <remotehost> <localbranch>指定
-u参数同时指定默认远程仓库和分支,直接使用git push即可,命令如下:git push -u <remotehost> <localbranch>则后面无参数的推送,拉取等命令可以无需加任何参数,默认使用在这时使用
-u所指定的远程仓库和分支 。对于没有携带任何参数的推送,默认推送到当前分支。如果需要推送到其他主机或分支,请使用完整的push命令如果要推送当前所在的本地分支到远程仓库同名分支,则可以直接使用以下命令:
git push <remotehost>remotehost为远程仓库的地址或远程仓库的别名删除远程分支
git push <remotehost> :<remotebranchname> // 或者 git push <remotehost> --delete <remotebranchname>remtoehost为远程仓库的地址或远程仓库的别名,remotebranchname为要删除的远程分支的名称拉取远程分支到本地
git checkout -b <localbranch> <remotehost>/<branchname>localbranch为远程分支拉取到本地后的分支名,remotehost为远程仓库的地址或远程仓库的别名,branchname
为要被拉取到本地的远程仓库的分支名。该命令只适用于当在远程仓库存在该分支,并且通过git fetch操作下载到了本地,且本地并没有该分支时拉取远程仓库内容到本地
pull操作是将fetch和merge操作合并在一起,关系约等于pull = fetch + merge,具体的命令如下:git pull <remotehost> <remotebranch>:<localbranch>remotehost为远程仓库的地址或远程仓库的别名,remotebranch为要拉取的远程仓库的分支名称,localbranch为要被合并的分支名称。如果本地分支名和远程分支名相同,则可以略写为:git pull <remotehost> <localbranch>如果要从远程仓库拉取的分支名和本地仓库当前所在分支名同名,则可以直接使用以下命令
git pull <remotehost>remtoehost为远程仓库的地址或远程仓库的别名
该博客版权归饶英俊(Royin)所有,严禁抄袭,欢迎转载。如有反馈或建议等可通过邮箱联系我
本文链接:https://raoyingjun.github.io/2021/10/26/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6%E5%B7%A5%E5%85%B7git%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/