git入门进阶高级

2020/08/22

1、git与svn

  • Svn 是集中式版本控制,所有版本都依赖这个中心点,不支持离线工作

  • Git 是分布式版本控制,都是由用户自己的电脑完成控制,目的去中心化,然后自己的版本提交到远程仓库,协同开发,拉取远程仓库版本到本地,保持版本一致。

    git的缺点是:

    1、保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码,权限控制不友好,如果需要对开发者限制各种权限建议使用svn.

2、git的协作开发流程

创建到提交

# 创建本地仓库
git init

# 查看文件状态:红色表示文件还没添加到暂存区,绿色表示文件已经放入暂存区
git status 
# 添加到暂存区
git add 文件
git add .  # 提交所有的文件到暂存区
git rm --cached good.txt # 从暂存区拉回到工作区
# 从暂存区添加文件到本地仓库
git commit -m '注释xxxxx'

整个工程是不可逆的: 一定工作区 -> 暂存区-> 版本区(本地仓库)

# log查看版本
git log --pretty=oneline
# 以一行的方式显示git log记录
git log --oneline
# 查看最后面的两个日志记录
git log -n number
# 以树状的方式展示最后两次的提交
git log --graph -n 2

版本撤回

第一种方式:指定版本号撤回

git log --oneline # 查看版本号
git reset --hard 版本号

git当前版本已经移动到上一版本

第二种方式:HEAD指针偏移往前版本移动

git reset --hard HEAD^  # 往前移动一个版本
git reset --hard HEAD^^  # 往前移动两个版本
git reset --hard HEAD~3 # 往前移动3个版本,使用波浪线简写

移动错了,现在我想往新的版本移动,如何操作

git log --oneline --reflog # 查看所有的版本

发现在当前master后面还有4个版本,这时候,我们可以指定版本撤回

git reset --hard 1b1257d

windows凭据

点进去删除你的gitee凭据

3、忽略不需要提交的文件

一般maven项目,除了src和pom.xml文件,其他文件都不需要提交

第一种方式使用TortoiseGit小乌龟忽略

选择你需要忽略的文件,右键如下操作

它是以追加文件的方式将忽略文件放到.gitignore文件的

第二种方式vim 创建

与.git同目录

4、协同开发

远程仓库:

  • 国外github

  • 国内gitee

    创建仓库后

    # 1、设置全局签名
    git config --global user.name "xieer"
    git config --global user.email "dxxx@163.com"
    # 2、添加本地仓库和远程仓库的关联-https连接
    git remote add origin https://gitee.com/jacobmj/aikomj.github.io.git
    # 删除之前关联的
    git remote rm origin
    # 修改远程关联的仓库
    git remote set-url origin https://gitee.com/jacobmj/aikomj.github.io.git
    # 首次提交代码需要填写gitee的登录账号密码
    
  • 自己服务器搭建gitlab

创建版本库设置签名

设置用户名和密码,注意和远程仓库的登录账号和密码没有任何关系,设置签名只是为了区分不同开发人员的身份,

查看提交代码的开发人员的身份

有两种方式:

第一种:项目级别的签名,仅在当前本地库有效

# 在项目根目录下执行
git config user.name "xiaoer"
git config user.email "xxxxx@163.com"

# 查看局部签名信息
.git/config
[user]
 name = xiaoer
 email = xxxx@163.com

优先级高于全局签名

发现config已关联了远程仓库

第二种:系统级别签名(全局),登录当前系统的用户都有效

git config --global user.name "xiaoer"
git config --global user.email "xxxxx@163.com"

全局签名的信息放在系统盘的/用户目录/用户名目录/.gitconfig文件中,如我下面的mac用户名下

提交文件到远程仓库

git push origin master
# 首次提交代码需要填写gitee的登录账号密码,windows环境下git会把你的远程仓库的登录账号密码存储到凭据管理中

如果gitee上的账号密码修改了,凭据一定要删除重新输入

克隆远程仓库

git clone https://gitee.com/jacobmj/aikomj.github.io.git
  • 它会自动创建本地仓库
  • 它会自动与远程仓库进行关联
  • 已经与远程仓库同步,只执行一次

ssh协议免密操作

避免https连接方式的频繁输入登录用户和密码,使用ssh连接方式

1、打开命令工具“git bash here”输入命令“ssh-keygen -t rsa” 生成密钥(放在本地)和公钥(放在远程仓库gitee),

ssh-keygen -t rsa

原理:密钥放在本地,公钥放到远程仓库gitee,后续每次的提交都会携带密钥到远程仓库比较,比较一致就push成功

2、打开公钥的内容复制出来

3、登录gitee码云,把公钥地址复制到SSH公钥

4、修改项目根目录下的.git/config,把远程仓库的关联地址修改为ssh连接

git remote set-url origin git@gitee.com:jacobmj/aikomj.github.io.git

5、ssh测试

git push origin master

git pull origin master

都不用输入账号密码了

邀约团队人员

如果别的账号把自己的代码clone下来,想push代码到分支master,如果该账号还不是团队协作开发中的一员,他是没有权限push代码的

