为什么要学 Git?
- 完整的版本控制功能,解决多人协助问题。
- 提高开发效率
- 牛逼人都在用
- 要习惯把自己的代码同步到 github 上。不管多烂的代码。
Git 是什么?
Git 是目前世界上最先进的分布式版本控制系统。

- Workspace: 工作区
- Index/Stage: 暂存区
- Repository: 仓库区(本地仓库)
- Remote: 远程仓库
SVN 与 Git 的最主要区别?
SVN 是集中式版本控制系统,版本库是集中放在中央服务器的,工作的时候,用的都是自己的电脑,所以首先要从中央服务器那里下载最新的版本,工作之后,需要把自己修改的地方或是工作的内容推送到中央服务器。集中式版本控制系统必须联网才能工作。如果在局域网还可以,带宽够大,下载速度够快。如果在互联网速度慢的情况下就悲催了。
Git 是分布式版本控制系统,它就没有中央服务器,每一个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网。因为版本就在自己的电脑上,那怎么协作工作呢?比如说我在我的电脑上改了文件 A ,其他人在他们的电脑上更改了文件 B ,这时,只需要把各自修改的地方推送给对方,就可以看见对方的修改了。
在 Windows 上安装 Git
直接在官网上安装就好,传送门
安装之后在桌面右键就会出现:

看着这个还要配置一下:
鼠标右击打开 Git Bash 或者在菜单里搜索 Git Bash,设置 user.name 和 user.email 配置信息:
git config --global user.name "用户名"
git config --global user.email "你的邮箱"
因为 Git 是分布式版本控制系统,所以要填写用户名和密码作为唯一的标识。
注意:git config --global 参数,有了这个参数,表示这台机器上所有的 Git 仓库都会使用这个配置,当然你也可以对某个仓库指定不同的用户名和邮箱
如何操作
创建版本库
什么是版本库?
版本库又名仓库,英文名是 repository ,可以简单的理解为目录,这个目录里的所有文件都可以被 Git 管理起来,每个文件的修改、删除。Git 都可以追踪,以便任何时刻都可以追踪历史,或者还可以在将来某个时刻将文件还原。
所以创建一个版本也很简单。
我在 E 盘文件夹 git 下点击右键选中 Git Bash 。
输入命令 git init
通过命令 git init
把当前文件夹 git 变成了可以管理的仓库。

这时候 git 文件夹下会多了一个 .git 的文件夹。这个文件是 Git 来跟踪管理版本的,没事别动这里面的东西,谨记谨记!!!
把文件添加到版本库里
首先明确一点,所有的版本控制系统,只能跟踪文本文件的改动,比如 TXT 文件、代码、网页等这些。版本控制系统可以告诉你每次改动的情况。但是图片,视频这些二进制文件虽然也能用版本控制系统控制,但是没有办法跟踪文件的变化。图片用 PS 弄过是没有办法返回以前的版本的。
一个例子:
我在版本库 git 文件下新建一个文本文件 readme.txt 。
写入内容:「第一次使用分布式版本控制系统」
第一步:使用 git add readme.txt
命令,将文件添加到暂存区。

如果和上面一样,没有任何提示,说明已经添加成功了。
第二步:用命令 git commit
告诉 Git ,把文件提交到仓库里。

现在我们已经提交了一个文件 readme.txt 到仓库里了。可以使用命令 git status 来查看状态,比如说是否还有文件没有提交等。

文件的修改
接下来修改一下 readme.txt 里面的内容,添加这么一行「我学会了git的修改啦」
然后用命令 git status
来查看一下会发生什么。

他说文件改变了,但是没有提交到仓库中去。
接下来我想看看 readme.txt 文件修改了那些内容,可以使用命令 git diff readme.txt
查看。

上边可以看到,文件readme.txt 的内容由一行变成了两行,虽然编码不正确,凑合这还能看。
在生产中应该都是代码的,这种中文很少出现。所以也不用太担心。
知道了对 readme.txt 的更改之后,就可以放心的提交到仓库了。
提交修改跟之前的提交文件是一样的「第一步是 git add ,第二步是 git commit 。」

事实上,可以在任何一步结束后用命令
git status
来查看当前状态。
总结一下:把文件放到 git 的仓库。
- 第一步: git init 初始化仓库。
- 第二步:git add 添加文件到暂存区。
-
第三步 git commit 提交文件到仓库。
git.png
工作场景
产品经理说我们来搞开发吧,底下一群嗷嗷待哺的小鲜肉:好啊好啊。布置了第一天的需求。
第一天的需求是什么呢。我们来模拟一下:
新建一个文件 demo.txt 写入「第一天产品经理的需求」

开发好了需求之后,我们提交到仓库中去。
记得怎么做吗?

好了,任务完成,忙里偷闲耍会手机(偷乐)。快到下班的时候。产品经理来说要加一个需求。好吧,马不停蹄赶在下班前完成,但是还没有自测,不能提交到仓库中去,好吧,暂且提交到暂存区。
在 demo.txt 中写入「添加一个需求」

