简介及安装
分布式的版本控制系统在服务器断网的情况下也可以进行开发(因为版本控制是在本地库进行的,本地库就是PC的磁盘)。每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
Git中可以直接使用Linux命令
工作机制
Git底层是c语言,所以版本控制用到的是指针。Git不会把目标文件复制多份,它就在一个文件上进行版本控制,在一个文件上修改,并记录每一次修改后的状态。
工作区:通过写好的代码,放在了磁盘区,不是特指编译器中的代码
临时存储(缓冲区,暂存区):通过工作区git add放到此处
本地库:通过临时存储的git commit放到此处,一旦代码提交到了本地库,随之就会生成对应的历史版本,只要项目还在这一版本上修改,此次修改操作将被永远存储。一个个版本像是千层饼,每次版本的更新都要基于前版本,所以前面版本无法单独删除。
远程库:通过本地库上传到远程库,代码托管中心是基于网络服务器的远程代码仓库
常用命令及其详解
命令名称 | 作用 |
---|---|
git config —global user.name 用户名 | 设置用户签名 |
git config —global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m “日志信息” 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset —hard 版本号 | 版本穿梭 |
设置用户签名
签名的作用是区分不同操作者身份,以此确认本次提交是谁做的
这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系
初始化本地库
通过使用命令git init
初始化之后会生成一个隐藏文件:.git
clone下来的代码库,自动生成.git文件
查看本地库状态
通过git status,首次查看与有文件提交时不一样的
首次查看
新增文件hello.txt,对其内容进行书写,之后再次查看是不一样的状态
此处的文件还是红色的,说明还没提交到缓存区,如果提交到缓存区就会变成绿色
添加,删除缓存区
通过git add 文件名,具体命令大致如下:
添加hello.txt之后,再查看当前status,则此文件已从红色转为绿色
如果要删除文件,通过rm进行删除,但是删除的只是缓存区。通过ll还可查看到存在
而且通过查看其状态的时候:git status发现为红色
再次将其添加为添加到缓存区中,再次查看status,文件又转为绿色。所以此处的删除只是删除缓冲区文件
提交本地库
通过git commit -m “日志信息” 文件名,同时形成了一个历史版本
通过其git status也可看出其不同,而且查看日志也可看出版本更新
历史版本
git reflog 查看版本信息,此处显示的精简信息,显示版本号前7位
git log 查看版本详细信息
版本穿梭
本身默认查看使用cat 的时候,是最新版本
如果要穿梭到之前的版本,则需要通过git reset —hard 版本号
其日志的版本号,简易复杂版本的号字段有些不同
之后查看cat只是显示之前的版本
查看其之前(前一个)的版本
Git 切换版本,底层其实是移动的 HEAD 指针
Git分支操作
之前的操作都是在一个分支上进行,下面进行多个分支管理。在实际生产中可以有test分支,dev分支,run分支等。在dev分支上的修改,不影响run分支上的运行。
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行(分支的底层也是指针的使用)
优点
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可
分支常用命令及详解
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支状态可以通过git branch -v
创建分支git branch 分支名
*表示当前的分支路径
切换分支git checkout 分支名
整合冲突
如果要在同一个部位修改数据,则使用git merge 分支名,新数据(分支2的数据)会直接进行覆盖旧数据(分支1的数据),达到合并分支目的。注意若要把分支2合并到分支1上,则此时要定位于分支1上。
如果是不同部位进行修改,系统无法判断哪一个数据才是真的,必须人为进行修改数据,之后再提交到缓存区,再提交到本地库(本地库不能带文件名,不然有歧义识别不出来哪一个)
使用命令git commit -m “merge ss”(不用文件名)
举例:当分支1修改a.txt的倒数第一行,分支2修改a.txt的倒数第二行,那么合并的时候就出现了这个问题
具体创建分支的原理是
当前所在的分支,其实是由 HEAD 决定的。所以创建分支的本质就是多创建一个指针
GitHub 操作
远程仓库命令
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名(之后就使用别名对远程库进行操作,也可以不用别名用仓库地址) |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
开代理后,出现443time out
取消代理
git config —global —unset http.proxy
git config —global —unset https.proxy
本地库和远程库进行关联: git remote add 别名 远程地址
推送的最小单位是分支,一次推送会把分支上所有修改的文件进行更新
拉取,把远程库已修改但本地未修改的文件拉取下来:git remote add 别名 远程地址
当pull的文件在本地库已经存在,若是同一地方修改,则要手动保存,在commit,注意此时不加文件名
clone到本地库
ssh免密登录
添加合作者,给其操作仓库的权限
跨团队合作
远程库之间的操作
注:pull request是请求拉取,让对方对自己修改的代码进行审核,然后确定是否要拉取这段代码
IDEA 集成 Git
IDEA集成GitHub
- IDEA会默认生成ignore文件
从github克隆到本地
IDEA自动add到缓冲区,下面是几个相应的操作及功能区