Git
Git是一个免费的开源分布式版本控制系统,它可以快速高效地处理从小型到大型的项目。简单点说就是:git分布式版本控制工具(管理代码版本)。我们常用的Git平台有:Gitee(码云)、GitLab、GitHub等。
1、下载Git
这里提供Git下载地址:https://git-scm.com/downloads
2、Gitee配置SSH公钥
- 注册(用邮箱注册),并登录到Gitee后,鼠标移至右上角头像,下拉选项中选择
设置
- 左侧菜单栏中选择SSH公钥,在右侧添加公钥
- 怎么生成本机的公钥?请查看:https://gitee.com/help/articles/4181
3、Git日常操作
克隆代码 (把远程仓库拉取到本地):git clone 仓库地址
查看仓库状态: git status
提交工作区代码到暂存区: git add 文件路径或者**.(所有文件)**
**提交暂存区代码到历史记录区:**git commit -m ‘本次提交的信息提示’
**提交历史记录区的历史提交记录到远程仓库:**git push origin 分支名称
注意点
git提示的信息里面只要有fatal 或者error这两个词随便一个,都是执行git命令失败了
4、创建项目与分支
在gitee中创建项目(例如创建了 demo0630
这个项目),执行以下命令:
// 克隆仓库到本地
git clone git@gitee.com:codesohigh/demo0630.git
// 检查当前分支
git branch
一般此时是master分支,但我们开发阶段一般用dev等其他分支,所以我们:
git checkout -b dev
// git checkout 命令加上 -b 参数,表示创建并切换,以上操作相当于:
git branch dev
git checkout dev
- 第一个注意的点:
在仓库没有初始化前,如果需要检查分支,一定要记住这句话:
未曾commit的仓库是无法检查分支的!
- 第二个注意点:
实际上git checkout 不是切换分支的最佳选择,我们使用git switch 会更好:
git switch -c dev // 创建并切换到新的dev分支 git switch dev // 切换到已有的dev分支
5、文件提交
创建 index.js
文件,随便写点内容,提交:
git add .
git commit -m '修改了index.js'
git push origin dev
此时你会发现,git checkout master
切回master分支后,index.js这份文件会消失,因为当前分支不存在这个文件。
6、分支合并
假设当前项目已经完成,我们想要把dev分支合并到master,可以在master分支下使用:
git merge dev
此时,你会看到,项目中又有 index.js
了。
7、版本回滚
使用 git switch -c dev1
创建新的dev1分支,稍微修改dev1中的index.js,并且提交到远程仓库。
我们提交完成后,发现自己不想用当前代码,想回滚到上一次的代码,怎么办呢?
// 查看当前项目提交过的所有版本(含所有分支的操作)
git log
// git log会出现很详细的信息,如果我们只想简单看看版本号,可以使用
git log --pretty=oneline
我们会得到:
b2ff1beb92bd3ac425dac2fa519d4b8191438be9 (HEAD -> dev1) '123456'
c9efd011b471765fc9fdd6eefaadf75b3b36153b (origin/dev1) '12345'
80f6cb77a9b13cd471b725b5ef66901150bf57bb '提交'
47d676dbf6d0687d76f059ee9ed044c4c378ed30 (origin/master, origin/HEAD) 'dev1的首次提交'
d5c756afd04abfdbc9bb2299064eab34b30ede5f (origin/dev, dev) '修改了index.js'
65f4c72f6c8e2c272d4e284c103e249c65ebff32 Initial commit
如果我们只想回滚到指定版本,可以使用:
git reset --hard c9efd
这里只需要写id号的前几个字母与数字就行,没必要全写,git会自动去检索。
但此时,我们再一次查看所有版本,发现:
c9efd011b471765fc9fdd6eefaadf75b3b36153b (origin/dev1) '12345'
80f6cb77a9b13cd471b725b5ef66901150bf57bb '提交'
47d676dbf6d0687d76f059ee9ed044c4c378ed30 (origin/master, origin/HEAD) 'dev1的首次提交'
d5c756afd04abfdbc9bb2299064eab34b30ede5f (origin/dev, dev) '修改了index.js'
65f4c72f6c8e2c272d4e284c103e249c65ebff32 Initial commit
最新写的那个丢失了。但我此时又后悔了,怎么办?
// 重新reset即可找回
git reset --hard b2ff1
现在,就可以退回最新版本了。
但这个方法前提是你当前这个控制台不曾关掉,如果已经关掉了,你是没法知道版本号的,这时候要怎么办呢?
// Git提供了一个命令git reflog用来记录你的每一次命令
git reflog
8、代码冲突
修改master的代码,执行:
git add .
git commit -m '提交master'
然后执行:
git merge dev
我们会发现,vscode提示代码冲突:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MczNYEkh-1648104442606)(assets/03.png)]
此时,我们只需要点击我们想要的选项,即可解决代码冲突。
合并分支
初始化
git init
git add . //将文件提交到暂存区
git commit -m “first commit” //将文件从暂存区提交到本地仓库
git remote add origin your_first_git_address //链接到远程仓库
git push origin master //提交到远程仓库
链接到另一个仓库
git remote add Mars your_second_git_address //将第二个git address命名为Mars
git push Mars master //再次push到远程仓库
更新远程仓库分支信息
git fetch
git fetch origin
git checkout dev //新建并切换分支(如果有就直接进入)
git pull origin dev //拉取分支
git merge dev //合并分支
如果合并失败,出现这个报错 fatal: refusing to merge unrelated histories
原因:两个分支没有取得关系
解决方法:在操作命令后面加--allow-unrelated-histories
例如:
git merge dev --allow-unrelated-histories
进入 (dev|MERGING)分支,对两个分支之间出现冲突的地方进行修改
git add .
git commit -m '合并分支'
pull和push报错:
如果你是`git pull`或者`git push`报`fatal: refusing to merge unrelated histories`
同理:
`git pull origin master --allow-unrelated-histories`
后面加上 --allow-unrelated-histories , 把两段不相干的分支进行强行合;这里可能会进入一个编辑页面,只需要先ESC,然后敲:q! 即可
命令
git remote -vv //查看当前已经关联的所有仓库
git init : 本地初始化(初始化git环境), 这个会生成一个.git目录
git add : (把工作区的改变提交到暂存区)
git commit : (暂存区的内容提交本地仓库)
git push origin 分支: (把本地仓库提交远程仓库)
git clone 仓库地址(https或者ssh): 克隆仓库
配置ssh公钥: ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com" 把生成好的公钥.pub结尾的文件内容复制到对应网站上
git fetch origin 分支: 同步远程仓库的分支信息
git pull origin 分支:更新本地仓库的某一个分支的代码 (相当于 pull = fetch + merge)
git switch 分支; git checkout 分支; : 切换分支
git switch -c 分支; git checkout -b 分支: 创建分支
git branch -a : 查看本地仓库的所有分支
git status: 查看仓库的状态
git log: 查看提交(commit)的信息
git commit --amend: 修改提交信息
git reset --hard commitid: 回退指定版本
git reset --hard HEAD //用来撤销还没commit 的merge,其实原理就是放弃index和工作区的改动。