Git的使用

92 阅读12分钟

Git的使用

引用:

  1. 编程不良人
  2. Git Push操作|极客教程 (geek-docs.com)
  3. git push后出现错误 ![rejected] master -> master(non-fast-forward) - 清和时光 - 博客园 (cnblogs.com)

背景介绍

背景介绍 😍

为什么选择Git

Git是分布式的版本控制,SVN是集中式的版本控制。如果SVN的中央服务器挂掉,那整个仓库就没有了。

集中式和分布式的版本控制区别

  • 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
    中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

  • 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟,这还不得把人给憋死啊。

  • 那分布式版本控制系统与集中式版本控制系统有何不同呢? 首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
    既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢? 比方说你在自己电脑上改了文件 A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

  • 集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

  • 在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有台充当 “中央服务器” 的电脑,但这个服务器的作用仅仅是用来方便"交换"大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

Git环境搭建

调整窗口大小 😍

image.png

image.png

image.png

image.png

1. 自报家门

设置用户名
git config --global user.name "wkk"
设置邮箱
git config --global user.email "wbr@qq.com"

image.png

image.png

2. 创建一个版本库

什么是版本库 😍

版本库又名仓库,英文名 repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

把ems文件创建成版本库

image.png

git init

image.png

3. 添加文件到版本库

git add 文件名  把文件添加到版本库
git commit 文件名  把文件提交到版本库
git commit -m "版本信息  把文件提交到版本库(加-m避免出现vi界面)

image.png

image.png

退出:按esc退出编辑模式后,shift + zz 或q

修改文件内容
注意:修改文件内容后需要重新添加和提交

image.png

时光穿梭

git status  查看仓库状态
红色:文件修改 ,未添加版本库
绿色:文件添加到版本库, 未提交
nothing to commit,working tree clean:版本库没有更新的文件

仓库状态

git status image.png

image.png

image.png

查看历史记录

git log 查看git的历史记录(最近改变)

image.png

git log --pretty=oneline
每条日志都只显示一行
多屏显示控制方式 空格向下翻页 b向上翻页 q退出 image.png

版本回退

git reset --hard 版本id

image.png

git reflog  显示所有历史记录的版本号

image.png

工作区与暂存区

Git 和其他版本控制系统如 SVN 的一个不同之处就是有暂存区的概念。 工作区有一个隐藏目录 git ,这个不算工作区,而是 Git 的版本库。

Git 的版本库里存了很多东西,其中最重要的就是称为 stage (或者叫 index ) 的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。

Git为何回退迅速?(重点)

Git是C语言写的,版本回退只是移动head指针指向不同的master主干

master记录了每一次更改,指针head始终指向当前所指版本的master image.png

管理修改

为什么 Git 比其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,而非文件。

如果两次对aa.txt进行修改 image.png

image.png

只能把暂存区的修改提交到master主干,工作区已经修改没有加到暂存区的东西不能提交到主干分支

image.png

撤销修改

  1. 撤销工作区的修改  git resore -- file

image.png

  1. 撤销暂存区的修改 (已经add到暂存区)
    a. 暂存区撤回工作区  git restore --staged file
    git reset HEAD 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了 ,HEAD 可以不写,直接git reset image.png b. 撤销工作区的修改  git resore -- file

删除文件

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用 rm 命令删了:
rm aa.txt
这个时候,Git 知道你删除了文件,因此,工作区和版本库就不一致了,git status 命令会立刻告诉你哪些文件被删除了:

image.png

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit :

image.png

image.png

image.png

image.png

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git restore aa.txt  取消删除

image.png

image.png

git分支 branch

分支介绍 😍 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 Git 的时候,另一个你正在另一个平行宇宙里努力学习 SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了 Git 又学会了 SVN!

image.png

分支在实际中有什么用呢? 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

其他版本控制系统如 SVN 等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

但 Git 的分支是与众不同的,无论创建、切换和删除分支,Git 在 1 秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

在版本回退里,你已经知道,每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。
HEAD 严格来说不是指向提交,而是指向 master,master 才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master 分支是一条线,Git 用 master 指向最新的提交,再用HEAD 指向 master,就能确定当前分支,以及当前分支的提交点:

image.png

每次提交,master 分支都会向前移动一步,这样,随着你不断提交,master 分支的线也越来越长:

image.png

当我们创建新的分支,例如 dev 时,Git 新建了一个指针叫 dev,指向 master相同的提交,再把 HEAD 指向 dev,就表示当前分支在 dev 上:

image.png

你看,Git 创建一个分支很快,因为除了增加一个 dev 指针,改改 HEAD 的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变:

image.png

  1. 创建分支  git checkout -b dev

