Git 的使用& GitHub的初体验

一、GIT 的使用

一、What is git ?

简言之:git就是 一个 分布式 – 版本控制 – 软件

1、软件 :

安装到电脑里的工具

2、版本控制 :

版本控制的发展历程:

​ 文件版本控制、本地版本控制、集中式版本控制、分布式版本控制

文件版本控制:

起初是文件版本控制,开发者都是通过ctrl+c\ctrl+v进行文件备份,所以电脑里会保存所有历史版本的文件。

这样就造成了一个问题,占用空间。

本地版本控制:

后来出现了本地版本控制,本地只保留一个文件,然后通过软件回滚到历史版本

但这样也只能是满足一个开发者的开发需要,如果要合作开发,就无法胜任。

集中式版本控制:

于是集中式版本控制出现了,最早的集中式版本控制工具是SVN。

所有用户将历史版本存储在中心数据库,所有用户就能通过中心数据库完成历史版本的下载。

不过一但中心数据库挂掉,开发人员依然无法进行版本控制

3、分布式

分布式版本控制:

最终出现了我们现在使用的分布式版本控制工具GIT。

所有用户首先将项目提交到本地版本控制工具,然后通过本地版本控制工具提交到中心数据库,

这样每一个用户的本地仍然存储着历史版本。如果哪一天中心服务器出现故障,用户仍然可以从本地获取版本,等着中心数据库修好了,再上传过去。

注意:本地安装GIT,使用GIT只能在自己的电脑上实现本地版本控制。没有办法实现上传到中心仓库(GitHub)

二、本地版本控制工具——git 的使用

0、个人信息配置

-- 老师的名字、代号–-
在使用 git 进行本地版本是需要声明使用者的信息

$ git config --global user.email "1257144957@qq.com"
$ git config --global user.name "Acheng"

1、进入要管理的文件夹

-- 老师进教室 --
类似于老师开门进教室,只有进教室才能对教室里面的同学们进行调教

windows
	直接在要管理的项目文件夹上右键  git bash here
linux
	直接 cd files 

2、初始化

-- 老师接管全班 --
生成.git 文件夹,所有的版本信息、配置都在里面

$ git init 
// initial empty ....... 表示初始化成功

3、查看文件状态

-- 看看哪些学生没有服从管理 / 新来的学生没有进群--
检测当前文件夹的文件状态

$ git status
// 红色字代表git 没有管理的文件、绿色字表示git 已经管理起来的文件
-- 班里又来了新的同学 / 老同学有所改变 --
如果该项目文件有所改动,会在 git status 中会有所体现

$ git status
// modified : 被修改的文件
// untracked: 新增加的文件

4、将红字文件管理起来

-- 将学生纳入自己的课堂氛围--
将指定文件加入git的管理范围内

$ git add [文件名]
$ git add .
// .代表 所有文件

5、生成版本

-- 从现在开始我们就是一个班的啦 ,我们班级的名称是什么bilibili--
将当前管理起来的文件生成一个版本

$ git commit -m '版本的描述信息'
//这个项目的版本名字

【小结】 生成一个版本 & 版本更新

// 初次使用配置开发者信息
$ git config -global user.email "1257144957@qq.com"
$ git config -global user.name "Acheng"

// git 的初始化
$ git init 

// 查看当前文件夹的文件状态
$ git status

// 将该文件加入缓存区
$ git add [文件名]

// 生成版本
$ git commit -m '版本的描述信息'

// 查看当前文件夹的文件状态,于是发现文件更新,生成新的版本
$ git status
$ git add [新文件名]
$ git commit -m '新版本的描述信息'

6、无视某些文件的存在

-- 老师不想看见你,给你列入黑名单--

git 的.gitignore文件可以帮助你无视掉你不可描述的哪些秘密

6.1 使用方式

应用场景:

​ 只希望上传项目,不希望上传数据库内容,这个时候就可以将数据库的文件/文件夹的名字放入.gitignore文件中

  1. 在git 本地新增一个.gitignore文件,
  2. 编辑文件添加要忽略的文件名/文件夹。
  3. git 在 git status 和 add的时候就会自动忽略这些文件。
