Git
版本控制
版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统.
简单讲就是备份和记录
本地版本控制系统
把项目拷贝到本地磁盘上进行备份.
本地版本管理就是把版本号存入数据库来记录文件的历次更新差异。
本地版本控制系统能够将不同版本的文档保存下来并且借助版本记录可以很方便定位相关文件,但又开发者不能协同工作.
集中化版本控制系统
集中化的版本控制系统是有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
但是如果服务器出现故障,会造成单点故障(一般会用多台服务器来解决,这样有会造成资源的浪费),造成无法上传和拉去中央服务器的内容.
分布式版本控制系统
集中化版本控制系统是对本地版本控制系统的一次升级, 因为它加入了协同操作, 分布式版本控制系统是对集中化控制系统的一次补充, 使之更加完善。(既可以协同操作,又避免了单点故障)
相对于集中化版本控制系统而言,分布式是把最原始的代码仓库镜像到本地. 这样一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
Git文件的三种状态与工作模式
三种状态
已提交(committed) 示数据已经安全的保存在本地数据库中。
已修改(modified) 表示修改了文件,但还没保存到数据库中。
已暂存(staged) 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
工作模式
三个工作区:工作区,暂存区,git仓库
工作模式:
初始化git仓库(通过git init)—>工作区(通过add添加到暂存区)---->暂存区(通过commit提交)—>git仓库
git status 查看存储状态
git log 查看日志
git init 初始化数据库
git add . 或者git add 文件名 添加到暂存区 点是指当前目录下的所有文件.
git commit -m ‘注释信息’ 提交
注意:如果只写git commit 会强制进入注释的模式;需要先写个a(append)|i(insert),之后就可以编写注释了,写完之后按esc退出编辑注释模式,写:(冒号)进入底行模式,在写wq(写入退出),q(退出),q!(强制退出)
时光穿梭机
修改文件与文件提交
修改文件—通过add添加到暂存区–通过commit提交
也可以通过 git commit -am ‘注释信息’ 直接添加和提交
git diff HEAD --文件名 与版本库内容进行比较
暂存区文件与撤销
当我们add 添加到暂存区,需要撤销时:
git reset HEAD 文件 (既可以回退add之后的,也可以回退commit之后的)
git restore --staged 文件 (只可以回退add之后的)
还未添加到暂存区的文件回退
git restore 文件名
版本回退
通过git log查看之前历史版本
因为git log显示的信息过多,我们可以使用 git log --pretty=oneline 简化输出(会显示唯一标识和注释信息).
git reset --hard HEAD^ 回退到上一个版本,有几个^ 就回退几个版本 hard是指针
git reset --hard HEAD~2 回退2个版本,波浪号后面写几,就是回退几个版本
git reset --hard 唯一标识 只复制(Ctrl+insert)前八位的标识就可以,一般不会重复.粘贴是shift+insert
git reflog 查看完整日志
文件删除
删除也是一个修改的操作
1>不小心把工作区的删除了(仓库的有),恢复工作区的
git checkout – 文件名 将误删除的文件重新从版本库中检出
2>工作区的删除了,还要删除本地库中的
git add|rm 文件名 如果是add的话,还需要在提交
远程仓库
推送本地库文件到远程有两种方式**:Https,SSH** 一般建议使用ssh的方式
可以使用git clone 地址 克隆文件
使用Https方式
创建gith账号–点击右上角的new repository —创建仓库
git branch -M main 给分支重命名
git remote add origin https://github.com/账户名/git0001.git(仓库名) 绑定远程仓库的地址
git push -u origin main 推送
setting 最下面有个删除 ,需要输入仓库的名称和密码
推送本地库文件到远程有两种方式**:Https,SSH** 一般建议使用ssh的方式
使用SSH方式
使用时需要秘钥的,有公钥和私钥.
秘钥: 1>点击图像,有一个设置,找到SSH,有一个SSH keys
2>生成秘钥的命令:ssh-keygen -t rsa -C “GitHub账户邮箱” 回车
会在C:\Users\xxx中生成一个.ssh文件,可以找到秘钥,打开公钥的,全选复制
3>和GitHub账号绑定 在SSH keys后面点击New SSH key,Title:可以写个test,key:粘贴公钥;删除最后的空格
4>检查测试链接 执行命令 ssh -T git@github.com 之后输入yes, 有You’ve successfully authenticated,代表成功了
之后创建仓库上传,就和之前的一样了.唯一的不同就是绑定仓库的地址不一样.
克隆远程项目到本地
git clone 地址
Git分支操作
开发企业项目中在使用Git 或者其他类似版本控制软件对项目版本进行管理时,多人合作的项目在开发时通常不会直接在主干master 上进行操作,而是重新开辟新的分支,在新的分支上进行开发 调试 等操作,当项目调试通过时才会将分支项目的代码合并到主干中.
基本命令
命令 | 描述 |
---|---|
git checkout branch(分支名) | 切换到指定分支 |
git checkout -b new_branch(新分支名) | 新建分支并切换到新建分支 |
git branch -d branch(分支名) | 删除指定分支 |
git branch | 查看所有分支, 并且*号标记当前所在分支 |
git merge branch(分支名) | 合并分支(在主干上合并分支) |
git branch -m|-M oldbranch newbranch (旧分支名 新分支名) | 重命名分支,如果newbranch名字分支已经存在, 则需要使用-M强制重命名,否则,使用-m进行重命名。 |
分支本地操作
新建分支并切换到分支–修改分支内容–添加并且提交到Git仓库—切换到主分支—合并分支–删除分支
分支的远程操作
命令 | 描述 |
---|---|
git branch -a | 查看本地与远程分支 |
git push origin branch_name(分支名) | 推送本地分支到远程 |
git push origin :remote_branch(要删除的分支名) | 删除远程分支(本地分支还在保留) |
git checkout -b local_branch origin/remote_branch | 拉取远程指定分支并在本地创建分支 |
在本地创建一个分支(checkout -b)—修改内容–提交到git仓库—(合并分支)—推送到远程(push)—删除远程分支
(注意:推送和删除之间,命令只差一个冒号)
在页面上也可以直接添加分支
删除本地分支:切换到主分支–删除(branch -d) 如果没有合并,则需要**-D**来删除
拉取远程分支:git checkout -b 本地分支 远程分支
远程分支可以通过git branch -a 查看,如果没有显示,可以使用git fetch 获取远程仓库的最新状态
冲突的出现与解决
本地分支操作冲突
主干内容和分支内容同一行不同,在合并时发生冲突
Auto-merging git001.txt
CONFLICT (content): Merge conflict in git001.txt
Automatic merge failed; fix conflicts and then commit the result.
可以使用cat 文件名 来查看冲突的内容
$ cat git001.txt
git的初始化
<<<<<<< HEAD
主干操作
=======
分支操作test1
>>>>>>> leaf01
如何解决需要看业务,可以以分支为准,也可以以主干为准,也可以手动合并
自己改下项目内容,重新提交
然后就可以通过日志看下 $ git log --pretty=oneline --graph
多人协同操作冲突
远程仓库的内容和本地仓库推送(git push)的不一样
解决:先拉取远程仓库的 git pull (因为和本地的不一样,拉取的和本地的自动和并冲突)
使用 cat 项目名,之后按实际需求修改,在提交推送
标签管理
也就是版本的管理
命令 | 描述 |
---|---|
git tag tag_name | 新建标签 默认为HEAD |
git tag -a tag_name -m ‘xxx’ | 添加标签并指定标签描述信息 |
git tag | 查看所有标签 |
git tag -d tag_name | 删除一个本地标签 |
git push origin tag_name | 推送本地标签到远程 |
git push origin --tags | 推送全部未推送过的本地标签到远程 |
git push origin :refs/tags/tag_name | 删除一个远程标签 |
git tag v1.0—git tag -a v1.1 -m ‘描述信息’ ------git push origin v1.0 (推送) |git push origin --tags
进入自己的远程仓库,点击右侧的releases----tags (当不写版本的描述信息时,以注释信息为准)
git push origin :refs/tags/v1.1 删除远程,本地没有删
git tag -d v1.1 删除本地
idea下Git的基本操作
idea集成Git基本操作
打开idea中的设置–version control中的Git–把地址改成git的安装地址(git.exe)–设置GitHub(下面的框选上)
克隆远程仓库到本地:idea的上面有个vcs–checkout from version control --Git—输入下载的地址
File --new —project from vc —Git–地址
推送到远程仓库:新建一个项目—一个类—VCS|右上角|项目名右键----Git----add,commit–remotes–push
git remotes 绑定远程仓库 把地址粘贴进去
相当于git remote add origin git@github.com:corona-sgj/git-demo.git
idea下Git分支操作
可以在idea的左下角(Terminal命令),右下角(master),上方的vcs,项目名右键git的repository
可以点击右下角的master,有个new branch 新建分支并切换到分支,同时这地方也有其他的一些操作
提交分支到远程:先切换到分支(右下角checkout),在在vcs中提交(可以直接点提交的)—push
远程分支的删除:右下角(origin/分支名–dev)
合并:切换到主干,在合并(右下角merge)
log:在左下角可以查看
关键字和我们之前写Git命令时基本一致的
idea下冲突的出现以及解决
本地分支冲突时会跳出弹窗(conflicts),可以选择以哪个为准,也可以手动合并(可以移动|删除)–apply–push.
远程冲突:会弹窗拒绝推送—点弹窗的marge(会先拉取远程最新的状态)–之后处理和上面的一样–push
注:commit写注释的地方,有个小箭头,可以选择commit and push
ignore插件的使用
.idea和.iml是本地的配置,如果上传到远程,别人下下来,可能会与自己的计算机环境不同,导致无法运行,因此,我们上传的时候,不选这几个.
因此我们可以使用ignore插件,作用是忽略一些我们不想提交的文件
File–Plugins–marketplace–搜素ignore–下载–重启idea
之后上方会有个缺少文件,我们可以点击创建一个–之后可以搜素java|idea|无—cancel
然后把.idea和.iml的放进去,就是忽略这两个文件
提交的时候.gitignore要勾选上