Git
一、概述
1、Git与版本控制
问:Git是什么?
答:Git是一个免费、开源的分布式版本控制
系统。
- 版本控制:指的是在多人协作软件开 发过程中,对各种程序代码、配置文件及说明文档等文件迭代变更的一种管理方式。
情况1:不使用版本控制
情况2:使用版本控制(主流)
常见的版本控制系统:
- Git:原始支持命令行的,后续也出现了GUI界面工具。
- Svn:GUI界面支持。
2、Git与Github的关系
注意:git与github半毛钱关系没有。
- Github:它是全球最大的同性交友网站。(本质:网站)
- Gitee:也是一个远程git托管平台,在国内使用较多 (本质:网站)
简介:全球最大的社交编程及代码托管网站(基友网站)
网址:https://github.com/
类似网站:
码云gitosc/gitee
gitlab
- Git是一个免费、开源的版本控制软件。(本质:CS(client/server)模式软件)
二、网站的使用
学习版本控制系统为什么要使用网站?
在版本控制系统中,有“仓库”的概念,而仓库有本地仓库和远程仓库之分。远程仓库的目的是在于便于将“仓库”中的东西共享给其它人。例如:某北京分公司需要将代码分享给某上海分公司。而远程仓库的使用就是对网站(例如github、gitee等)的使用。
考虑到Github网站为境外网站,访问速度不佳,本次学习使用gitee替代。但两者使用的方式基本一样,功能也基本一致。
gitee注册:https://gitee.com/signup
1、新建仓库
注意点:
- 一个账号可以建立n个仓库
- 每个项目对应一个仓库
- 仓库有公开和私有之分
- 按照图示进入新建仓库的页面
- 按照表单提示完成表单的内容填写
- 建立仓库成功
-
多人远程开发
// 第1次 // 开发先拉主分支 git clone 地址 // 创建一个自己的开发分支 git checkout -b 自己的分支 // 推送自己的开发分支到远程 git push -u origin 分支名 // 合并者 或其他开发者 // 第1 次 git clone // 不是第1次 git pull origin master // 拉取其它分支 // 在主分支 git merge 分支名 // 推送 git push -u origin master
2、仓库主界面功能
- 统计
- Watch:关注该仓库的人数(后期仓库项目有进度更新,则关注的人会收到通知)
- Star:收藏该仓库的人数(后期仓库项目进度有更新不会收到通知的)
- Fork:引用,将不错的项目的仓库里的代码复制一份到自己的账号下,产生同名的仓库
- 代码
- 点击之后查看仓库的代码
- Issues
- 讨论区,用于对于项目中可能存在的问题进行交流讨论
- Pull Requests:将引用的(fork)版本推送给被引用的仓库(需要原始仓库负责人去审核)
- Wiki:在线编写项目的使用或者说明文档的
- 管理
- 删除仓库:不是特别需要,则不要进行这个操作
- 仓库成员管理:团队协作往往是很多人参与进来,这个时候就需要邀请成员来参与
- 克隆/下载:让用户去下载远程仓库的代码到他们本地机器上的操作
三、Git工具的使用
1、下载&安装Git
MacOS系统下载安装方式(2选1):
- 先安装
homebrew
,随后执行brew install git
(好处:要什么装什么)- AppStore中安装
Xcode
(好处:简单)
2、Git工作流程图
以下仓库指的是本地仓库
3、Git的使用(重点)
①首次使用Git的准备工作
# 填写注册Gitee时候的用户名(后续使用其它平台的时候建议做替换操作)
git config --global user.name "你的用户名称"
# 填写注册Gitee时候的邮箱(后续使用其它平台的时候建议做替换操作)
git config --global user.email "你的邮箱"
# 如果随便写后续有影响吗?
# 如果就使用功能上而言,没有影响。但是不建议,否则代码会识别成其它人提交的。
②本地仓库建立 (先创建项目的文件夹,进入后再执行)
git init
③本地与线上仓库同步
a. 本地没有仓库
a1. 本地没有仓库,直接将线上克隆到本地,克隆完毕直接关联
git clone 远程仓库地址
a2. 本地没有仓库,新建本地仓库,随后通过命令使得本地与线上仓库关联
cd 项目空路径
git init
# touch:新建文件README.md
touch README.md
# 将文件添加到暂存区
git add README.md
# 将文件添加到本地仓库(建议给注释加上引号,防止有空格)
git commit -m "init"
# 将当前仓库与远程仓库建立对应关系
git remote add origin 远程仓库地址
# 提交本地仓库的代码到远程
# 如果是首次则使用:git push -u origin master
# 该命令中master(master是分支)是可变的,后续不一定每次都是master
# 如果首次提交后,以后每次想将代码再提交到远程,则请直接使用git push
git push -u origin master
b. 本地有仓库,与线上远程仓库关联
cd 仓库路径
git remote add origin 远程仓库地址
git push -u origin master
④提交更改到暂存区
git存在一个提示性的命令,能够让我们在工作时候摸鱼回来提示我们下一步该干啥:
git status
git add .
⑤提交更改到本地仓库
git commit -m 注释内容
⑥将本地仓库代码提交到远程仓库
git push
⑦将线上代码拉到本地(线上→本地同步操作)
git pull
新手上路守则
-
上班第1天
- git config
- git clone
- git add .
- git commit
- git push
-
上班第2天
- git pull
- git add .
- git commit
- git push
-
上班第3天
- git pull
- git add .
- git commit
- git push
-
…
4、免密操作
该操作是可选的,只是多增加了一个鉴权的方式而已。
核心:公私钥对的验证
① 产生公私钥对
ssh-keygen -t rsa -C cherish@cherish.pw
产生完毕后,公私玥对位于c/Users/用户名/.ssh/
:
- id_rsa:私钥(私有的钥匙,不能公开)
- id_rsa.pub:公钥(可以公开的钥匙)
② 将公钥上传至远程仓库个人中心的设置里
以gitee为例,添加公钥请访问:https://gitee.com/profile/sshkeys
备注:之前使用的是基于https的方式,那种方式是通过账号密码鉴权的;如果想用现在的免密登录,请使用ssh协议去关联本地与线上仓库。
5、分支操作(重点)
分支的概念及作用:分支在实际开发的时候一般会按照功能模块进行划分,团队协作开发的时候每个人都有自己的分支。各自会在自己的分支上开发,可以防止和别人产生冲突。在自己分支上开发的内容并不能算项目(其只是项目的一部分),在写完之后需要与其它分支进行合并的。
掌握的点:
- 打成zip包
git tag 版本号
git archive --format=zip v1.0>v1.0.zip
-
如何查看分支
-
git branch # 分支列表中名字是绿色的,且前面有*号的,则表示当前的分支名
-
-
如何创建分支
-
git branch 分支名 # 创建只是在本地创建,不会在线上仓库同步创建 # 如果也需要线上有这个仓库,则需要push git push -u origin 分支名
-
-
如何切换分支
-
git checkout 分支名
-
-
如何合并分支
-
# 先需要进入到要合并到的分支(例如:user -> master) git checkout master git merge 被合并的分支名 # 最后如果需要同步到线上远程仓库,则需要在合并到的分支中执行git push git push
-
-
如何删除分支
-
git branch -d 分支名
-
6、代码冲突
什么叫做代码冲突:线上仓库与本地仓库不同步时,直接修改本地仓库再提交的时候会出现的问题。
上述体现就是冲突,遇到冲突该如何处理呢?
答:需要解决冲突。
例如上述css文件最终保留我们需要提交的内容可能是:
p {
text-align: center;
}
* {
font-size: 20px;
color: #fff;
line-height: 40px;
}
解决好之后再去执行git add
、git commit
、git push
7、版本回退(Git中的时光机)
场景:代码经过不断的迭代,后续可能需要使用以前的某时候的代码,但是这个代码在现在代码中已经没了。
步骤:
- 查看日志,获取版本号
# 查看提交的历史
git log
# 查看提交的历史(格式化)
git log --pretty=oneline
- 依据版本号回退到指定版本
# HEAD形式的两种回退方式不推荐用,原因:回去之后回不来了
# 回退到上个版本
git reset --hard HEAD^
# 回退到前3次提交之前,以此类推,回退到n次提交之前
git reset --hard HEAD~3
# 推荐用后面这个(可以跳转到指定的时候,过去可以,未来也可以)
# 回退到指定版本
git reset --hard commit_id
# commit_id在用的时候不必非得写全,一般7个前面的字母组合就完全够了
- 工作区中的文件回退
// 回退的文件内容,一定要当前此文件必须已提在本地仓库中提交过
git checkout -- 文件名
- 暂存区中的文件回退
// 当前文件一定在之前提交到本地仓库过一次
git reset HEAD 文件名 让当前的此文件回退到上一次的暂存区的位置,当前文件回到工作区
git checkout -- 文件名
四、总结
git init
git add .
git commit -m "说明"
git checkout -- 文件名
git reset HEAD 文件名
git log
git reset --hard commit—id