.gitignore文件
=======================================
*.txt		//忽略所有txt文件
!a.txt		//从*.txt中忽略 a.txt 文件

files/		//忽略files文件夹

*.py[c|a|d]	//忽略 pyc pya pyd后缀的文件

【注意】一定要将敏感文件ignore掉

在gitHub中会提供建议ignore的文件,这些文件下载后可以帮我们提前编译好哪些文件需要忽略。

7、查看历史版本 & 版本回滚

-- 看看我们班走过的里程碑 & 想在回到哪些年的日子--
7.1 回滚到当前版本之前的版本
生成了新的、旧的这么多的版本,我们当然也想查看一下历史版本

$ git log

*******************************************************
回滚到当前版本之前的版本

$ git log	//查看要回到版本的版本号
$ git reset --hard 版本号	
7.2 回滚到当前版本之后的版本
生成了新的、旧的这么多的版本,我们当然也想查看一下历史版本

$ git reflog

*******************************************************
回滚到当前版本之前的版本

$ git reflog	//查看要回到的版本号
$ git reset --hard 版本号
7.3 log日志的格式化输出

有的时候生成的版本多了,繁多的log打印消息就容易造成视觉混乱。这个时候就需要用到格式化打印

打印log 显示版本更替路径

$ git log --graph
编辑一个规则,输出时按照规则输出

$ git log --graph --pretty=format:"%h %s"

三、单人本地开发——分支结构

1、git 的逻辑是怎么实现的?

git 实际上主干保存的是 版本1 的快照,

然后 版本2 存储的是取出版本1 变更的部分生成一个快照,其余未修改的部分是从版本1 中取出来

以此类推

于是一个主干可以分出很多小主干,这也就出现了分支结构

2、分支结构可以干什么

在使用git 进行版本控制时,**【标准】**除主分支(master)之外至少使用两个分支。

  • master 分支

    所有已经完成并且正式上线的程序

  • development 分支

    专门进行程序开发的,一个功能开发过程都在dev分支里实现

  • bug 分支

    专门用来修复master上的bug 的

比如要开发一个项目的功能2,那么给功能1新建两个分支,dev和 bug 分支。dev分支上的程序测试欧耶了,这个功能没啥错误了,才会向master分支里合并生成正式版本的功能2 ,每一次开发都是遵循这种模式。这是git使用的一个规范

-- 这就类似于公测版和正式服的区别,所有的正式服都在master,所有的公测版都在相应的dev里面。--

如果按照上面所说的顺序来,我们在开发版本3的过程中,版本2的一部分功能出现问题了,怎么办,如果直接回滚修改完版本2的功能之后就会将之前的版本3覆盖掉。同时我们也能够在该bug的同时在dev分支上进行开发,而且两个工作不会发生冲突

3、分支结构的实现

Ⅰ、在master 分支上分出两个分支

​ 一个进行master 分支的 bug 修复 BUG分支

​ 一个进行新功能 开发 Dev分支

3.1 查看分支
查看当前所在的分支 & 当前项目有哪些分支。程序主干默认名为 master

$ git branch
3.2 创建新的分支
创建新分支

$ git branch 新分支名

在master 分支上分出两个分支
> $ git branch bug
> $ git branch dev
Ⅱ、进行程序开发就只在dev分支上进行,dev分支上测试直到可以正式运行
3.3 切换分支
如果要对新的分支进行开发就要切换到这个分支

$ git checkout 新分支名

在dev分支上进行
> $ git checkout dev
3.4 开发完成
> [测试代码]	//假装测试已经成功了,进行下一步
Ⅲ、将dev分支上的代码合并到master分支上。生成新的版本
3.5 切换回主分支
切换回主分支

$ git checkout master	
3.6 分支合并
完成代码合并

$ git merge 新分支名	

