Git
准备工作
以前管理版本的方式
版本控制软件
什么是版本控制软件
- 记录文件变化的一个软件
- 版本是每次记录代码的快照
使用场景
- 场景一:项目不断变化,改来改去,可能需要改回原来的代码
- 可对代码每次的改动做记录,记录一次,形成版本快照
- 可轻松将代码回退到任意一个版本。(可以使用之前版本中的代码、文件)
- 电脑坏了了,版本也不会丢失 (前提: 你要把git仓库上传到远程服务器上)
- 场景二:多个人合作开发同一个项目,代码合并到一个工程文件夹下
- 使用版本管理软件合并代码
好处多多
-
只需要记录几个命令, 快速上手, 自动管理版本(产生副本-不可见)
-
易于对比: 每次版本之间的区别和变化
-
易于回溯: 比如回退代码到之前稳定的版本
-
不易丢失: 可以托管在服务器上(并且每个人电脑里都有所有版本记录), 本地/服务器电脑坏了也不怕
-
协作方便: 轻松实现多人开发同一个项目, 把大家写的代码合并到一个工程文件夹中
Git介绍
Git是一个开源分布式版本控制系统软件 最先进最流行的版本控制系统.
Git记录完整的文件快照
断网也可以在本地保存(但是等连网才能上传到中心服务器同步给他人)
Git安装
不要安装中文和特殊路径下, 不要挪动git软件的目录
下载地址: https://git-scm.com/
默认全都下一步即可完成安装
打开cmd终端, 输入命令 git --version
(注意中间空格是必须的)
如果出现版本号, 就代表git软件成功安装到了你的电脑中
Git概念 - 3个区域和3个状态
- 工作区
- 文件显示在磁盘上,供我们使用或修改的区域。项目文件夹就是工作区
- 暂存区
- 执行
git add .
之后,文件由工作区,添加到了暂存区。 暂存区保存了下次将提交的文件列表信息。
- 执行
- Git 仓库(本地仓库)
- 执行
git commit -m '提交说明'
(单引号必须),暂存区 -> Git本地仓库。 - 仓库区是 Git 中最重要的部分,代码只有提交到仓库,才会形成一次历史记录, 形成一个版本 (提交过才会被记录快照)
- 执行
- 远程仓库
- Git服务器上的仓库,比如,码云gitee或者github网站上创建的的仓库或者自己有服务器创建git远程仓库,叫做远程仓库。远程仓库用于存储代码和发布项目,多人协作也需要远程仓库。
Git基础使用
本机 - 全局配置用户名和邮箱(一台只需要一次)
Git软件在工作的时候,需要知道你是谁?所以需要设置一个用户名和邮箱。
这个用户名和邮箱,最好使用你的码云账号,当然随便填也可以。(让别人能联系到你)
具体做法:
-
任何文件夹,空白处,右键 --> Git Bash Here
-
依次执行下面两行代码 --global 会将配置项保存到用户配置 (以后这台计算机, 无论哪个git项目文件夹都使用这个名字和邮箱
-
执行命令 - 设置你的名字
-
git config --global user.name "dongsancheng"
-
执行命令 - 设置你的联系邮箱
-
git config --global user.email "[email protected]"
- 会配置到
C:\Users\lenovo\.gitconfig中
Git初始化
初始化本地git环境, 让git来监测本地文件, 搭建三大区域
创建一个项目文件夹,打开项目文件夹
注意:一定要在项目文件夹
,右键–>Git Bash Here。
执行命令 - 初始化.git文件夹
-
git init
- 执行
git init
命令之后,会在项目文件夹中生成一个隐藏的.git
文件夹 - Git 管理项目的每一次记录版本快照,都在 .git 文件夹里面保存着。所以这个文件夹不能删除
- 项目没有==.git==,才需要
git init
- mac系统: shift Command . 可以显示隐藏文件
Git记录 - 代码变更
-
写代码测试
- 随便新建文件, 里面随便写点代码
-
在项目文件夹, 右击, Git Bash Here
-
执行命令 (.代表项目文件夹 - 工作区一切 保存到 暂存区)
- 只有添加到暂存区,才叫做被Git管理
- 空文件夹不能暂存
-
git add .
-
再执行命令 (代表把 暂存区的一切 保存到 git本地仓库)
-
git commit -m '提交说明'
-
执行完,这两个命令,表示使用Git把当前代码及文件的改动记录起来了 - 有了一次快照
-
-
重复1-2这2步, 这个过程4次,多使用Git记录几次
查看 - 历史记录
查看提交日志
-
git log - 打印详细信息
-
执行命令: (查看提交的日志 - 在一行简略显示)
-
git log --oneline
体验 - 历史中穿梭
- 执行命令 (可以在历史版本中穿梭 (版本号指的上图3885368))
-
git checkout 版本号
-
执行命令 (可以切换回到"现在") - master代表最近的一次提交
-
git checkout master
穿梭后 - 查看所有的版本号
穿梭到历史版本之后,通过 git log
查看不到未来的版本号
需要加 --reflog
选项,才能查看所有的版本号
- 执行命令 (查看所有版本号, 简略版)
-
git reflog --oneline
查看文件的状态
再次修改/新增代码后 - 过多的话, 如何查看本地有什么文件变更呢?
- 执行命令 (查看文件的几种状态)
git status
-
未跟踪 - 新文件
-
已修改 - modified
-
已暂存 - 执行git add . 以后的再查看git status
-
已提交 - 执行git commit -m ‘提交信息说明’ 以后再运行git status
- 表示没有什么东西可以提交了;即,所有的内容都已经提交过了 (都已经保存到本地仓库了)
如果看到有红色字体或绿色字体的文件,说明还有文件没有提交到本地仓库形成快照 (git不负责报错哦)
Git高级_分支
创建分支
使用Git管理项目的时候,会有很多次提交。把每一次提交连接起来,向一条线一样。这就叫做分支。
初始化之后,默认是在master分支上进行操作的,master分支也叫做主分支。
相关命令:
-
执行命令 - 查看所有本地分支
-
git branch
-
执行命令 - 创建新分支 (dev叫分支名, 随便起)
-
git branch dev
-
执行命令 - 切换分支 (现在本地代码都在dev这个分支下) - 如果想回到master就把dev写成master
-
git checkout dev
测试:
- 在dev分支上,写点代码,提交一下(暂存, 提交)
- 切换回到master分支, 查看代码不同
切换分支之前,必须把当前分支的代码全部提交到仓库
如果需要把dev分支的代码合并到master分支
-
切换到master
-
执行命令 - 当前在master分支上, 把dev上修改的代码合并过来
-
git merge dev
打印git log --oneline 查看master分支和dev分支
两种合并
快进模式 (Fast-forward)
-
dev分支,它包含master分支的所有提交记录
-
合并的时候,只需要让maser分支的代码和dev分支的代码一样即可
-
执行命令 - 删除无用的分支(不会影响master里的代码 -d代表删除意思)
-
git branch -d dev
合并模式
-
新建newdev分支
-
git branch newdev
-
切换到newdev分支上
-
git checkout newdev
-
然后删除一点原来的js代码, 再它上面修改新的代码(保证和原来master状态下, 不一样就行)
-
再切换到master分支
-
git checkout master
-
master分支的同样地方也进行了修改, 然后 自己提交一份 (非常重要, 不这样操作就不会显示冲突了)
-
在master分支下, 把newdev分支的内容合并上来
-
git merge newdev
-
报冲突如下:
- 也就是说,一个分支不包括另一个分支的全部提交记录
-
这种模式的合并,有可能会有冲突出现上述画面,需要执行下面的操作:
-
回到vscode查看代码冲突的地方, 解决: 找到对方是谁, 删除谁的, 还是都保留下来
解决冲突
在合并代码的时候,有可能会有冲突,遇到冲突,解决冲突,然后提交即可。
执行 git merge 分支名
的时候,如果出现如下画面,表示有冲突:
- 打开有冲突的文件
- 去掉分割线
- 解决冲突
- 保存代码,执行
git add .
和git commit -m '提交说'
从而完成这个合并。
远程仓库
注册码云账号
码云和github都提供仓库的托管服务。
区别是码云是国内的服务器,打开速度较快;github是国外的服务器,打开速度不能保证。
码云:https://gitee.com/ - 使用这个
github:https://github.com/
能登录成功就代表注册成功了, 要牢记账号/登录的方式
配置码云的SSH秘钥
秘钥就是一个钥匙, 开门的作用 (免登陆)
我们向码云或github网站推送代码的时候,最好使用SSH的方案,这个方案需要提前配置好秘钥。下面是具体的配置方法。
任何文件夹位置,空白处右键,选择右键菜单中的 “Git Bash Here
”,执行下面的命令,可以生成SSH秘钥(包含一个公钥一个私钥)
-
执行命令 (生成秘钥文件)
- ssh-keygen 固定命令, 生成秘钥文件
- -t 指定秘钥类型 (加密方式 - rsa加密)
- -C 设置注释文字(如何联系你)
-
ssh-keygen -t rsa -C "[email protected]"
注意,回车执行命令,然后继续回车,回车…直至生成完毕~
最后生成的秘钥在:
Windows:
C:\Users\用户名\.ssh
# 例如: C:\Users\lenovo\.ssh
mac:
你的用户名那个文件夹中。 按shift+Commend+. 可以显示隐藏文件,然后就可以看到 .ssh文件夹了
找到 .ssh/id_rsa.pub
,用vscode打开,复制里面全部的内容,配置到远程仓库
(重要) 相当于和远程仓库建立非账号密码方式的登录链接
- 码云右上角头像下的设置
- 左侧有 SSH公钥
- 在显示的界面中,公钥把刚才.id_rsa.pub里的值都粘贴进去, 标题自动填充
- 点击确定即可
创建远程仓库 - 获取SSH地址
在网站上创建一个项目, 申请一块磁盘空间 (如果自己有服务器, 在服务器上搭建一个git服务端的服务也一样)
- gitee.com 首页登录后
- 右上角+号, 新建仓库
自己公司项目可不要公开啊,可能被敌对机构窃取
- 点击创建后 千万不要点初始化 readme 文件
推送代码到远程
本地已有仓库
- 执行命令 - 本地添加远程仓库地址(远程分支名字叫origin)
-
git remote add origin 你的地址
- remote 远程
- add 添加
- origin 源,这个名字可以自定义,叫什么无所谓。
- 最后,是ssh地址(注意,不是https地址)
- 如果报错: 假如提示origin名字这个本地仓库已经用过了, 可以先移除 git remote remove origin 再执行这句命令
- 前提远程仓库上什么都没有
git push -u origin master
- push 推送
- origin 远程仓库地址,和上一条命令中的origin对应
- master,表示推送本地的master分支
- -u,首次推送需要 -u。(表示把本地的master和远程的master直接关联起来) ((全称叫upstream, 上传)
- 假如远程仓库有东西, 先拉取下来和本地仓库的文件合并了 (rebase是把远程的直接合并到本地master里)
- git remote add origin 你的地址
- git pull origin master --rebase (多这一步)
- 再执行, git push -u origin master
- 可以网页上去看到远程仓库去看看 就都上来了 哈哈哈
只能把本地仓库的代码推送到远程仓库;不能把工作区的、暂存区的代码推到远程。
SSH警告
如果首次使用SSH,会出现一个SSH警告,提示如下
- 如果提示 “
Are you sure you want to continue connecting (yes/no/[fi....])
”- 输入yes,回车
注意事项
一个远程仓库只能放一个本地仓库的代码
是SSH不是https
新人报道 - 拉取远程仓库代码到本地
本地没有仓库
从组长要git的地址和秘钥
- 把秘钥粘贴到我们上面创建时的相同位置上即可
- 新建空白的文件夹(一定空白不能有隐藏文件)
- 直接运行命令 (不用初始化git)
克隆远程仓库到本地
-
实际开发中,有些时候,我们需要把一个远程仓库克隆到本地
- 开发项目的时候,可以先创建远程仓库,然后克隆到本地,再进行开发
- 下载别人的代码的时候,可以选择克隆
- 多人合作开发的时候,需要克隆合作伙伴的代码到本地
-
克隆命令 - 再想要把远程仓库里代码下载的文件夹执行这个命令哦
git clone [email protected]:lidongxuwork/test_119.git .
克隆,相当于下载
-
如果克隆的是自己的仓库,那么克隆之后,可以对代码进行修改,修改之后,直接
add
、commit
、pull
、push
即可。 -
注意:克隆之后,路径并不是仓库的路径。需要把黑窗口关闭,进入项目文件夹,重新打开黑窗口
查看分支
git branch -a (-a代表远程分支也一起查看)
多人协作
实现原理:
- 分支合并(把远程分支和本地分支合并到一起)
实现步骤:
- 可以先创建远程仓库
- 【可选】我先把基础的代码推送到远程仓库
- 合作者,需要把远程仓库的代码,克隆到你的计算机中
- 管理员邀请合作者共同来开发
- 合作者,需要同意
- 然后,管理员和合作者,都可以向远程仓库推送代码
- 暂存 git add .
- 提交 git commit -m ‘消息’
- (与远程服务器上的合并) - 必须先拉取 git pull (前提是已经和远程服务器有过交互了, 否则请查看远程仓库配置章节第一次和服务器交互)
- 拉取之后,如果有冲突,解决冲突,必须add、commit一次。
- 最后推送。git push 即可把自己新写的代码, 同步到远程服务器 (别人拉取, 别人就有了你新写的代码了)
帮助文档
git help config - 自动弹出英文文档
中文文档:: http://gitref.justjavac.com/
忽略文件
.gitignore 这是一个忽略文件
有时候项目中有些文件, 无需让git管理, 我们可以配置在忽略文件中
使用规则:
#开头 是注释
/结尾的 是目录
/开头 防止递归文件夹
!开头 表示取反
还可以使用正则表达式来 匹配文件
# 忽略 index.css文件 (无论哪里的)
index.css
# 忽略所有的 .a 结尾的文件
*.a
# 只忽略当前.gitignore文件同级目录下的TODO文件夹, 不忽略abc/TODO
/TODO
# 忽略任何目录下名为build的文件夹
build/
# 忽略 doc/a.txt doc/cbd.txt 但不忽略doc/ab/a.txt
doc/*.txt
# 忽略 doc/ 目录以及所有子目录下的 .pdf文件
doc/**/*.pdf
图形化界面
- vscode
- webstorm
- sourceTree(最新版的sourceTree,低版本的windows可能安装不上)
- 小乌龟(windows系统能用)
vscode
-
暂存文件(git add .)
-
提交到本地仓库
-
推送
版本管理软件分类
- 集中式,典型代表 SVN
- 分布式,典型代表 Git
多账户的SSH本地配置
我有自己的gitee账户 / github账户 每个账户都有一个独立的秘钥 / 我同事的秘钥(我要拉取和推送代码)
.ssh/config 文件 - 填入这些配置即可
自己的gitee网站链接用的秘钥
Host gitee.com
HostName gitee.com
IdentityFile ~/.ssh/id_rsa_ziji_gitee
同事的gitee
Host gitee.com
HostName gitee.com
IdentityFile ~/.ssh/id_rsa_tz
如有不足,请多指教,
未完待续,持续更新!
大家一起进步!