Git
Git介绍
版本管理的必要性
什么是版本管理?需要把历史信息进行备份,每次备份一个版本。
- 记录代码的历史版本
- 方便多人协作开发(多个程序员做同样的项目),方便代码的自动化合并
版本管理工具演进
- 本地模式,不方便团队协作
- 集中式(Svn),服务器如果出问题,就无法工作了(有安全问题)
- 分布式(Git),既方便团队协作也比较安全
版本管理环境安装配置
Git客户端安装
- 官方下载地址
- Git-2.26.1-64-bit.exe
- 双击,然后一直下一步即可完成安装
- 安装成功后,在桌面右键,如果看到如下效果,证明安装成功
配置用户信息
为何需要配置用户信息?需要确定代码是谁写的
- git config
- 查看配置信息
- git config —list
- 配置用户进行信息
- 查看配置信息
# --global 会将配置项保存到用户配置(提交代码需要用到这些信息)
git config --global user.name "xxx"
git config --global user.email "xxx"
总结:
- 为何需要配置用户信息?git工具需要知道代码是谁写的
- 需要配置用户名和邮箱
Git初体验
- 初始化本地仓库
git init
- 将文件添加到暂存区(临时存放代码的位置)
- 一般代码做完一部分就添加一次
# 把项目中所有的文件纳入git的管理
git add .
- 提交暂存区代码到本地仓库(正式存放的位置)
- 一般是完成的阶段性任务可以提交一次
git commit -m '初始化版本'
- 查看当前仓库中所有文件的状态
git status
- 查看提交的历史版本
git log
总结
- 对于新创建的项目,需要执行git init初始化代码仓库
- 提交代码的版本需要2步
- git add .
- git commit -m ‘备注’
- git status 查看当前文件的状态
- git log 查询历史版本
核心概念分析
三个区域
- 工作目录:放置代码的项目跟目录。
- 工作目录中新建的文件没有被git管理
- 暂存区:临时管理代码的区域(尚未完成的功能代码一般添加到这里)。
- 只要代码添加到暂存区,那么就被git管理起来
- 本地仓库:管理正式的代码的版本信息。
- 阶段性完成的小功能可以提交到本地仓库
文件四个状态
- 未跟踪,新建的文件(红色的),没有被git管理
- 已暂存,添加到暂存区的文件(绿色的文件),已经被git管理,下一步需要被提交
- 已提交,本地仓库中的文件
- 已修改,暂存区的代码被修改了(代码在工作目录)(红色的)
相关命令补充用法
git add
- git add .
- 添加所有文件到暂存区
- git add 文件列表 (多个文件名称之间用空格隔开)
- git add a.txt b.txt
- git add * 添加除 【.开头的文件】 之外的所有文件
git commit
需求:熟悉快速提交的用法(省略git add步骤直接提交)
- git commit -am ‘备注’
注意:这样做有一个前提条件:不可以包含新建的文件(新建的文件无法用这种方式提交) 如果有新建的文件,必须先git add 在 git commit
远程仓库
远程仓库介绍
本地仓库的代码上传到远程仓库,可以方便同事之间共享代码 公司内部一般有自己的远程仓库,但是学习阶段,可以借助公开一些远程仓库测试。
注册远程仓库账号
这些远程仓库都需要先注册账号才能使用(support@github.com;noreply@github.com)
创建远程仓库
- 使用注册号的账号登录远程仓库平台
- 点击右上角的 + ,然后选择新建仓库
- 在打开的界面中输入仓库名称(不能重复),其他选项默认
- 然后点击底部的创建按钮
- 跳转到一个新的页面,如下所示
- 推送本地代码到远程仓库步骤
- 添加远程仓库地址的别名
git remote add origin git@gitee.com:wzj1031/mydemo-128.git
- 把本地仓库的代码推送过去
git push -u origin master
注意:如果第一次推送时添加-u,那么以后推送可以简化为 git push 如果第一次没有添加-u,那么每次推送需要 git push origin master
配置用户权限
- 熟悉ssh验证流程
- 执行如下命令,生成公钥和私钥对
# ssh-keygen -t rsa -C '你的邮箱地址'
ssh-keygen -t rsa -C "wangzijie1031@qq.com"
- 把公钥提供给远程仓库
- 右上角图标 —-> 设置
- 把公钥文件(id_rsa.pub)里面文本内容直接填充表单,然后确定即可
推送本地代码到远程仓库
- 创建远程仓库的别名
# git remote add 别名 远程仓库地址
git remote add origin git@github.com:byte0/mydemo.git
# 上传本地代码到远程仓库, 第一次上传代码建议添加 -u ,作用是把本地仓库和远程仓库关联,关联之后后续推动代码比较方便
# 第一次推送代码会提示yes/no? 需要输入yes
git push -u origin master
# 后续上传代码可以进行如下简化
git push
- 出现如下图示表示上传本地仓库代码到远程仓库成功了
把本地仓库的代码推送到远程仓库
- 本地仓库需要先commit代码然后才可以推送到远程
- 给远程仓库的地址起一个别名
# 添加别名
git remote add origin git@gitee.com:wzj1031/mydemo.git
# 修改别名(把origin修改为abc)
# git remote rename 原来的别名 新的别名
git remote rename origin abc
# 删除别名
git remote remove origin
# 查看别名
git remote -v
- 根据别名把本地仓库代码推送到远程
- -u 的作用:把本地仓库和远程仓库建立关联,后续再推送可以简化 git push
git push -u origin master
git push
克隆远程仓库代码到本地
- 新员工得到代码的方式
- git clone 一般是第一次获取代码需要
# 克隆代码(把远程仓库的代码完整的复制一份到本地)
# git clone 远程仓库地址
git clone git@github.com:byte0/mydemo.git
- 已经克隆下来的项目代码需要更新最新代码
- 每次更新代码使用 git pull
# 更新远程仓库最新代码
git pull origin master
# 简写如下
git pull
- 每次推送代码使用git push
git push origin master
git push
- 关于别名的操作
- 添加别名 git remote add origin https://gitee.com/wzj1031/mytest-1.git
- 删除别名 git remote remove origin
- 重命名别名 git remote rename 原来的别名 新的别名
基于码云的团队协作配置方式
- 在项目右上角【管理】—-> 【仓库成员管理】—-> 【所有】
- 点击右上角【添加仓库成员】
- 选择【直接添加】
- 输入组员的账号名称(或者邮箱)
- 点击确定
团队仓库配置
- 组长:创建码云远程仓库 zuoye115-zhangsan
- 创建仓库
- 配置组员的读写权限
- 团队作业协作模式
- 组长创建项目然后把git地址发给组员(不用发,配置权限后自动就有)
- 组员通过这个地址克隆仓库代码
- 组员在这个仓库里面添加作业文件
- 然后git add
- 然后git commit
- 推动代码
- git push -u origin master
- 后续再推代码直接git push
问题
- 别人已经提前推送了代码,我们再推的时候会出现如下问题,要想推上去,需要先git pull,然后再git push
- 但是在git pull的时候可能会出现如下问题
关于代码合并的冲突问题
- 代码冲突的原因是什么?
- 不同的程序员修改了相同文件的相同行号的代码(冲突效果如下所示)
- 冲突后,git会对有冲突的代码进行标注
- 如何解决冲突?需要自己手动解决冲突(原则:保证双方的功能代码都正常)
- 双方代码谁的是合理的由需求决定
- 一旦出现了冲突就不要继续写代码了,要先解决冲突,然后提交,然后推送到远程
- 然后再继续开发。
回滚(撤销)操作
把暂存区文件再撤销到工作目录
- git add 的逆操作 (暂存区 -> 工作目录)
- 把暂存区中的文件移除到工作目录(这些被移除的文件不再被git管理,可以删除)
# 方法一:git restore --staged 文件列表
git restore --staged a.js b.js
# 方法二:git rm --cached 文件列表
git rm --cached a.js b.js
# 如果希望把文件从暂存区撤销到工作目录并且删除工作目录的文件,可以执行如下命令
git rm a.js # 已经提交的代码可以直接删除
git rm -f a.js # 添加到了暂存区,但是没有commit,代码需要添加 -f 强制删除
撤销代码的修改
今天去上班,接到一个新的任务,花费了一个上午完成了60%(修改了10个文件),中午吃晚饭,回来接着做,刚坐到工位,突然想到思路错了,此时应该如何是好?撤销所有的修改
- 如何撤销所有的修改?
- 本质上就是用暂存区修改前的代码覆盖当前工作目录的代码
# 该命令执行时,一定要慎重的考虑好(撤销后,无法再找回)
git checkout .
把本地仓库的代码撤销掉
下班前,领导要求提交代码,测试部门需要进行功能测试,你刚提交完成代码,自己就发了一个bug,此时如何是好?这个时候需要把代码回滚,然后重新去做。做完之后再提交。
# git reset --hard commitID
# 回滚到指定的版本(用指定版本的代码覆盖工作目录和暂存区)
git reset --hard 615da1d
- 查看历史版本的简化方式
git log --oneline
- 工作目录和暂存区新添加和修改的所有代码都不要了
- 用当前本地仓库的最新代码覆盖工作目录和暂存区
git reset --hard HEAD
- 回滚时保留工作目录和暂存区
git reset --soft commitID
- 混滚时保留工作目录但是不保留暂存区(—mixed是默认选项)
git reset --mixed commitID
git reset commitID
命令 | 工作目录 | 暂存区 | 本地仓库 |
---|---|---|---|
—hard | 覆盖 | 覆盖 | 回滚(撤销) |
—mixed | 不覆盖 | 覆盖 | 回滚(撤销) |
—soft | 不覆盖 | 不覆盖 | 回滚(撤销) |
分支管理
分支概念分析
分支:把代码复制一份新的就是一个新的分支(分支就是某一个版本代码的复制品)
- 一个分支一般用于处理不同的任务(特性分支)
- 测试项目时一般会以某一个分支为基准进行测试(测试分支)
- 有时代码出现了bug,此时可以创建一个单独的分支来修复bug(bug修复分支fix)
查看当前所有本地分支
git branch
创建分支
# git branch 分支名称
git branch test
- 创建分支时是以当前分支最后一个版本为基准
- 创建出来的分支是一份独立的代码
切换分支
# git checkout 分支名称
git checkout test
- 切换分支后,当前工作目录中看到的代码就是新切换的分支的代码
- 切换分支时,需要先提交代码 git commit
合并分支
# git merge 分支名(来源分支)
git merge test
- 分支的合并需要:从当前分支把另外一个分支(来源分支)合并过来
删除分支
# git branch -d/-D 分支名称
# 如果test分支已经被合并了,那么才可以删除,否则无法删除
git branch -d test
# 强制删除分支,无论合并与否都会删除
git branch -D test
创建并切换分支
- 创建分支 git branch 分支名称
- 切换分支 git checkout 分支名称
- 创建并切换分支
# git checkout -b 分支名称
git checkout -b abc
合并分支时可能冲突
冲突产生的原因:不同分支的相同文件的相同位置的代码都做了修改
- 合并分支之前,当前分支的代码需要先提交
- 合并冲突的效果
- 冲突代码效果
- 一旦产生冲突,必须程序员自己解决,解决的原则是:保证两个分支的代码都合理
- 你的都对
- 他的都对
- 两者各有一部分对