1. GIT是什么?
GIT是一个开源的 分布式版本控制系统(Distributed Version Control System) ,由LINUX之父LINUS开发,旨在更有效地管理LINUX内核开发,现广泛应用于诸多自由软件项目,备受团队开发青睐。
可能产生的误解
误解一:不是单纯的软件,而是跨平台的一套系统,可在linux、macOS、windows下使用。
误解二:很难,并不简单、不易上手且不实用。
2. 版本控制怎么理解?
2.1 从写word的经历开始
参考上面这张图片,如果咱们自己用word写长篇大论的实验报告或者心得体会,想删除修改某段文字,又担心将来想恢复到之前的某个版本,一般做法是将当时的版本像copy一份,再命名备注一下,再有大的更改,又得再来一遍重命名另存为的繁琐操作,历经很多个版本,就成了上面这个图,那我们会崩溃掉......
2.2 要是有个工具
这个时候,要是有一个工具,可以做像下图下面这样的记录,并且还可以帮你通过指定记录回溯到某个你想要的指定版本,我们睡觉都会笑死哈哈哈哈哈哈哈!这就是理想的版本控制的大概雏形。
2.3 版本控制最主要功能
1.追踪文件的变更,忠实地记录下什么时候、什么人更改了文件的什么内容,便于版本记录和回退;
2.(远程和分支)解决多人协同开发中代码版本的同步问题,增进不同开发者间的开发通信
3. GIT安装
Windows上安装Git
在Windows上使用Git,可以直接在*Git官网*上直接下载, 然后按照默认选项安装即可。
怎么确认安装完成?
1.在开始菜单如果能找到“Git”->"Git Bash"
2.鼠标右键有"Git Bash Here"即为安装成功
安装完成后还需要在命令行里面完成自报家门的操作:
为什么要自报家门?
因为Git是分布式版本控制系统,所以每个使用机器都必须说明自己的名字和邮箱地址。1.全局配置你的名字:
`$ git config --global user.name "Your Name"`2.全局配置你的邮箱地址:
`$ git config --global user.email "email@example.com"`3.查看全局配置是否完成:
`$ git config --global -l` (如果显示刚刚配置好的名字和邮箱地址则成功)
4. Git常用命令
4.1 创建新仓库
$ mkdir star (这个操作可以不用像这样在命令行中敲,而是新建一个叫star的文件夹当作
要用的仓库即可)
$ cd star/ (切换到当前仓库的文件夹下,不在命令行中敲则用鼠标右键双击到空文件
夹star下即可)
$ git init (初始化git,你将会发现目录下多了一个.git文件夹)
$ vim readme.txt (创建并编辑一个文本readme.txt,按i键入,点击ESC再输入:wq退出且保存)
如下图:
4.2 查看整个仓库状态
$ git status
补充:Git仓库的四个区五种状态
四个区
- 工作区(Working Area)
- 暂存区(Stage)
- 本地仓库(Local Repository)
- 远程仓库(Remote Repository)
五种状态
- 未修改(Origin)
- 已修改(Modified)& 未追踪(Untracked)
- 已暂存(Staged)
- 已提交(Commited)
- 已推送(Pushed)
4.3 将文件变成已暂存状态
以下三种方法按照情况使用(第二种常用)
$ git add --all (当前项目下的所有更改)
$ git add . (当前目录下的所有更改)
$ git add xxx/xxx/xx.txt (某个文件的更改)
$ git add readme.txt
效果如下:
4.4 将文件变成已提交状态
$ git commit -m "add distributed" (" "内为提交的描述)
$ git commit -m "wrote a readme.txt"
效果如下:
(一般显示nothing to commit,working tree clean就表示上述操作已全部成功)
4.5 查看所有提交
$ git log (提交ID 提交人 提交日期 版本备注)
再做一次修改 然后使用
$ git log命令查看所有提交1.
$ vim readme.txt* (编辑readme.txt文件)*2.
$ git status(查看仓库状态)3.
$ git add readme.txt(修改后将文本文件变成已暂存状态)4.
$ git commit "add distributed"(提交修改信息并将文本文件变成已提交状态)5.
$ git status(再次查看仓库状态)6.
$ git log(查看所有提交)以上效果如下:
(其中commit后面的ac89.....那一长串就是commit-id,其次是提交人,提交日期,版本备注)
4.6 谁动了我的代码?
仅仅通过commit的提交信息来看修改不足以看到具体内容,想知道某次提交究竟更改了什么,我们可以用到
$ git show <commit-id>即可<commit-id>往往只需要输入前几位就行,只要保证指向具有唯一性 如果想看最近一次的修改,可省略<commit-id>
$ git show e00a(查看e00a的那一次修改的具体内容)效果如下:
$ git show(查看最近一次的修改内容)效果如下:
(+表示增加的内容,-表示减少的内容)
4.7 查看暂存区和工作区的差异
1.
$ vim readme.txt(修改readme.txt文件)2.
$ git add readme.txt(将文件加入暂存区)3.
$ git diff --cached(查看已缓存的改动)效果如下:
*详细关于
$ git diff的使用可以参考菜鸟教程git diff*
4.8 让时光倒流!
“我宁愿放错,也不愿什么也不做” --- 时间刺客-艾克
设想一种情景,项目经理让咱们把某个产品回退到之前的一个老版本,可能因为新版本 还不太稳定,老版本追捧的受众较多,可是我们仔细一看,新版本已经在那个老版本的 基础上修改了几十上百次,有n多个提交了......
此时可以使用
$ git reset --hard HEAD~100回退到前100个版本的样子!!!(HEAD指针~后数字代表你想要回退的版本)
再设想一种情景,过了一段时间,项目经理又安排我们修改版本,因为大BOSS可能比较 喜欢最新的那个版本,不要慌,回退100个版本都不是事儿,到最新不是so easy嘛!
此时可以使用$ git reset --hard <commit-id> 还原到指定id的版本上(但是一定记得修改后提交噢!)
1.`$ git log` (查看所有提交) 2.`$ git reset --hard ac89` (回退到ac89那个版本)效果如下:
此时readme.txt里面的内容就会神奇地回退到
add distributed的那个版本
4.9 分支(branch)
1.为什么使用分支(branch)?
当我们在对一个项目进行危险修改或者我们自己都不确定所作出的修改是否需要保存到 主要代码中时,或者是协同开发过程中,需要每一位开发者copy一份主干(master),做 出相应修改以后再更新到主干时,分支就会用上啦!2.对分支的理解:
创建某一主干节点的分支后,可以copy当前主干节点的所有内容,形成新的分支,在该 分支所作的修改不会影响到主干节点,同时主干节点的改动也不会影响到该分支,只有 当我们把该分支合并到主分支时,主分支才会全盘接收自己所没有的改动。3.关于分支的命令:
$ git branch(查看所有本地分支)
$ git branch -r(查看所有远程分支)
$ git branch <branch-name>(创建分支)
$ git checkout <branch-name>(切换到某分支下)
$ git branch -d <branch-name>(删除某分支)
$ git merge <branch-name>(合并分支)
4.10 拷贝远程仓库代码到本地
$ git clone [url] (url代表拉取的远程仓库的地址,可以是ssh链接也可以是https地址)
$ git clone [url] <anothor name> (表示你想要将克隆到本地的文件进行重命名)
$ git remote add <name> <url> (建立与名为,url为的远程仓库的连接,后续再进行push或者pull操作)
$ git remote -v (列出与远程仓库的连接,可以检查克隆的仓库是否正确)
$ git remote rm <name> (移除与名为的远程仓库的连接)
$ git remote rename <old-name> <new-name> (将远程仓库的连接名重命名)
4.11 将本地分支推送到远程仓库
$ git push <host-name> <local-branch-name>:<remote-branch-name> (将本地分支推送到远程主机并合并)
$ git push <host-name> <local-branch-name> (当本地分支名和远程分支名相同时,可以省略冒号)
上述<host-name>表示远程主机名
eg:(将本地的master分支推送到origin主机的master分支上)
`$ git push origin master`
ps:
若本地版本与远程版本有差异,但又想强制推送,可以参考以下例子:
`$ git push --force origin master`
想要删除主机下的master分支可以参考以下例子:
`$ git push origin --delete master`
4.12 从远程获取代码再合并到本地
$ git pull <host-name> <remote-branch-name>:<local-branch-name>
$ git pull其实就是$ git fetch和$ git merge FETCH_HEAD的简写来看下面几个例子: 1.`$ git pull`和`$ git pull origin`其实就相当于更新操作 2.`$ git pull origin master:<local-branch-name>` 实际上就是将origin主机的 master分支代码拉取到本地某一个分支上再合并 3.`$ git pull origin master` 如果直接与当前所处分支合并,可以省略冒号和后面 的内容,即拉取远程的master分支直接与当前所处分支合并
5. 关于GIT的参考资料
GIT简明指南
GIT完整命令手册
在此也附上一个受益匪浅的b站学习git的视频->
从零开始的浅谈git的使用方法