你可以clone,但要经我的同意才可以修改我的代码

邀约开发人员(gitee码云)

1、点击管理

2、邀请用户

3、使用邮箱或者手机邀请用户

4、被邀请人收到站内信,点击同意

点击接受

5、邀请成功,查看开发者

开发者重新push代码,就有权限啦

5、git分支管理

重点

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

分支相当于版本的隔离

解决方案:使用分支,合并分支

实际企业开发都使用分支,主干分支是master

1) 创建分支

git branch dev # 创建分支dev
git checkout dev # 选中当前分支为dev

# 使用复合命令
git checkout -b dev # 创建分支dev并选中当前分支为dev

2) 查看分支

git branch
* master

3) 添加文件,提交文件到当前分支

vim test.txt
git add .
git commit -m 'e.txt'

4) 推送分支到远程仓库

git push origin dev

就会在远程仓库多一个dev分支,相当于在当前版本的master复制一份出来,并在此版本上修改代码

注意是推送到dev分支

5) 合并分支

git checkout master # 先切回master分支
git merge dev # 将dev下面的的内容全部合并到master
# 提交到master分支
git push origin master

实际开发中,每个开发人员都可能开一个分支,并在自己的分支上模块开发,最后都合并到master,构成完整的项目。

在实际代码管理,一般会分测试环境、预览环境、正式环境,个人开发分支一般基于项目分支或者迭代版本分支基础上新开出来的分支进行开发,管理如下图:

分支命名参考

6、idea操作git

提交代码到远程仓库

让idea提交代码到远程仓库,步骤

  • 创建maven工程

    项目版本控制,相当于执行git init 命令初始本地 仓库

  • 提交代码到本地仓库

  • 设计忽略文件.gitignore在当前项目

    先安装idea的ignore插件,重启idea

    项目右键新建.gitignore文件

  • 提交忽略文件到本地仓库

  • 推送代码到远程仓库

    项目关联远程仓库,同时这里也可以修改远程仓库地址

    push

  • 拉取远程仓库代码到本地仓库

  • 修改远程仓库地址

项目克隆和pull

分支的创建和合并

创建

idea打开项目,在右下角,看到当前项目的HEAD主分支是master,选择创建分支

Checkout branch 表示当前本地仓库代码的分支是1.0,提交代码也会提交到1.0这个分支上

将本地仓库1.0的分支提交到远程仓库的1.0分支

这样master分支的代码与1.0分支的代码就完全的隔离了,当来了新的业务是不是可以考虑用新的分支去做了,如果搭一个基础的项目框架可以考虑使用分支保存,用分支也是一种解决开发冲突的方案。

合并

1、先check out 切回master分支

项目右下角,可以看到当前代码的分支上1.0,我们选择master-> check out

2、合并1.0分支的代码

可以看到当前代码的分支已切回到master,选择1.0 -> merge into current

版本撤回

HEAD^ 是还原到上一个版本,HEAD^^ 是还原到上上一个版本。 Reset Type 有三种:

  • mixed 默认方式,只保留源码,回退commit和index信息
  • soft 回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit
  • hard 彻底回退,本地源码也会变成上一个版本内容

文件冲突的解决方案

双击冲突文件,处理冲突。

找来项目负责人和其他小伙伴,协商以谁的代码为准

查找本地仓库的代码历史,有效时间为12个小时,超出时间范围的代码历史会被丢弃,通过这种方式找回被覆盖的代码

代码暂存之git stash

编号 100 的需求完成之后,现在我们又接到一个新的需求,正在 dev-101 分支进行开发,开发还未完成。

突然线上出现 bug,需要我们紧急进行修改,于是我们要基于最新的 master 分支新建一个 bug 分支 bug-12,需要先切换到 master 分支,但是当前分支的代码没有commit, 如果直接切换到 master 分支的话,dev-101 分支上的新增代码就会跑到 master 分支,而代码又不能此时 commit ,于是就轮到 stash 出场了。

Stash 会保存当前工作进度,会把暂存区和工作区的改动保存起来。

添加备注,选择 CREATE STASH。你会发现当前工作区内的代码被恢复成了原样。

此刻切换到 master 分支,并创建 bug-12 分支进行修复 bug,修复完成后合并到 master 分支并 push 到远程仓库

代码暂存还原

将 bug-12 与 master 合并完成之后,现在要接着写 dev-101 需求代码,首先先切换到 dev-101 分支;但是之前的代码已经被我们放到了 git 的 stash 当中,我们现在要把代码还原到工作区当中。选择 Unstash Changes

选择之前保存的,同时勾选 Pop stash(还原完成后,会自动删除这个 stash),确定后,工作区之前写的代码就又回来了。

Stash 利用好了,就可以自如切换分支,面对突如其来的需求也不必烦恼了~

7、gitlab仓库的搭建

docker方式安装gitlab

参考我的这篇博客gitlab+jenkins自动化部署

rpm方式安装

成员管理

创建分组

可以把项目放到组下

删除项目仓库

进入项目后,左边菜单栏settings->general->Adance->remove project

Post Directory