-b表示创建这个分支的同时并切换到这个分支

image.png

  1. 切换到主分支  git checkout master

image.png

注意在dev上修改不影响主分支master

  1. 合并分支  git merge dev

image.png

注意:先切换到master再合并

  1. 删除分支  git branch -d dev

image.png

删除远程分支  git push -d origin dev

  1. 查看分支 git branch

git的冲突解决与远程仓库

image.png

Git告诉我们,aa.txt文件存在冲突,必须手动解决冲突后再提交。git status也告诉我们冲突的文件: image.png

手动去增删改
image.png

远程仓库

image.png

  1. 在github 码云 注册用户名密码
  2. 创建仓库
  3. 将本地仓库push 远程仓库
    git remote add origin 地址
git remote add origin git@gitee.com:icattt/study_spring_security.git

意思是给远程仓库添加一个目标,把地址给它

image.png

  1. 将本地master分支推向远程仓库
    git push -u origin master

image.png

出错原因:一个仓库只能创建一次,这里不要勾选初始化仓库

image.png

image.png

  1. 删除原有的远程仓库地址
    git remote remove origin

image.png

  1. 把代码从远程拉取到本地 image.png

  2. Git全局设置(不用每次输入用户名):

git config --global user.name 'wbr' 
git config --global user.email 'a@qq.com'

HTTPS和SSH的区别

SSH方式可以免密登录仓库
HTTPS的地址需要输入用户名和密码,使用SSH不需要。
但是SSH需要码云或githuab平台给本机做授权。
先根据本机生成公钥和私钥,再把公钥和私钥配置到码云平台上。
ssh-keygen -t rsa -C youremail@example.com"

ssh-keygen -t rsa -C 3551508840@qq.com"

image.png

此时生成了公钥和私钥的文件 image.png

把公钥文件打开,复制粘贴到gitee

image.png

除了第一次push到远程仓库用
git push -u origin master

以后就直接用 git push

拉取远程仓库代码 git pull

先把远程代码更新下来

往远程推dev分支 git push origin dev

git远程仓库操作

  1. 本地版本库与远程版本库冲突问题
    git pull  将远程版本库改变拉到本地版本库中
    git push  提交本地版本库
    注意:如果出现冲突需要手动解决  解决之后git add  之后执行git commit

  2. 提交本地版本库的分支到远程仓库
    1). git checkout -b dev  -b表示创建这个分支的同时并切换到这个分支
    2). git add 文件名|目录名  把文件或目录添加到版本库中
    3). git commit -m "信息" 把文件提交到版本库(加-m避免出现vi界面)
    4). git push origin dev 往远程推dev分支
    5). git checkout master 切换到master
    6). git merge dev 合并dev中内容 到master
    7). git branch -d dev 删除本地分支
    8). git push -d origin dev 删除远程分支

git中实战

git 添加版本库

  1. git  上传项目
    注意: git  上传的java项目
    .idea
    .iml
    target .settings
    .classpath
    .project

  2. 下载 .ignore插件

image.png

image.png

image.png

image.png

git init 创建版本库 image.png

上传项目到git远程仓库

每一个仓库都有唯一的远程地址
a. 新建仓库 image.png

b. 版本库设置git远程仓库地址
git remote add origin git@gitee.com:xxxx/wbrgit_parent.git

image.png

git add . 将当前项目所有内容添加到暂存区

git commit -m "this is init project" 把文件提交到版本库(加-m避免出现vi界面)

git reset 版本回退

image.png

image.png

  1. 上传项目到远程仓库
    git push -u origin master 拿本地库中的主干分支去更新远程仓库

从远程仓库拉取

  1. git clone  将远程版本库克隆到本地
    克隆相比下载最大的好处是,克隆保留了项目原始的版本控制

image.png

  1. 打开idea工具

注意:推送java代码以前,一定要 git pull

git与idea集成 (不推荐这种方式,慢)

image.png

装完gitbash后git就默认集成在idea中了 image.png

image.png

image.png

image.png

image.png

把idea终端调成git终端

image.png

注意:修改完后必须重启idea

练习:

image.png

image.png

image.png

image.png

注意:不要忘了加.gitignore哦

删除原有的远程仓库地址image.png

(此处报错上文中有解决方法,在gitee新建新的未初始化仓库) 每个版本库只有唯一的远程仓库。

还可以git pull --rebase origin master,将远程仓库中的更新合并到本地仓库,rebase的作用是取消掉本地仓库中刚刚的commit

image.png

image.png

本地和远程仓库不一样了 image.png

git一般公司的使用流程_公司的代码提交到那个工具里-CSDN博客