Table of Contents
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
作用:区分不同开发人员的身份;辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系;
5:修改后的文件可以直接添加(add)或提交(commit);
2.3:提交对象及其父对象形成的链条(git用各历史版本行成链条进行管理)
3: 在本地git库中创建远程库别名(可选,主要是嫌远程名字太长)
8:解决冲突;(提交时必须先拉下来,解决了冲突后,然后再提交)
10:SSH登录(目的是为了不输入用户名密码就可以将本地库的文件push到远程库);
一:下载;
二:安装;
双击安装,基本操作都是下一步,重点的会进行说明;
保持默认就好;
推荐使用vim编译器,也还是默认就好;主要是使用vim编译器可以和我们linux保持一致;
这个说明一下,这个选择第一个就好。不更换电脑环境变量;
这一步也说明一下,现在选择以后本地库和远程库的链接方式;建议选择第一个,第二个用windows自带的通道太局限;
这一虽然字多,但是没啥用;也解释一下。就是用windows和linux的环境不同,所以改变一下换行符;
使用终端的方式;
安装就完事了;
三:git的工作结构;
四:GIT命令行操作;
1:本地库初始化1;
命令:git init
效果:初始化仓库,然后
git remote add origin https://github.com/canggao/test.git,就和远程仓库有了关联,就可以提交修改push了。
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡
乱修改。
1:本地库初始化2;
git clone https://github.com/canggao/test.git也可以初始化仓库,自动产生关联
2:设置签名;
形式:用户名和邮箱
作用:区分不同开发人员的身份;
辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系;
命令:项目级别/仓库级别:仅在本地库有效;
git config user.name tom_pro
git config user.email [email protected]
信息保存位置:./.git/config 文件
命令系统用户级别:登录当前操作系统的用户范围
git config --global user.name tom_glb
git config --global [email protected]
信息保存位置:~/.gitconfig 文件(当前用户的根目录下的.gitconfig文件下)
级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别
的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
3:基本操作;
1:状态查看;
git status
查看工作区,暂存区状态;
2:添加;
git add [file name]
将工作区的“新建/修改”添加到暂存区
3:提交
git commit -m "commit message" [file name]
将暂存区的内容提交到本地库
4:暂存区文件撤回
git rm --cached [file name]
5:修改后的文件可以直接添加(add)或提交(commit);
6:查看历史记录;
git log(完整日志)
多屏显示:
空格向下翻页
b向上翻页
q退出
git log --pretty=oneline(每条记录只显示一行)
git log --oneline
git reflog(显示到某一个版本需要几步)
7:当前版本的前进和后退
基于索引值操作【推荐】
git reset --hard 【局部索引值】
如:git reset --hard 5c16f08
使用^符号:只能后退
git reset --hard HEAD^
注:一个^表示后退一步,n 个表示后退 n 步
使用~符号:只能后退
git reset --hard HEAD~n
注:表示后退 n 步
8:reset三个参数对比;
--soft 参数
仅仅在本地库移动 HEAD 指针(所以暂存区内有未提交的文件)
--mixed参数
在本地库移动 HEAD 指针
重置暂存区(所以工作区内有未添加的文件)
--hard参数
在本地库移动 HEAD 指针
重置暂存区
重置工作区
9:删除文件;
先工作区内删除;
rm aaa.txt
再将这种提交状态放进缓存区;
git add aaa.txt
再将这种删除的状态放进本地库
git commit -m "说明" aaa.txt
10:删除文件找回;
前提:删除前,文件存在时的状态提交到了本地库。
操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD(HEAD代表当前记录,因为还没commit,所以记录中没有新的删除记录)
11:比较文件差异;
git diff [文件名]
将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件
五:分支操作;
1:分支的概念;
在版本控制过程中,使用多条线同时推进多个任务
2:分支的好处;
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任
何影响。失败的分支删除重新开始即可。
3:分支操作;
创建分支:
git branch [分支名]
查看分支;
git branch -v
切换分支;
git checkout [分支名]
注:本地上切换分支后改文件下只会显示该分支的内容,但是没有add的文件都会存在!
合并分支;
第一步:切换到接受修改的分支(被合并,将要增加新内容的分支)上
git checkout [被合并分支名]
第二步:执行 merge 命令
git merge [有新内容分支名]
解决合并冲突;
当合并后冲突显示:
进入文件冲突展示:
冲突的解决:
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
查看文件状态:
第三步:git add [文件名]
第四步:git commit -m "日志信息"
注意:此时 commit 一定不能带具体文件名
项目使用中分支问题:
1:有代码了,需要向git上转移
先在gitlab上创建仓库,
在本地文件夹上git clone xxx
添加文件,然后add,commit ,push
2:本地创建新的分支,想要push到远程
本地创建develop分支
远程创建develop分支
本地切换分支,先git pull origin develop
将develop分支文件进行增删改,然后add,commit
最后 git push origin develop
忽略push时候的代码
在文件目录下新建一个.gitignore的文件,该文件用于声明忽略规则,规则对当前目录及其子目录生效
注:该文件没有文件名,所以可以用git bash来touch创建
1:/mtk/ 过滤整个文件夹
2:*.zip 过滤所有的。zip的文件
3:/mtk/do.c 过滤指定文件
4:!index.html 不过滤某个文件
六:GIT的管理机制概念;
1:哈希;
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下
几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
哈希算法可以被用来验证文件。原理如下图所示:
2:git保存版本机制;
2.1:集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本
文件和每个文件随时间逐步累积的差异。
2.2 Git 的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前
的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,
Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的
工作方式可以称之为快照流。
2.3:提交对象及其父对象形成的链条(git用各历史版本行成链条进行管理)
3:分支管理概念;(利用指针指向不同地址来进行管理)
切换分支;
七:本地git和远程gitHub链接操作;
1:创建本地库;
1.1:创建文件;
1.2:git init
1.3:设置签名(上边都有,就不说了)
2:创建远程库(两个不一定必须同名,同名是为了方便)
我的另一篇博客中也有,就不说了;
3: 在本地git库中创建远程库别名(可选,主要是嫌远程名字太长)
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
4:本地库推送到远程库(push)
git push [别名] [分支名]
5:克隆(直接clone地址,该地址可以是别人的)
git clone 远程地址
效果
完整的把远程库下载到本地
创建 origin 远程地址别名
初始化本地库
6:团队成员要求,受邀请的人可以直接向该远程库推送代码;
“岳不群”其他方式把邀请链接发送给“令狐冲”,“令狐冲”登录自己的 GitHub
账号,访问邀请链接。
7:拉取(从远程库拉取文件到本地库);
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
或者直接使用pull
git pull [远程库地址别名] [远程分支名]
8:解决冲突;(提交时必须先拉下来,解决了冲突后,然后再提交)
要点
如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉
取。
拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
类比
债权人:老王
债务人:小刘
老王说:10 天后归还。小刘接受,双方达成一致。
老王媳妇说:5 天后归还。小刘不能接受。老王媳妇需要找老王确认后再
执行。
9:跨团队合作(fork)
fork
本地修改,然后推送到远程
Pull request
然后被fork的人打开自己的项目,然后打开;
审核代码:
合并代码:
最后将远程库拉取到本地;
10:SSH登录(目的是为了不输入用户名密码就可以将本地库的文件push到远程库);
1:进入当前用户的家目录
$ cd ~
2: 删除.ssh 目录
$ rm -rvf .ssh
3: 运行命令生成.ssh 密钥目录
$ ssh-keygen -t rsa -C [email protected]
[ 注意:这里-C 这个参数是大写的 C]
4: 进入.ssh 目录查看文件列表
$ cd .ssh
$ ls -lF
5:查看 id_rsa.pub 文件内容
$ cat id_rsa.pub
6:复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG keys-> New SSH Key
7:输入复制的密钥信息
8:回到 Git bash 创建远程地址别名
git remote add origin_ssh [email protected]:atguigu2018ybuq/huashan.git
9: 推送文件进行测试
八:在开发工具中运用git(图形化工具)-Eclipse
1;工程初始化为本地仓库;
工程→右键→Team→Share Project→Git
2:Eclipse忽略文件;
概念:Eclipse 特定文件
这些都是 Eclipse 为了管理我们创建的工程而维护的文件,和开发的代码没有
直接关系。最好不要在 Git 中进行追踪,也就是把它们忽略。
.classpath 文件
.project 文件
.settings 目录下所有文件
为什么要忽略 Eclipse 特定文件呢?
同一个团队中很难保证大家使用相同的 IDE 工具,而 IDE 工具不同时,相关工
程特定文件就有可能不同。如果这些文件加入版本控制,那么开发时很可能需要为
了这些文件解决冲突。
GitHub 官网样例文件
https://github.com/github/gitignore
https://github.com/github/gitignore/blob/master/Java.gitignore
本地忽略特殊文件的操作;
编辑本地忽略配置文件,文件名任意
创建文件Java.gitignore ----(放在家目录下 C:/Users/Lenovo/Java.gitignore)
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
然后在~/.gitconfig 文件中引入上述文件
[core]
excludesfile = C:/Users/Lenovo/Java.gitignore
[ 注意:这里路径中一定要使用“ “/” ” ,不能使用“ “\ ”]
git插件读取到了本文件
3:提交到本地库;
4:将本地的库推动到远程;
首先远程库上有这个库;
点击finish
到此成功;
5:将远程库的内容克隆岛本地工程;
Import----导入工程
到远程库复制地址;
指定工程的保存位置
指定工程导入方式,这里只能用:Import as general project
转换工程类型
6:Eclipse解决冲突;
根本提交不上去,然后pull一下文件,
冲突文件→右键→Team→Merge Tool
修改完成后正常执行 add/commit 操作即可
九:在开发工具中运用git(图形化工具)-IDEA
在idea中和Eclipse中基本一样
1:创建本地程序;
2:配置GIT
3:配置GitHub(如用gitlab就忽略)
4:IDEA在本地GIT中创建仓库;(本地代码向远程推)
文件变红带边创建仓库成功;
5:添加到仓库
注意:一般只推代码有关的和
6:提交到远程仓库(push)
添加或者修改远程仓库地址;
7:远程仓库克隆到本地;
8:合并冲突;
9:idea分支管理:
9.1 创建本地分支的话,新创建的分支代码会和当前所在分支一样。
9.2:从远程库拉取分支
1:先从远程库创建分支,选定copy的代码
2:拉取远程分支
3:将远程分支对应到本地
4:修改本地代码,然后push到远端
5:从idea删除远端分支(该分支开发完成后,确定不用了)
十: Git 工作流
1:概念
在项目开发过程中使用 Git 的方式
2:分类
2.1 集中式工作流
像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有
修改都提交到 Master 这个分支上。
这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。
2.2 GitFlow 工作流
Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布
迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
2.3 Forking 工作流
Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的
功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受
不信任贡献者的提交。
3:GitFlow 工作流详解 工作流详解
3.1 分支种类 分支种类
主干分支 master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境
完全一致。
开发分支 develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
bug 修理分支 hotfix
主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修
理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
准生产分支(预发布分支) release
较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集
成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后
可以视情况删除。
功能分支 feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支
中独立出来。 开发完成后会合并到开发分支。
3.2:工作流举例说明;
3.3:在工作中具体使用git工作流;
以eclipse为例;
1:项目成员创建开发分支;
2: 项目成员在新的分支上开发并提交;
3:项目经理拉取代码,并切换分支审核代码;
4: 测试功能没问题后,合并代码;
5:切回master
6:合并分支;
7:合并结果;(有冲突解决冲突)