将dev分支的代码合并到master分支中
$ git merge dev
Ⅳ、之后就可以考虑是否删除这个dev分支
3.7 删除分支
合并完分支之后,如果这个分支就没有用了,删掉

$ git branch -d 新分支名	

删除dev分支
$ git branch -d dev

【总结】 分支结构用到的命令

$ git branch			// 查看当前所在的分支
$ git branch 新分支名	 // 创建新分支	分支名任意,主分支名默认master
$ git checkout 分支名	  // 切换到开发工作区  master 代表主分支
$ git checkout -b dev	 // 创建dev 并切换到dev
$ git merge 分支名		  // 完成代码合并,分支和并时一定要确定哪一个分支合并哪一个分支
$ git branch -d 分支名	  //删除分支	分支合并完成可以选择删除分支

【注意】:

每次使用development分支进行开发的时候,延申出他的主分支一定要是最新版本的,否则开发时会缺少功能

先将让development 合并 master(合并不是吞并,dev分支事后仍然存在)

$ git merge master
这样 dev 现在的代码就时最新的master了,然后再开发就跟在master分支的基础上开发了

4、合并时的冲突解决

在分支合并时,有可能会出现冲突。这是由于两个分支共同修改了一个文件的某一行,导致git不确定按照哪一个标准进行合并,这时git会把两个结果放到同一个文件,并标记出来,让开发之自己手动进行取舍

===============
+    待开发    +
================

二、GitHub的初体验

一、什么是GitHub?

也不用把GitHub想成一个多么神奇的东西,很简单,GitHub是一个代码仓库。现在的代码仓库有很多啊,码云、GitHub、gitlib的都是代码仓库。那么话说回来了,git 和 GitHub 是怎样的关系呢?他们之间的关系就是松花江和松花蛋的关系。git 是版本控制工具,GitHub是代码仓库。我们只是为了将代码存储到云端代码仓库,所以任何代码仓库都可以和git对接。但是GitHub现在最厉害。

github & gitlib 的区别

	github 是一个代码仓库的开源网站
		里面的代码都是开源的
		如果要存放私有代码,就需要¥¥¥
		
	gitlib 是一个工具,能都允许用户自己搭建代码仓库。
		可以用来专门存放私有文件。
		但是成本比较高,需要自己买一台服务器,专门人维护

二、上传到代码仓库的流程

1、在代码仓库注册账号

2、在我的代码仓库中创建一个专门放置一个项目的小箱子

3、将本地代码上传到代码仓库中的项目小箱子中

三、使用git将项目上传到github

1、将本地git 控制起来的项目上传到github

声明远程仓库,给远程仓库起个别名 origin。这个别名会给记录在本地上,以后再上传这个项目时就不需要重新声明别名。直接上传分支就行
$ git remote add origin https://github.com/auditoryHallucination/sprider_English.git	//origin 后面网址的别名

重命名分支(不是必须的)
$ git branch -M master

上传指定分支
$ git push -u origin master // master是分支名称,如果要把其他分支上传上去就可以改成其他分支的名子

2、将项目从github下载到本地

将github 上的项目下载到本地
$ git clone 远程仓库的地址

下载完成后可能git branch 之后只有一个master分支,实际上它已经把所有分支下载下来了。但是仍然是可以完成其他分支切换的

3、本地存在项目,从GitHub上下拉项目

如果本地存在这个代码,就不需要clone了

$ git pull -u origin development(要拉下来的分支名)

4、为发布的版本打上版本号

为项目添加版本号
$ git tag -a project_V1 -m "第一版本"

上传项目,提交版本号
$ git push origin --tags

四、模拟实战

背景故事:

​ 今天第一天上班写了一个项目,虽然到了下班时间但是那股继续开发的热血还在,怎么办,回家继续。

1、在公司开发项目之后上传到github仓库

初次使用配置开发者信息
$ git config -global user.email "1257144957@qq.com"
$ git config -global user.name "Acheng"

git 的初始化
$ git init 


在master 分支上分出两个分支
$ git branch bug
$ git branch dev