好了,提交到暂存区去:

可以看到是从第二个 git status 开始下班前的修改操作的。可以看到我输入了一个
git add
后面没有加文件名,它提示我可以使用 git add .
。
好了到这里第一天的开发已经完成了。高高兴兴回家了。
第二天,产品经理跑来说昨天下班前的修改是不需要的。我们要回滚到上次的文件。... 好吧,可以。
从暂存区回滚到工作区:
命令:`git reset HEAD demo.txt

好了,暂存区没有了,但是工作区还有。可以使用命令 git checkout demo.txt
来处理工作区的修改。

再打开看一下文件:

好了,开始第二天的开发。
在文件 demo.txt 中开发第二天的需求:写入「第二天产品经理的需求」

完成之后,提交到版本库去。

完成之后正想休息一下呢,产品经理来说其实今天的开发需求不用做。可是我们已经提交到版本库中去了。那怎么做才能回滚到第一次里面呢?
可以通过之前说的命令
git log
查看我们两次提交的版本号。通过命令 git reset --hard
加版本号。这个命令是仓库、暂存区和工作区都回滚到第一次的提交。
好了,看一下工作区的内容:

好了,第二天的开发已经去掉了。
接着等产品经理的命令。
恩?产品经理说开发商把钱拿跑了,把仓库清空吧。心理 MMP 。
清空本地工作区的开发命令 git rm demo.txt

本地清空,但是暂存区和仓库还没有清空。

好了,一整套流程完成了。
总结一下工作流:

远程仓库
目前我们使用的 Git 都是在本地操作,如果想分享代码,或者跟其他人合作来完成项目。我们就需要把数据放到一个公共的地方。就用全球最大的同性交友网站吧。
创建 SSH Key
为啥要创建这个东西呢?因为本地跟 github 连接是通过 ssh 来加密传输的。可以使用命令 ssh-keygen -t rsa -C "youremail@example.com"
来创建。这里的邮箱是你注册 github 时的邮箱。
这里找到你的 github 的 ssh 设置的地方去,新建一个 SSH key 。不知道怎么找。好吧。传送门

点击 new ssh key

这里的 key 要在用户目录的「.ssh」下打开 git bash 命令行输入 :
ssh-keygen -t rsa -C "youremail@example.com
。接下来的操作有点复杂。我是看了教程,但是出现了教程里没有的东西。再次记录一下。
输入命令之后,会让你输入个文件名。这里这个文件名最好输入 id_rsa 。
然后会让你输入密码、确认密码。这才行。

根据提示,它说公钥是存放在目录 「id_rsa.pub」秘钥是存放在目录「id_rsa」。这里公钥可以随便看。秘钥要保存好。
好了,我们把公钥展示出来,复制到 github 上去。

添加 ssh key 之后,我们看一下是否成功连接 github 。可以使用命令
ssh -T git@github.com
查看。
这里也有坑,如果你不继续尝试下去完了。输入 yes 。之后又让输入密码。就是刚才我们设置的密码。这里同样没有显示。输入之后看到成功了。开心。
这里可以再次查看一下连接:

这一次知道了,这里的密码还是要输入一次的。我的密码「1326628437」 怕忘记,在此记录一下,反正也没人能看到这里。
添加远程仓库
在 github 中新建一个仓库。

github 说可以有两种方式来创建仓库。一种是新建一个仓库。按照提示的那样来提交到远程仓库。一种是直接把已有的仓库提交的远程仓库中去。相信英语好的你肯定能看懂。
这里就以第一种方式演示一下。

这里在一个空的文件夹里使用命令
echo "# Learn_git" >> README.md
创建了一个名为 README.md 的文件,写入 「# Learn_git」。echo 的意思就是输入,然后 「>>」的意思就是追加。

提交到本地仓库去。
接下来就是提交到远程仓库。

其实按照提示操作就可以啦。刷新 github 上刚才创建的仓库就可以看到啦。

接着想增加一些内容,然后在推到远程仓库。
打开文件 README.md 输入「second commit 」。
这次就只要执行命令
git add README.md
git commit
-
git push
就可以啦,因为之前我们已经把本地的仓库和远程仓库关联起来啦。
看一下远程的仓库:
远程仓库
这样就可以了。以后你可以写自己的代码把代码放到 github 上面的仓库里。
克隆仓库
克隆仓库的意思是把远程仓库里的文件克隆到本地,在本地开发之后提交到远程仓库,以此来达到多人协助的目的。
其实就一个命令就可以了 git clone
后面加 github 上仓库的链接就好了。
在本地开发完成之后
- git add
- git commit
- git push
这里因为本地仓库是从远程仓库克隆下来的,不用再连接了,直接 git push
就可以。
总结
Git 是很有用的,建议大家学习。花不了太多时间就可以掌握这项技能,何乐而不为呢。
最后欢迎大家 star 我的 github 呀。传送门
网友评论