git(sgg和51结合)

git能力图谱

30个常用命令,熟练掌握,能处理各种复杂情况
git内部原理:一个仓库,2个引用,3个区,4个git对象
git实战:文档管理,团队协作。企业管理规范流程

git的意义

版本控制的意义:

如果没有版本控制工具,那对于同一份文件,如果想保留版本记录,那只能修改一次就生成一个副本文件。单机情况下倒也能接受,
但多人协作情况下,会出现很多问题,比如A修改了第一行,B修改了第二行,B后提交,那么B会把没修改的第一行覆盖到A修改的第一行之上。
记录修改日志

分布式版本控制的意义:

SVN有单点故障。分布式相比集中式,优势在于人人平等,svn只有server才有完整的版本库,client只会有某个版本的信息,比如一个文件,我有某个版本,但我想回退到之前版本时,只能跟server通信才行。而git则只需要单机操作即可。
网络资源永远比本地资源昂贵,虽然分布式在初始化时代价高,但这是值得的。

git的意义:

断网继续工作
快照而非差异
本地保存完整版本库,而svn的本地库只有最新版
分支管理(svn也有),切换瞬间完成
大量的开源项目迁移到了git上,便于工作学习

git的架构

架构上同svn区别

git是分布式的,相比于svn,每个节点都有版本库,至于远程库,只是不同节点进行通信的中转站而已。
如果没有网的情况下,svn是无法工作的,而git可以正常工作。git相当于单机游戏,而svn相当于网络游戏。git的单机游戏自己也可以玩,有时候想查看下秘籍或者下个别人玩的存档,才需要上网。理论上, 如果个人独立开发,是不需要联网的,联网只是为了社交、交流。
git相比svn有缓冲区、本地库的概念,对应是add命令,就像你去参加考试,没交卷之前,可以随意修改。一旦交了卷(commit),就不能再撤回了,除非再考一次。一般正式提交之前,需要有几次小提交,也就是进行更细粒度的版本管理,但add并不会生成新版本,可以理解为临时提交,起到一个轻量备份的作用。
远程库就相当于本地库的库。

代码托管中心=远程库

局域网:gitlab

操作 +原理

在这里插入图片描述

暂存区,暂存的是什么?是变化,而变化是有状态的,多个变化最终生成一个变化,所以说,暂存区就是用来存储临时变化的。等这个变化编辑完,相当于代码经过多次修改,修改完之后,再commit到版本库,此时就相当于把最终的变化生成一个版本。所以版本库是用来存版本的,而这个版本是基于变化的。
这些在日志中都可以体现,比如changes to commit。
==》
暂存区存的是一个阶段的所有变化(stage变化),而版本库存的是一个阶段的总变化(commit变化)
因为版本库中的版本依据是变化,所以前一个版本没了,后一个版本就没有依据了,所以版本库中的版本是无法删除的???

add

在这里插入图片描述
在这里插入图片描述

commit

在这里插入图片描述

在这里插入图片描述

查看日志

reflog,查看版本的简略日志,HEAD -> master是指针
log,多了作者和日期
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

版本穿梭

reset --hard 版本号或版本号缩写

在这里插入图片描述
在.git隐藏目录下,head保存的是当前分支,在refs/head下,保存的当前指针指向的版本

git记录了多个版本的变化,然后用指针指向他们其中一个,指向哪个,哪个就是当前版本。
head指针先指向master,master再指向具体版本,移动指针,实际上移动的是master下面那条线,只要不切换分支,head永远指向master。所以一个指针 = 分支 + 版本
不管是切换分支还是切换版本,都是指针变化。git有2个指针,head指向分支,分支指向版本
在这里插入图片描述

在这里插入图片描述

分支

分支的理解

分支可以理解为副本,一个文件,3个人同时要改,可以复制3份,每人改完,合并到master即可。为什么不3个人合用一个分支呢?可以避免相互影响,避免影响master生产环境,如果一个分支失败,对master无影响。
下图:blue分支改完后,因为有小bug,可以再开一个hot-fix(热修分支)去修复。这样不影响master生产环境。
在这里插入图片描述

