Git
一、Git概述
(一)什么是Git?
Git是一个开源的分布式版本控制系统(Distributed Version Control System,简称DVCS)。可以有效、高速地处理从很小到非常大的项目版本管理。
(二)什么是版本控制系统?
版本控制系统能追踪项目,从开始到结束的整个过程。对编程人员而言,版本控制技术是团队协作开发的桥梁,助力于多人协作同步进行大型项目开发。软件版本控制系统的核心任务:查阅项目历史操作记录、实现协同开发。
(三)常见的版本控制系统
① 集中式版本控制工具
集中式版本控制工具,版本仓库是集中存放在中央服务器的,team里每个人工作时,从中央 服务器下载代码。每个人个人修改后,提交到中央版本仓库。提交(commit)代码需要联网。如:svn
这会造成一个明显的问题:单点故障
② 分布式版本控制工具
分布式版本控制系统可以没有 “中央服务器”,每个人的电脑上都是一个完整的版本仓库,这样工作的时候,不需要联网。因为版本仓库就在你自己的电脑上。多人协作只需要各自修改,开发完成即可,推送给对方【联网】,推送的时候是将整个版本仓库推过去。如:Git这个共享版本库一般指的是代码托管平台,比较有名就是github,gitee
(四)Git的特点
① 速度、简单的设计
② 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
③ 完全分布式
④ 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
⑤ 协同开发
Clone:克隆,从远程仓库中克隆代码到本地仓库,第一次操作
Push:推送,代码完成后,需要和团队成员共享代码时,将代码推送到远程仓库。
Pull:拉取,从远程库拉代码到本地库,自动进行合并(merge),最后放到工作区。
checkout:将本地仓库的内容检出到工作区
add:在提交前先将代码提交到暂存区
commit:提交到本地仓库
(五)基本概念
本地仓库: 在本地主机上的一个代码库,可以独立存在,也可以与远程仓库进行关联
工作区:对任何文件的修订(增删改),都先放在工作区,工作区不与任何仓库分支进行关联 暂存区:把修订的文件,从工作区经过add(添加)后与某一个仓库分支进行关联,只要进 入缓存区的文件才能commit(提交)到本地仓库。
远程仓库 : 在局域网或互联网上的一个主机,存放代码库的主机或平台,比如GitHub、 Gitee.com(码云)
分支:代码存放在仓库,默认是主分支(master),可以在主分支基础上创建很多子分支,比如 develop(开发)、bugfix(bug修复)等。
二、Git的下载和安装
(一)下载
下载地址:https://git-scm.com/download
(二)安装
傻瓜式安装:一路下一步。安装完成后在电脑桌面右击显示 注: Git GUI Here:Git提供的图形界面工具 Git Bash Here:Git提供的命令行工具
三、Git的基本配置
1.安装完成 Git 后,正式使用git前,是需要进行一些全局设置的,如用户名、邮箱。
设置全局用户名
git config --global user.name "your name"
设置邮箱
git config --global user.email "your email"
以上配置信息默认存储在用户目录下,如果设置错误,可以删除以下如图文件,重新操作以上命令即
可。
- 查看配置信息:git config --list
- 构建本地仓库:要使用Git对我们的代码进行版本控制,首先需要构建本地仓库
① 在本地初始化一个Git仓库
② 从远程仓库克隆一个仓库
本地仓库的相关操作
- 在本地初始化一个Git仓库:
- 在电脑的任意位置创建一个空目录作为我们的本地Git仓库
- 进入这个目录中,点击右键打开Git bash窗口
- 执行命令Git init
如果在当前目录中看到.git文件夹(此文件夹为隐藏文件夹)则说明Git仓库创建成功
- 查看文件状态:
git status [-s]
- 将文件添加(修改)到版本库
要将一个文件纳入到版本库管理,首先要将其添加到暂存区,然后才能提交到仓库中。
添加单个文件到暂存区
git add Readme.txt
将当前目录下所有修改添加到暂存区,除按照规则忽略的之外
git add .
- 将暂存区中的文件,提交到仓库中
如果暂存区有文件,则将其中的文件提交到仓库
git commit
带评论提交,用于说明提交内容、变更、作用等
git commit -m 'your comments'
- 查看提交历史记录
有的时候,是会需要查看自己做过哪些提交,来回顾自己完成的部分。或者需要寻找某个具体的提交来
查看当时的代码。
git log # 显示所有提交的历史记录
git log --pretty=oneline # 单行显示提交历史记录的内容
- 版本回退
有了 git log 来查看提交的历史记录,我们就可以通过 git reset --hard 来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。
回退到 commit_id 指定的提交版本
git reset --hard 'commit_id'
- 回到未来的某个提交
当退回到某个提交的版本以后,再通过 git log 是无法显示在这之后的提交信息的。但是,通过 git reflog 可以获取到操作命令的历史。因此,想要回到未来的某个提交,先通过 git reflog 从历史命令中找到想要回到的提交版本的 ID, 然后通过 git reset --hard 来切换。
git reflog
git reset --hard 'commit_id'
- 删除文件
在文件未添加到暂存区之前,对想删除文件可以直接物理删除。如果文件已经被提交,则需要 git rm
来删除
git rm Readme.txt // 删除已经被提交过的 Readme.txt
注意: git rm 只能删除已经提交到版本库中的文件。其他状态的文件直接用这个命令操作是出错的。
四、分支管理
(一)查看分支
# 查看本地分支信息 git branch # 查看相对详细的本地分支信息 git branch -v # 查看包括远程仓库在内的分支信息 git branch -av 注意:前面带有*号,这标识我们当前所在的分支
(二)创建分支
# 新建一个名称为 dev 的分支 git branch dev
(三)切换分支
# 新建完 dev 分支以后,通过该命令切换到 dev 分支 git checkout dev 注意:当我们创建完分支以后,我们需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。事实上,所有的改动,只能影响到当前所在的分支。
(四)创建并切换分支
# 新建 dev 分支,并切换到该分支上 git checkout -b dev
(五)合并分支
# 切换回 master 分支 git checkout master # 将 dev 分支中的修改合并回 master 分支 git merge dev 注意:分支修改文件中如果有换行的话会报错
解决:Git默认配置替换回车换行成统一的CRLF,我们只需要修改配置禁用该功能即可。 git config --global core.autocrlf false
(六)删除分支
当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可 以删除它。 # 删除dev分支 git branch -d dev
五、远程仓库
现在我们已经在本地创建了一个Git仓库,又想让其他人来协作开发,此时就可以把本地仓库同步到远 程仓库,同时还增加了本地仓库的一个备份。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务平台来实现,其中 比较常用的有GitHub、码云等。
-- GitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本仓库格式进行托管,故名GitHub。
-- 码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于 GitHub,码云速度会更快。
接下来我们演示如何将本地仓库中的代码同步到github。和码云的操作一模一样
(一)注册账号
① 第一步,点击注册按钮
② 填写真实信息
③ 邮箱验证
(二)登录使用
创建仓库
填写仓库详情
六、同步远程仓库
(一)ssh配置
SSH是英文Secure Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间 人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处 就是传输的数据是经过压缩的,所以可以加快传输的速度。
注:使用SSH同步方式需要先生成密钥并在Gitee配置公钥
执行命令,生成公钥和私钥: ssh-keygen -t rsa 执行命令完成后,在window本地用户.ssh目录C:Users用户名.ssh下面生成如下名称的公钥和私钥
密钥生成后需要在gitee上配置密钥,本地才可以顺利访问。
在git工具上输入指令 ssh-keygen -t rsa 执行后,会在C:Users用户名 下 一个名为.ssh的文件夹中找到公钥
使用记事本的方式打开id_rsa.pub 把里面的公钥内容复制到网页公钥文件域中。
(二)添加远程仓库地址
git remote add origin 远程仓库地址
七、远程仓库的操作
(一)推送本地内容到远程仓库
# 在本地仓库更新内容 添加暂存区 git add . # 提交内容 git commit -m '信息' # 当本地仓库中,代码完成提交,就需要将代码等推送到远程仓库,这样其他协作人员可以从远程仓库同步内容。 # 第一次推送时使用,可以简化后面的推送或者拉取命令使用 git push -u origin master # 将本地 master 分支推送到 origin 远程分支 git push origin master 注意: ① git push -u origin master ,第一次使用时,带上 -u 参数,在将本地的 master 分支推送 到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。 ② 推送之前,需要先pull远端仓库,如果发现提交版本不一致,出现错误
(二)拉取
在多人协作过程中,当自己完成了本地仓库中的提交,想要向远程仓库推送前,需要先获取到远程仓库的最新内容。使用如下命令
git fetch origin master
git pull origin master
git fetch 和 git pull 之间的区别:
git fetch 是仅仅获取远程仓库的更新内容,并不会自动做合并。
git pull 在获取远程仓库的内容后,会自动做合并,可以看成 git fetch 之后 git merge 。从远程仓库拉取文件注意事项:
如果本地仓库是手动创建,并不是从远程仓库克隆的,那么分支的关联包括远程仓库的历史记录都不会生成。需要手动配置。1- 建立和远程分支的关联(非必要)
git branch --set-upstream-to=origin/master master
2- 允许在历史记录不关联的情况下拉取文件
git pull origin master --allow-unrelated-histories
(三)解决合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
例如:
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需 要推送到远程仓库,此时B用户晚于A用户推送,故需要先拉取远程仓库代码,经过合并后才能推送代 码。在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并 冲突。
解决: ① 先拉取代码 ② 打开代码解决冲突 ③ 再提交 工作技巧: 推送要早,bug要少
(四)从远程仓库克隆
Git 克隆的是该 Git 仓 库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你 执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。 如果你本地没有仓库,希望从已有的远程仓库上复制一份代码,那么你需要 git clone 。 # 通过 https 协议,克隆 Github 上 git 仓库的源码 git clone https://github.com/lagou-zimu/repo1.git # 通过 ssh 协议,克隆 Github 上 git 仓库的源码 git clone git@github.com:lagou-zimu/repo1.git
八、Idea中集成Git
(一)在idea中配置Git
(二)Idea的Git操作
1. 初始化并提交项目到远程仓库
① 初始化并提交项目到远程仓库 【项目leader操作】 执行步骤: 1. 在GitHub/码云中创建远程仓库 2. 将工程交给Git管理 3. 提交到本地仓库 4. 推送到远程仓库
② 在gitee上创建仓库
③ 将工程交给Git管理
④ 配置忽略文件
⑤ 提交到本地仓库
⑥ 推送到远程仓库
2. 克隆远程仓库到本地【开发人员】
① 从远程仓库克隆
(三)Idea中Git的常见操作【开发人员重点】
① 新增文件:新文件状态红色,未进入暂存区
加入git之后,红色变绿色,已经进入暂存区
② 编辑文件:修改文件 变成蓝色 正常编辑的文件默认放在暂存区,不需要再添加到暂存区
③ 重置文件到修改前 比如修订了某一文件,需要重置到修改文件之前的状态,选择文件,右键菜单:选择Git--->Revert 重置后,文件颜色自动消失,说明已重置到修改之前的状态。
④ 提交当前文件
⑤ 本地仓库推送到远程仓库 操作步骤: 1. 推送前一定要先拉取远程仓库对应分支 2. 如果有冲突,先解决冲突,并提交到本地仓库 3. 推送当前分支到远程仓库
冲突:如果A、B两个分支都在操作同一文件。当A分支提交远程仓库之后,B分支再提交的话会产生冲突 解决:先拉取,解决完冲突,再push
再推送到远程仓库
(四)分支操作
操作步骤: 1. 创建分支 2. 切换分支执行操作 3. 执行合并操作,master合并dev 4. 同步远程仓库
① 创建分支
② 切换分支执行操作
③ 执行合并操作(将dev分支合并到master分支)
④ 同步远程仓库
注意
总结一下:本地仓库有文件,远程仓库也有文件,正确姿势:
1,git remote add origin 远程仓库地址
2,git pull origin master --allow-unrelated-histories
3,git branch --set-upstream-to=origin/master master
4,git push