Git相关

git介绍

集中式的版本控制与分布式的版本控制?

集中式版本控制代表:SVN(subversion),具有单一的集中管理服务器,缺点:单点故障。
在这里插入图片描述
分布式版本控制:每台电脑的本地库+远程代码托管平台。与集中式最大的区别是有本地库,可以进行本地版本控制,就算远程托管挂了,也有本地的可以维持。
在这里插入图片描述

git原理

工作区:代码存放的磁盘文件
暂存区:stage,在git文件夹的隐藏文件,有历史版本
本地库:repository,在git文件夹的隐藏文件,有历史版本
远程库
Git分支模型(master/hotfix/develop/feature/release)

git命令

输入命令时,可以双击Tab键补全!!
命令行中复制:ctrl+insert 粘贴:shift+insert

此外,git bash中的命令与linux是通用的,如查看文件等。

(1)初始化本地库:
在代码项目文件中:git init 或 git clone xxxx
得到.git文件,默认隐藏的:
在这里插入图片描述
里面的文件:
在这里插入图片描述
(2)查看本地库状态:
git status:(此时工作目录为空的)
【该命令可以查出当前分支文件变更状态,

可以查出 工作区/暂存区/仓储区 中的状态,

显示出, 新增/删除/(路径)重命名/已暂存 等文件状态.】
在这里插入图片描述
如果添加一个文件,这里通过vim简单添加一个first.java文件,再使用git status查看状态:
在这里插入图片描述
可以看到,first.java文件为untracked files,只存在于工作区,未被追踪。可通过git add将其添加到暂存区等。

接着git add first.java 进行暂存区添加:
在这里插入图片描述
出现了状态changes to be committed(可以根据提示git rm --cached first.java进行该文件在stage区的删除【但是工作区的first.java不会被删除】)。
常见提示:
参考自:

这里是引用git 利用好git status的提示信息
1、Changes not staged for commit:
在这里插入图片描述
2、untracked files:
在这里插入图片描述
3、Changes to be committed
4、Unmerged paths
具体见参考。
**

(3)提交本地库:git commit -m “xxx” first.java
使用命令行commit之前必须先add才能commit;之前使用idea集成的git,图像化界面忽视了这个。

提交本地库时必须带message信息,可以直接在命令行的-m中添加。
也可以在commit后添加,如下:在这里插入图片描述
(4)log和reflog
git log 是线上和本地的提交记录,
git reflog(reference log参考日志的缩写)是本地的操作记录,除了提交还有删除/merge等记录,一般用于获取回滚的commitid。
(5)Head的概念
HEAD 是一个特别的指针。在 git 中,它是一个指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名。在这里插入图片描述
图中,指针指向了master分支的第三个版本(change first file这个提交)
(6)版本的穿梭
git reset --hard 某次commit的版本号
如:
在这里插入图片描述
此时指针指向的提交版本为4d7a15d;
在这里插入图片描述
此时指针指向了df7ce0f的版本
(7)分支查看与切换
git branch:查看所有分支
git branch xxxx:创建xxxx分支
在这里插入图片描述
创建完后,指针指向master分支了。使用checkout进行分支切换:
git checkout hotfix
在这里插入图片描述
在这里插入图片描述
(8)分支合并
如果要把hotfix分支的修改合并到master分支中,首先要checkout到master分支上进行操作,使用命令git merge hotfix
在这里插入图片描述
在这里插入图片描述
在切换时候,原理如上图,HEAD指针会指向master或hotfix,master/hotfix指针会指向不同的commit。

此外,如果将一个分支的所有代码合并到另外一个分支,可以用merge,但是如果只合并某个提交,则使用cherry-pick命令。
git cherry-pick

(9)分支冲突
在这里插入图片描述以上图为例,<<<<HEAD与多个等号之间是当前分支(master)的代码,而等号与>>>>>hotfix之间为要合并的分支的代码。手动合并
(10)本地代码推送至远程库
git push <远程主机名> <本地分支名>:<远程分支名>
Git push的常见用法
(11)拉取远程分支
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
git pull =git fetch+git merge

【fetch :从远程拉取最新的版本到本地仓库,但是不会自动merge】

git pull <远程主机名> <远程分支名>:<本地分支名>

git集成到idea

文件颜色:
绿色:被添加到了stage区
红色:在工作区,未被追踪
蓝色:被追踪过,但是修改了

=======
下图为log,一个点代表一个状态,下图的意思:绿色线为master分支,在hot-fix commit1处,建立了hot-fix分支,并对master分别进行了修改,在master上的修改得到了master commit2,在hot-fix上的修改得到了hot-fix commit2,最后又将hot-fix分支merge到了master上,到了两条线交叉的地方。
在这里插入图片描述
//
idea中merge时,如果冲突。则手动merge:
在这里插入图片描述
中间为result,两边分别为冲突的两个分支。

gitlab

gitlab是基于局域网的代码托管平台。
GitLab中的角色分为以下5种:Guest、Reporter、Developer、Maintainer、Owner

Maintainer能够push代码到受保护分支,而Developer只能创建Merge Request,这就为团队推行强制代码审查并做到有迹可循提供了技术保证。

Merge Request:
GitLab的权限管理及Merge Request


git add . :add所有文件
git checkout . :删除所有没有add到stage的文件或修改
git checkout xxx/xxx :删除某指定文件路径中的没有add到stage的文件或修改

master的提交为:a–b–c;
dev拉取master,并在其上继续开发:a–b–c–d–e;
master也继续:a–b–c–x—y;
在dev分支上,git rebase master后,dev分支为:a–b–c–x–y–d—e

git reset --soft xxxx //回退版本,并保留更改
git clean -df // 删除当前目录下没有被 track 过的文件和文件夹
git restore --staged : 将文件从暂存区撤出,但不会撤销 工作区 文件的更改

git rebase -i xxxx 进入vim界面,将某次提交的删除(drop),前缀改成d即可

git reset HEAD 将所有此次修改的 file 退回到工作区(如add的全部文件都会撤销)


git库所在的文件夹中的文件大致有4种状态:
在这里插入图片描述

Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.【一般为新建的 没有add的文件】

Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified。


在dev分支进行开发并修改了很多代码,此时master分支的代码在线上发生故障,需要切换到master去处理,此时如果直接checkout到master分支,则会把dev分支上修改的代码提过去。此时可以:

git stash           //将dev分支的代码暂存
git checkout master //切换到master
......              //在master上进行处理
git checkout dev
git stash pop       //弹出暂存的代码

合并最新的多个提交,除了用git rebase -i之外,还可以直接:

git reset --soft xxxx
git add .
git commit 

将本地的master分支强制被远程覆盖:

git fetch --all   //获取远程仓库的新的commitId,在本地记录下来
git reset --hard origin/master
git pull

本地master分支重置为本地develop分支:

git reset --hard develop

如果分支dev 在pull的时候遇到冲突,终极办法是在当前dev分支,checkout -b新建本地分支temp;然后checkout到dev,再fetch --all ----> reset --hard —>pull ,最后在dev上 cherrypick temp上原来分支的冲突的那个commit即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值