既然是副本,那么master有的文件,分支都有,分支上的修改对master无影响,除非合并

将分支A提交到远程的分支B上,AB不同名,B竟然直接被删!!!,到github上看,B的确被删了。如果远程前面带:,会把远程分支删除
在这里插入图片描述

本地和远程分支是可以提交的,不要求名字必须一样,如果远程分支没有,还会自动建。
在这里插入图片描述

本地和远程都有分支的概念,毕竟,分支也是需要同步的。
本地和远程的分支并不完全一样,比如,远程的主分支自定义为了作者名字,clone时,为了适应自己的习惯,完全可以改为master。就像一个人,在中国叫张三,在美国叫tom。
既然本地和远程的分支名不一样,那么,就需要建立起mapping,所以在push和pull时,理论上需要指明本地分支和远程分支的关系,git中把这种关系叫跟踪,远程分支叫upstream branch。

# apple @ LTMac in ~/Documents/test_workspace_lt/UIelement on git:test o [12:27:38]
$ git push
fatal: The current branch test has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin test

git pull可以直接在本地创建分支并跟踪同名的远程分支

// 远程添加dev分支后
$ git pull
From xxx.xxx.xxx:xxxx/originRep
 * [new branch]      dev        -> origin/dev   // 本地新增的dev分支并跟踪了origin/dev分支
Already up to date.

本地分支跟踪远程分支(设置本地分支的上游分支)

git branch --set-upstream-to=origin/dev dev2  // 本地 dev2 分支关联远程dev分支。
没有跟踪远程分支的本地分支无法push到远程仓库(push 是以分支为操作单位的?),需要指明
$ git push
fatal: The current branch test has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin test

多个本地分支的上游分支可以是同一个远程分支,push的时候,如果名不同,需要显式指明

$ git branch --set-upstream-to=origin/dev dev2  // 设置本地dev2分支的上游分支为origin/dev
Branch 'dev2' set up to track remote branch 'dev' from 'origin'.

在div2分支上直接运行 git push会有如下提示:

$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:dev

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.

由于dev2与上游分支dev的名字不一样,直接运行git push,git 会使用默认的dev2名字进行push ,导致上游分支与当前分支不匹配的为,所以需要声明上游分支的名字:git push origin HEAD:dev

$ git push origin HEAD:dev
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-5.0]
To git.oschina.net:liong/UIelement.git
   38a235d..b5b93b8  HEAD -> dev

checkout一个本地没有的远程分支,本地会建一个游离态的本地分支,

此时提交会提示
在这里插入图片描述

checkout别的分支后,这个游离态分支就没了

操作

查看分支

git branch -r
git branch -l\git branch

删除远程分支

git push origin --delete upcByAsin

删除本地分支

git branch -D upcByAsin

创建本地分支git branch test

创建远程分支git push --set-upstream origin yxw_test

当前分支:
在这里插入图片描述
在这里插入图片描述

合并分支

先切到左分支,git merge 要合并的分支

在这里插入图片描述
注意:

  • 这里的合并是正常合并,对于同一块内容,只有hot-fix分支做了修改,master并没有改,相当于更新,所以没有冲突,如果master也修改了同一块内容,就会有冲突
  • 合并后的2个分支,是一模一样的

冲突

多人对同一文件的同一部分做了不同的修改,git不知道该用哪一个,就会有冲突。需要手动解决
merge操作产生冲突后,日志会提示冲突,提示符右边也会提示MERGING
在这里插入图片描述
手动解决,打开文件:
head是当前分支,hot-fix是要合并的分支,======是分隔符,HEAD上面是没冲突的部分,正常一共16行,有冲突的是2行。注意:2个分支的箭头方向不一样。
在这里插入图片描述

