Git学习使用
# Git是什么?
这段内容摘自廖雪峰的Git教程 (opens new window)
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
那什么是版本控制系统?
如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本 文件名 用户 说明 日期 1 service.doc 张三 删除了软件服务条款5 7/12 10:38 2 service.doc 张三 增加了License人数限制 7/12 18:09 3 service.doc 李四 财务部门调整了合同金额 7/13 9:51 4 service.doc 张三 延长了免费升级周期 7/14 15:17 
我个人想起来我之前不熟练git的时候,做的一个项目,那个项目做到了快18个版本,而且做到最后都忘记了,哪一个版本修改了哪一些内容。

大大小小快20个版本总共五六个G大小

所以熟练使用git是很有必要的
- 全球最知名的GitHub开源网站,国内网站Gitee都推荐使用Git,别再傻乎乎每次都打开某盘备份代码文件了,在Github或者Gitee上面可以管理你任意版本和分支的代码。
- 使用Git把自己的项目代码在本地存一份,再在远程仓库存一份,以后电脑出故障,完全不用担心自己写的代码会丢失,只需要将远程仓库里面的克隆一份下来就好了。
- 不会使用git的程序员是不及格的,咱们程序员要有和普通人不一样的操作手段~
# Git下载与安装
 
 下载自己系统对应的版本,安装即可,安装可以直接全部选择默认的安装方式,一路下一步即可
# Git本地使用
我觉得先看一张Git的工作的流程图比较容易理解

# 1.git init
初始化操作
这里创建了一个gittest目录来模拟我们的工作目录,这个工作目录里有一个work.txt文件,

进入工作目录,才工作目录下打开cmd,输入
git init

会生成一个.git文件
这个文件是隐藏的,可以选择显示隐藏文件
现在这个目录下是这样的

# 2.git add .
添加到暂存区
接着上面的操作
输入:
git add .

# 3.git commit
提交到本地仓库
需要加一个-m ,也就是备注,你这一次提交对代码做了哪一些改动的备注
接着上面的操作
输入:
git commit -m "第一次提交"

# 4.做出改动
经过上面的操作,就已经把work.txt,在本地备份了一次,就是我们的第一个版本了,现在我们来对work.txt做出一些改动
之前work.txt里面是空的

现在在里面写入哈哈哈哈哈 然后保存。
然后重复上面2,3的操作,千万不要再git init了,这一次提交的备注写为第二次提交

# 5.git log
查看日志,可以显示所有提交过的版本信息
输入:
git log

下面的<E7><AC>.....其实是刚刚提交的备注,因为我们输入的是中文,不兼容问题。
我们再修改一次,改为哈哈哈哈哈2,再次提交,这一次提交的备注为“mywork”
 
 我们再,log一下:
 
 # 6.历史版本切换
**git reset -- hard +版本唯一索引值(commit值)** **彻底回退到某个版本**
本地的源码也会变为上一个版本的内容,此命令是将HEAD分支回退到指定的版本,所有在这个版本之后的commit都删掉了
我们第一次提交的时候,里面什么也没有写,现在里面是哈哈哈哈哈2,我们使用这个命令切换成第一个版本

也可以写成**git reset --hard HEAD~1**
1是往前退几个版本,1就是往前退1个版本,写成多少退多少。
在Git中,用HEAD表示当前版本,也就是最新提交的版本,上一个版本就是HEAD^, 上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

使用了两次git reset --hard HEAD~1,往前退了两个版本,也可以写成``git reset --hard HEAD~2回到我们第一次提交的版本,啥内容也没有的文件,此时work.txt`里面啥也没有

# 7.git reflog
我们先使用git log

因为我们已经退到了第一个版本,第二个第三个版本的commit已经被删除了
虽然我们切换回第一个版本了,但是这样之后的版本全部被删掉了,怎么返回再返回第三个版本呢?使用reflog
git reflog

使用
git log命令只可以查看到HEAD指针及其之前的版本信息,如果版本发生过回退操作,则可能会出现,HEAD指针之后仍存在历史提交版本的情况,**而这些提交版本信息通过git log命令是看不到的。**且从第三个版本返回到第一个版本之前的commit都被删除了,log已经差不到之前版本的commit了即:
git log命令是显示当前的HEAD和它的祖先,递归是沿着当前指针的父亲,父亲的父亲,……,这样的原则。我们可以通过使用
git reflog命令,就可查看到所有历史版本信息。由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog,即:引用日志。
如果我们要回到第三个版本,就可以输入:
git reset --hard b346bd0
b346bd0就是通过reflog查看到的版本的commit

git log命令与git reflog命令作用范围示意图:

提示:reflog并不是Git仓库的一部分,它单独存储,它纯属是本地的。 (git reflog命令显示的内容,应该是存储在.git/logs/HEAD文件中,或者是.git/logs/refs目录中的文件。)
也就是说git reflog命令中保留了,用户所有在本地库中的操作。
# 8.分支管理:
分身:两条时间线,并行工作,互不打扰,多条时间线可以合并
分支:由每次提交的代码,串成的一条时间线
分支的使用场景:使用分支意味着你可以把你的工作从开发主线上分类开来,以免影响开发主线
分支的工作流程:
主分支:master指向每次提交最新的代码版本
Head(指针)指向分支,
**在想要分支的代码版本上创建新分支,然后把Head指向新分支,就可以编写新分支的代码版本(而原来的主分支没有变化),最后看是否需要这个分支,选择的把新分支合并到主分支 ,就只需把master指向到新分支的最新版本,然后再把head指向master主分支就合并完成了。(合并完成后的代码里面就同时拥有新分支和主分支的代码,如果一个文件,主分支和新分支都做了修改然后合并,**合并的时候就需要进行协商手动修改选择是主分支还是新分支那份代码还是综合合并一下同一个文件的代码)
分支管理操作:

创建和切换:
创建:
git branch xx
查看分支:
git branch
切换:
git checkout xx
合并分支:
在主分支下 git merge 要合并的分支
合并前

合并后

删除:
git branch -d 要删除的分支
一般是新分支合并到主分支
# 远程仓库
又称公网代码托管平台
流程图:

公网代码托管平台也就是开头说的github,gitee等
pull和clone区别:pull只更新,也就是远程仓库的版本必须大于本地版本才能更新,clone则是把远程仓库整个版本克隆复制全部
。。。未完待续,有空再写~


