Git是一个开源分布式版本控制系统软件 最先进最流行的版本控制系统.
Git记录完整的文件快照
断网也可以在本地保存(但是等连网才能上传到中心服务器同步给他人)
一. Git安装
==不要安装中文和特殊路径下, 不要挪动git软件的目录==
下载地址: Git
默认全都下一步即可完成安装
打开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 "名字"
执行命令 - 设置你的联系邮箱
git config --global user.email "邮箱"
- 会配置到
C:\Users\用户名\.gitconfig中
1.Git初始化
初始化本地git环境, 让git来监测本地文件, 搭建三大区域
创建一个项目文件夹,打开项目文件夹
注意:一定要在项目文件夹
,右键-->Git Bash Here。
执行命令 - 初始化.git文件夹
- bash git init
- 执行
git init
命令之后,会在项目文件夹中生成一个隐藏的.git
文件夹 - Git 管理项目的每一次记录版本快照,都在 ==.git== 文件夹里面保存着。所以==这个文件夹不能删除==
- 项目没有==.git==,才需要
git init
- mac系统: shift Command . 可以显示隐藏文件
2.Git记录 - 代码变更
-
写代码测试
- 随便新建文件, 里面随便写点代码
-
在项目文件夹, 右击, Git Bash Here
-
执行命令 (.代表项目文件夹 - 工作区一切 保存到 暂存区)
- 只有添加到暂存区,才叫做被Git管理
- 空文件夹不能暂存
-
git add .
-
再执行命令 (代表把 暂存区的一切 保存到 git本地仓库)
-
git commit -m '提交说明'
-
执行完,这两个命令,表示使用Git把当前代码及文件的改动记录起来了 - 有了一次==快照==
-
-
重复1-2这2步, 这个过程4次,多使用Git记录几次
3.查看 - 历史记录
查看提交日志
-
git log - 打印详细信息
执行命令: (查看提交的日志 - 在一行简略显示)
-
git log --oneline
4.体验 - 历史中穿梭
- 执行命令 (可以在历史版本中穿梭 (版本号指的上图3885368))
git checkout 版本号
-
执行命令 (可以切换回到"现在") - master代表最近的一次提交
git checkout master
4.1穿梭后 - 查看所有的版本号
穿梭到历史版本之后,通过 git log
查看不到未来的版本号
需要加 --reflog
选项,才能查看所有的版本号
- 执行命令 (查看所有版本号, 简略版)
git reflog --oneline
5.查看文件的状态
再次修改/新增代码后 - 过多的话, 如何查看本地有什么文件变更呢?
- 执行命令 (查看文件的几种状态)
git status
-
未跟踪 - 新文件
-
已修改 - modified
-
已暂存 - 执行git add . 以后的再查看git status
-
已提交 - 执行git commit -m '提交信息说明' 以后再运行git status
- 表示没有什么东西可以提交了;即,所有的内容都已经提交过了 (都已经保存到本地仓库了)
如果看到有红色字体或绿色字体的文件,说明还有文件没有提交到本地仓库形成快照 (git不负责报错哦)
四. Git高级_分支
1.创建分支
使用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分支
两种合并
1.快进模式 (Fast-forward)
-
dev分支,它包含master分支的所有提交记录
-
合并的时候,只需要让maser分支的代码和dev分支的代码一样即可
-
执行命令 - 删除无用的分支(不会影响master里的代码 -d代表删除意思)
git branch -d dev
2.合并模式
-
新建newdev分支
git branch newdev
-
切换到newdev分支上
git checkout newdev
-
然后删除一点原来的js代码, 再它上面修改新的代码(保证和原来master状态下, 不一样就行)
-
再切换到master分支
git checkout master
-
==master分支的同样地方也进行了修改, 然后 自己提交一份 (非常重要, 不这样操作就不会显示冲突了)==
-
在master分支下, 把newdev分支的内容合并上来
git merge newdev
-
报冲突如下:
- 也就是说,一个分支不包括另一个分支的全部提交记录
-
这种模式的合并,有可能会有冲突出现上述画面,需要执行下面的操作:
-
回到vscode查看代码冲突的地方, 解决: 找到对方是谁, 删除谁的, 还是都保留下来
3.解决冲突
在合并代码的时候,有可能会有冲突,遇到冲突,解决冲突,然后提交即可。
执行 git merge 分支名
的时候,如果出现如下画面,表示有冲突:
- 打开有冲突的文件
- 去掉分割线
- 解决冲突
- 保存代码,执行
git add .
和git commit -m '提交说'
从而完成这个合并。
五.远程仓库
1.注册码云账号
码云和github都提供仓库的托管服务。
区别是码云是国内的服务器,打开速度较快;github是国外的服务器,打开速度不能保证。
码云:Gitee - 基于 Git 的代码托管和研发协作平台 - 使用这个
github:GitHub: Where the world builds software · GitHub
能登录成功就代表注册成功了, 要牢记账号/登录的方式
2.配置码云的SSH秘钥
秘钥就是一个钥匙, 开门的作用 (免登陆)
我们向码云或github网站推送代码的时候,最好使用SSH的方案,这个方案需要提前配置好秘钥。下面是具体的配置方法。
任何文件夹位置,空白处右键,选择右键菜单中的 “Git Bash Here
”,执行下面的命令,可以生成SSH秘钥(包含一个公钥一个私钥)
-
执行命令 (生成秘钥文件)
- ssh-keygen 固定命令, 生成秘钥文件
- -t 指定秘钥类型 (加密方式 - rsa加密)
- -C 设置注释文字(如何联系你)
ssh-keygen -t rsa -C "邮箱"
注意,回车执行命令,然后继续回车,回车....直至生成完毕~
最后生成的秘钥在:
Windows: C:\Users\用户名\.ssh mac: 你的用户名那个文件夹中。 按shift+Commend+. 可以显示隐藏文件,然后就可以看到 .ssh文件夹了
找到 .ssh/id_rsa.pub
,用vscode打开,复制里面全部的内容,配置到远程仓库
(重要) 相当于和远程仓库建立非账号密码方式的登录链接
- 码云右上角头像下的设置
- 左侧有 SSH公钥
- 在显示的界面中,公钥把刚才.id_rsa.pub里的值都粘贴进去, 标题自动填充
- 点击确定即可
3.创建远程仓库 - 获取SSH地址
在网站上创建一个项目, 申请一块磁盘空间 (如果自己有服务器, 在服务器上搭建一个git服务端的服务也一样)
- gitee.com 首页登录后
- 右上角+号, 新建仓库
==自己公司项目可不要公开啊,可能被敌对机构窃取==
- 点击创建后 ==千万不要点初始化 readme 文件==
4.推送代码到远程
本地已有仓库
- 执行命令 - 本地添加远程仓库地址(远程分支名字叫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 远程仓库地址/ssh地址
克隆,相当于下载
-
如果克隆的是自己的仓库,那么克隆之后,可以对代码进行修改,修改之后,直接
add
、commit
、pull
、push
即可。 -
注意:克隆之后,路径并不是仓库的路径。需要把黑窗口关闭,进入项目文件夹,重新打开黑窗口
查看分支
git branch -a (-a代表远程分支也一起查看)
多人协作
实现原理:
- 分支合并(把远程分支和本地分支合并到一起)
实现步骤:
- 可以先创建远程仓库
- 【可选】我先把基础的代码推送到远程仓库
- 合作者,需要把远程仓库的代码,克隆到你的计算机中
- 管理员邀请合作者共同来开发
- 合作者,需要同意
- 然后,管理员和合作者,都可以向远程仓库推送代码
- 暂存 git add .
- 提交 git commit -m '消息'
- (与远程服务器上的合并) - 必须先拉取 git pull (前提是已经和远程服务器有过交互了, 否则请查看远程仓库配置章节第一次和服务器交互)
- 拉取之后,如果有冲突,解决冲突,必须add、commit一次。
- 最后推送。git push 即可把自己新写的代码, 同步到远程服务器 (别人 拉取, 别人 就有了你新写的代码了)
帮助文档
git help config - 自动弹出英文文档
中文文档: Git 参考手册
忽略文件
.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
总结:
代码clone:git clone 地址 ,只拉取了主分支代码
拉取远程其它分支代码:git checkout -b 分支名 origin/远程分支名
git命名
git初始化 git init
git提交到暂存:git add .
将暂存 提交到本地仓库:git commit -m"注释"
提交本地仓库到远程
和远程建立 联系:git remote add origin 地址
第一次提交 git push -u origin master
后续 提交:git push
创建分支:git branch 分支名
git checkout -b 分支名
查看分支:git branch -a 查看本地与远程分支
拉取代码 git pull
删除分支
本地:git branch -d(-D) 分支名
远程:git push origin :远程分支名
合并分支:
git merge dev 将dev分支合并到当前分支
回滚:
git reset --hard 版本号(git reflog --oneline)
刚写的代码想回滚,但是只是回滚提交
git reset --soft 版本号
冲突解决:
什么原因产生的:你改的代码不是在最新代码基础上修改的
main.js
a=1 a=3,提交前,有人将a=2
标志: 分支名 | merging
找到冲突文件 修改 git add . git commit -m"" git push
git merge --abort 取消合并
万能:
这个仓库不管了,
再重新拉取最新代码,将自己代码复制进去再提交