此篇文章是git使用学习过程中的简单整理,仅代表自己的理解,如果文中有不足或错误的地方,欢迎留言指正!
git简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Linus花了两周时间自己用C写了一个分布式版本控制系统,也就是Git的雏形。至于Linus为什么写这个Git(分布式版本控制系统),也是十分有趣的,在此就不在介绍了。
本篇文章主要整理一些git常用命令,原理先不进行详解。
Git安装
Git在Linux、Unix、Mac和Windows这几大平台都可以正常运行。
在此仅介绍Windows上安装Git
- Git官网下载地址:https://git-scm.com/downloads
- 下载安装程序之后,按默认选项安装即可。
- 安装完成之后,
右键->git bash here
,弹出类命令行窗口,即安装成功。 - 配置名字和Email地址。
git config --global user.name "your name" git config --global user,email "your-email@suffix.com"
--global
参数,全局定义,会让这台机器上所有的Git仓库都使用这个配置。
创建版本库(repository)
git init
-
新建一个文件夹 gitdir/
-
执行初始化,新建仓库
$ git init Initialized empty Git repository in D:/Git/gitrepo/.git/
-
gitdir 文件夹下多出一个
.git
的隐藏目录,用于Git进行跟踪管理版本库。 -
在gitdir下新建 readme.txt 文件,添加任意内容。
git status
git status
查看当前版本改动。$ git status On branch master No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) readme.txt nothing added to commit but untracked files present (use "git add" to track)
git diff
git diff
查看文件详细修改,默认返回所有文件的修改。git diff readme.txt
查看指定文件的修改。
-
为删除,+
为新增
git add
- 执行
git add <file>
$ git add readme.txt
git add
会将文件放在stages(暂存区),可以多次执行该命令,将多个文件放入stages中。
add 后可指定多个文件同时提交,用空格隔开。
也可以使用git add .
,提交工作区所有文件。
git commit
-
执行
git commit -m <message>
$ git commit -m "add readme" [master (root-commit) 5bf6e8b] add readme 1 file changed, 2 insertions(+) create mode 100644 readme.txt
git commit
会将stages中的文件提交到repository(仓库),-m
是本次提交的说明,即注释。
版本管理
- 对Git的版本回退、工作区和暂存区、管理修改、撤销修改、删除文件进行简单介绍。
工作区(Working Directory)和暂存区(stage)
介绍
- 工作区(Working Directory):电脑里可以看到的目录,即前文创建的gitdir文件夹。
- 版本库(Repository): 即前文的
.git
目录 - 暂存区(stage): 也叫index,如下图所示
版本回退
git log
git log
查看版本库状态$ git log commit 5bf6e8b9962e3cc7ab4a58f5621ed686bb8dbb66 (HEAD -> master) Author: zzh <810040775@qq.com> Date: Tue Nov 16 20:15:13 2021 +0800 add readme
git log 美化输出
,-2 显示两条,–oneline 一条commit简化显示为一行。$ git log -2 --oneline 32e037b (HEAD -> master) tmp 5bf6e8b add readme
git reset
git reset 分两种情况解释
- 回退指定版本commit
- 撤销add操作
回退指定版本commit
-
撤销add操作
git reset
有3种回退方式: -
git reset –mixed <commit id> : 默认方式,回退到指定的commit版本,commit中的源码恢复到工作区,全都处于未add的状态;
-
git reset –soft <commit id> : 回退到指定的commit版本,源码处于暂存区中(已add的状态),此时可以直接commit;
上面两种情况,都会保留工作区和暂存区修改未提交的代码。
-
git reset –hard <commit id> : 彻底回退到指定的commit版本,工作区和暂存区的修改会全部丢弃。慎用!
-
下面举例是工作区和暂存区都没有修改的情况,即都为空!
$ git status On branch master nothing to commit, working tree clean
-
git reset --hard <commit id>
彻底回到指定的某个版本,commit id
是使用SHA1计算出来并使用十六进制表示的数字。$ git reset --hard 5bf6e8b9 HEAD is now at 5bf6e8b add readme
-
git reset --hard HEAD^
回到上个版本,HEAD
是指当前版本,HEAD^
上个版本,HEAD^^
上上个版本,HEAD~100
往上100个版本。$ git reset --hard HEAD^ HEAD is now at 5bf6e8b add readme
-
版本回退之后,如果想恢复到新版本,可以执行
git reflog
,它将记录你的每一次命令。$ git reflog 5bf6e8b (HEAD -> master) HEAD@{0}: reset: moving to HEAD^ 8aedafd HEAD@{1}: commit: add git reset 5bf6e8b (HEAD -> master) HEAD@{2}: reset: moving to 5bf6e8b9 5bf6e8b (HEAD -> master) HEAD@{3}: commit (initial): add readme
-
HEAD
指向的版本就是当前版本。
至此,使用git reset
、git log
或git reflog
可以在任意版本之间反复穿梭。
注:
git是基于commit的!!!
git是基于commit的!!!
git是基于commit的!!!
因此commit之后的修改,是不会被保存的,当然,git也考虑到这一点,所以有git stash
,可以将changes放入缓存中,使用git stash pop/apply <stash @{n}>
进行恢复,后面会专门介绍该指令。
撤销add操作
执行git add .
后,想撤销add中的一个或多个文件,可以使用git reset HEAD <file>
git reset HEAD
默认撤销暂存区所有文件,恢复到工作区,指定文件名,则仅撤销指定文件。
支持同时撤销多个文件:
git reset HEAD <file1> <file2>...