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? 需要输入yesgit 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 mastergit 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 mastergit 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 commitIDgit 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

合并分支时可能冲突
冲突产生的原因:不同分支的相同文件的相同位置的代码都做了修改
- 合并分支之前,当前分支的代码需要先提交
 

- 合并冲突的效果
 

- 冲突代码效果
 

- 一旦产生冲突,必须程序员自己解决,解决的原则是:保证两个分支的代码都合理
- 你的都对
 - 他的都对
 - 两者各有一部分对
 
 