保存完,还要am,注意,m的时候不要带文件名,因为此时是分支合并的过程中,git已经知道是哪个文件了
注意:在分支merge的过程中手动处理冲突,处理完的变化只对当前分支有效,也就是说,修改后的内容只是在master中生效,hot-fix中还是原来的,合并后的2个分支并不一样一模一样
在这里插入图片描述

团队协作

github

  • 创建远程库
  • 给远程库设置别名
    其实是给远程库的url设置别名,设置完查看会有2个,是因为这个别名可以用在2个地方
    在这里插入图片描述
  • 推送到远程库
    注意:本地库和远程库同步,是以库为单位的,并不能指定某个文件???所以push的时候,不能指定文件,只能指定分支
git push 远程库地址或别名 远程库的分支

团队内

跨团队

找团队外的人来修改代码

在这里插入图片描述
fork、 pull request、merge
右上角有fork,fork之后,可以在github页面上在线修改,也可以pull到本地然后在本地改
在这里插入图片描述
改完,点pull request
pull request表示请求别人pull

在这里插入图片描述
然后右上角,new pull request
在这里插入图片描述
然后对方的pull request栏就有了待办提示
在这里插入图片描述
点开后,可以直接merge,如果有疑问,还可以跟对方聊天,确认后再merge
在这里插入图片描述

gitlab

局域网的代码托管中心,适合不想把项目放到互联网上的公司
官网:服务端分为CE和EE版本,要求centos7以上。

git_case

本地新建了一个分支,然后push到remote,会出现的情况

在这里插入图片描述
这是因为当前分支没有与远程分支关联,因为分支是本地建的,git不知道把这个分支推到remote的哪个分支,
解决方案:
(1)直接 git push origin test1 推向远程指定的分支,即使这个分支远程没有,也会自动创建
(2)正如上面所说关联远程分支,命令都给出来了。
在这里插入图片描述

此时远程自动创建本地的分支
在这里插入图片描述

此时把远程分支改名为test11
在这里插入图片描述
然后再执行git push,此时本地分支还是test1
在这里插入图片描述
push成功
在这里插入图片描述

冲突处理

测试场景设计

创建分支conflict1,然后基于conflict1创建conflict11。
在conflict1中创建文件,push。在conflict11中同样创建这个文件,同行不同行都改一下,push。
然后将conflict11合并到conflict1中。
在这里插入图片描述
此时并没有报错,报merge失败,而是告诉我有冲突,这说明git不认为这是一种异常情况,而是一种正常情况。
此时分支的状态改为MERGING
然后打开文件,会发现,HEAD下面的是当前的,conflict11上面的是被合并分支的。中间用===分割。

也就是说,git把不同的地方标记出来了,我需要做的,就是告诉git我想要的样子,也就是修改完,再add+commit
在这里插入图片描述
add + commit完之后,分支名后面的MERGING也没了。
相当于2个组合并,某个职位,比如java岗,出现了2个,但git不需要2选1,它可以很灵活的处理冲突,合并、全都不要、选择要,都可以。

处理完冲突,合并完分支,b分支并没有消失,还是可以用的
在这里插入图片描述

git fetch

会把远程分支拉到本地,但是,并不和本地合并
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将一个目录git init之后,用git branch -a却没有显示。理论上master分支不是缺省的吗?只有git add + commit之后,才会有master分支

将本地的目录,push要一个原来没有任何关联的远程仓库,并且跟远程仓库中一个已经存在的分支合并。

  • 将本地一个目录git init后,add + commit创建master分支
  • 将这个目录远程仓库的test1分支合并,也就是让2个分支关联,可以push 和pull
    合并提交记录,也就是合并文件,提交记录就是文件的元数据
    在这里插入图片描述
  • 此时,本地是合并后的,远程还是旧的,此时 git push origin master:test1,因为远程和本地分支名不同,所以要显式指明。
    第一个master是本地分支名,冒号后面的是远程分支名。此时去远程上看,远程的分支也更新了
  • 此时git push 和pull都能直接用,只不过因为分支名不同需要显式写明
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值