切换到dev分支
$ git checkout dev


开发中。。。。。。开发了好多
$ [开发了很多代码]


下班了,怎么办上传到github吧,回家续上
$ [下班前几分钟,依然要保持队形]


查看当前文件夹的文件状态
$ git status


将该文件加入缓存区
$ git add [文件名]

生成版本
$ git commit -m '版本1.0'


声明远程仓库,给远程仓库起个别名 origin
$ git remote add origin https://github.com/auditoryHallucination/sprider_English.git

上传指定分支
$ git push -u origin master 

2、回到家里变继续开发(这个时候家里的电脑还没有来)

将github 上的项目克隆到本地
$ git clone 远程仓库的地址

切换到dev 分支进行开发
$ git checkout dev

把master 分支合并到dev(仅一次)
$ git merge master

修改代码

提交代码
$ git add . 
$ git commit -m "xxx"
$ git push -u origin dev 

3、回到公司

切换到dev分支
$ git checkout dev

拉代码
$ git pull -u origin dev

继续开发

提交代码
$ git add . 
$ git commit -m "xxx"
$ git push -u origin dev 

4、回到家里

切换到dev分支进行开发
$ git checkout dev

拉代码
$ git pull -u origin dev

继续开发

提交代码
$ git add . 
$ git commit -m "xxx"
$ git push -u origin dev 

5、在公司

终于有一天master 线上代码跑着呢,dev开发完成了,要合并到master 分支

切换到master 分支
$ git checkout master 

将dev分支合并到master 分支
$ git merge dev

将完整版 master 上传到仓库
$ git push -u origin master 
	
dev也是最新的了,将dev也上传到仓库

切换到dev 分支
$ git checkout dev 

将 master 分支合并到 dev 分支  时刻保持同步
$ git merge master

将完整版 dev 上传到仓库
$ git push -u origin dev 

6、回到家中

将最新代码拉下来
$ git pull -u origin dev
$ git pull -u origin master

继续开发新功能
。。。。。

三、补充知识点

配置文件

本地项目配置文件项目:/.git/config

[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[remote "origin"]
	url = https://github.com/auditoryHallucination/sprider_English.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master

既然是文件,那么有些配置就也可手动添加了,但是这个文件毕竟是在当前项目里存在的,所以向这个文件添加配置,只在当前的项目配置生效,在其他项目下不生效

例如命令:

git config --local user.name "acheng"
git config --local user.email "123@qq.com"

全局项目配置文件目录:当前用户目录/.gitconfig

例如命令:

git config --global user.name "acheng"
git config --global user.email "123@qq.com"

免密码登录

当将本地项目上传到文件仓库时一次一次的输入密码就比较麻烦,怎么办。咱有免密登录的方法。

URL 中体现

原来的地址:https://github.com/auditoryHallucination/sprider_English.git
修改的地址:https://用户名:密码@github.com/auditoryHallucination/sprider_English.git

$ git remote add origin https://用户名:密码@github.com/auditoryHallucination/sprider_English.git
$ git push origin master

地址可以通过/.git/config文件进行修改

SSH实现

1、生成公钥和私钥
	$ ssh-keygen
	公钥默认放在 ~/.ssh/id_rsa.pub目录下,然后拷贝公钥的内容
	私钥默认放在 ~/.ssh/id_rsa目录下
2、将公钥设置到github中
	https://github.com
		设置到github 中的settings设置SSH中
3、在本地git项目中添加ssh地址
	$ git remote -u origin ssh地址
4、以后使用就不需要密码了直接↓↓↓
$ git push origin master 
	

任务管理相关

1、issues

​ 在公司里面有些内部问题不能再QQ 微信上面询问,公司会专门在github中设置一个issues 算是问题解决专区。

​ 方便公司的问题总结

​ 提出bug

2、Wiki

​ 项目Wiki 【项目所需的知识点、项目介绍、文档说明】,方便和别人交流

变基(rabase)

===============
+    待开发    +
================
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值