GIT教程

            GIT教程

                                    原创者:文思

一、Git基础

1、认识GIT

有了SVN为何还用GIT?

SVN增量式管理,GIT采取了文件系统快照的方式

SVN集中式管理,GIT分布式管理

其他优势:

大部分操作在本地不需要联网,只有pull和push时需要

尽可能添加数据还不是修改或删除数据

分支操作快捷(指针)

与Linux命令全面兼容

2、安装GIT

非windows环境安装:

https://git-scm.com/download/win

依次输入:./config,make,sudo make install

windows环境安装: Windows下要使用很多Linux/Unix的工具时,需要Cygwin这样的模拟环境,Git也一样。Cygwin的安装和配置都比较复杂。

msysgit,模拟环境和Git都打包好了,只需要下载一个单独的exe安装程序。msysgit是Windows版的Git。

https://git-for-windows.github.io原始下载,因中国国情:

http://www.oschina.net/p/git/http://www.oschina.net/p/msysgit下载。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功! 安装完成后,还需要最后一步设置,在命令行输入:

$ git config--global user.name "Your Name" $ git config --global user.email"email@example.com"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址

3、GIT结构

工作区(写代码的地方)—git addà暂存区(临时存储)—git commità本地库(历史版本)

实际使用中很多人喜欢直接commit到本地库,这或许是从svn沿袭来的习惯。

工作区:版本库(.git) = .svn

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。SVN是没有暂存区的。

文件往Git版本库里添加的时候,是分两步执行的:

第一步用git add把文件添加进去,实际上就是把文件修改添加到暂存区。

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

创建Git版本库时,Git自动为我们创建了唯一一个master分支,git commit就是往master分支上提交更改。add需要提交的文件修改通通放到暂存区,然后commit可一次性提交暂存区的所有修改

4、Git和代码托管中心:

局域网-GitLab服务器

外网-GitHub、码云

本地库与远程库协作方式:团队内部协作、跨团队协作

团队内部协作
跨团队协作

5、Git命令行操作

1)本地库初始化

git add

2)设置签名

用户名,email地址

作用:区分开发人员身份

这里设置的签名和登录远程库的账号、密码没有关系

命令:

项目级别/仓库级别:仅在当前本地库范围内有效

git config user.name tom_pro

git config user.email good_pro@126.com

信息保存位置:

系统用户界别:登录当前操作系统的用户范围

git config –globaluser.name tom_glb

git config –globalgood_pro@126.com

项目级别优先于用户级别

3)常用git命令

git stauts,显示工作目录和暂存区的状态:

上面绿色的文件代表在暂存区,未提交到本地库。

新建文件后git status查看:

上面红色文件代表在工作区未提交到暂存区。

git add 文件名,提交文件到暂存区:

以上文件已到暂存区,git rm - -cache 文件名, 代表从暂存区撤销文件Changes to be committed:(use “git reset

HEAD<file>…” to unstage):

git add再次提交testGit.txt到暂存区,后进行git commit提交:

git commit 文件名,提交文件到暂存区:

git commit testGit.txt

输入提交的日志信息后:

至此文件已到本地库。修改文件再次提交看看信息是什么

git status看一下:

git add然后git commit即可。大家想下两步操作麻烦吗,回想一下maven命令的声明周期原理,如果我们直接commit呢?看看

直接提交完成,commit包含了add操作。即commit命令对应着eclipse中的commit选项。

查看历史记录操作:git log

想让日志优美一点:git log –pretty=oneline或git log –oneline

reflog 可看到移动到当前版本需要的步数

Head代表指针,指向的是每一个历史记录。

git reset --hard版本切换3种方式:

使用索引值草最(推荐)、使用^符号(只能往后退)、使用~符号(后退)

使用索引值草最(推荐):

可以看到3bc406c已经回退到当前最近版本。再恢复:

可以看到又恢复了。

使用^符号:

使用~符号:

reset命令的三个参数对比:soft、hard、mixed

soft仅仅在本地库移动指针

mixed本地库移动指针并重置暂存区

hard在本地库移动指针,重置暂存区并重置工作区

git中对文件的删除操作也相当于修改,示例:文件删除并找回,创建文件并提交到本地库:

删除后并且再进行提交:

git reflog可以看到:

本地库里都有记录,包括删除的记录都存在,即可找回已删除文件。找回:

git diff,比较文件差异:

Git diff [文件名]将工作区中的文件和暂存区进行比较

Git diff [本地库历史版本] [文件名]将工作区中的文件和本地库历史记录比较。

例如:Git diff [文件名]将工作区中的文件和暂存区进行比较

提交后暂存区没有了,则无法比较了。

Git diff [本地库历史版本] [文件名]将工作区中的文件和本地库历史记录比较,使用本地库历史版本号比较:

分支

Branch命令,查看、创建分支

git branch –v查看分支

git branch [分支名]创建分支

git checkout[分支名]切换分支:

合并分支示例:先修改dev分支文件:

将修改后的dev分支的文件合并到master:

1、当前分支必须是master(站在接受修改的分支上,即切换为master分支)

2、执行merge命令

可以看到已经进行完成分支合并:

冲突解决:多个分支对同一个文件的同一个位置且内容不一致就会产生冲突。比如在master分支中修改testGit文件的最后一行,改为this is modify from;修改dev分支此文件最后一行为this is modify from dev!!!!!!

git chekout master 后 git merge master

看到合并成功且有冲突:

怎么解决就不用再说了。修改后冲突后看看暂存区是什么状态:

git add后再提交:

提交失败,回想一下eclipse中的操作,是不是先标记为“已解决”,这里应该有对应命令还是怎样?直接commit不写文件名:

貌似成功了,所以这时候commit提交一定不能带文件名。

6、Git的基本原理:

哈希,哈希是一个一系列的加密算法。不同的哈希算法有以下共同点:

1)不管输入的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。

2)哈希算法确定,输入数据确定,输出数据能够保证不变。

3)哈希算法不可逆

所以哈希算法可以用来验证文件。

Git底层采用的是SHA-1算法。

保存版本的机制

传统集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本,文件和每个文件随时间逐步累积的差:

Git 把数据看作是小型文件系统的一组快照。每次提交更新时Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的工作方式可以称之为快照流:

提交对象及其父对象形成的链条:

分支创建指针原理:

分支切换原理:

看出指针(HEAD)在git中的应用。

7、仓库

创建远程库,以使用github为例

推送本地库到远程库:git push 地址(别名) 分支

远程库clone到本地:git clone 地址

拉取:git pull 地址(别名) 分支,或者git

fetch 地址(别名) 分支

Pull = fetch +merge

8、SSH免密登陆

每个仓库有两种地址,一种https一种是SSH。

1)进入当前用户的根目录,删除以前创建的.ssh目录并生成一个新目录

2)运行命令生成.ssh 密钥目录

$ ssh-keygen -t rsa -C good_pro@126.com

[注意:这里-C 这个参数是大写的C]

进入.ssh 目录查看文件列表($ cd .ssh,$ ls –lF)

查看id_rsa.pub 文件内容($ cat id_rsa.pub)

3)复制id_rsa.pub 文件内容,登录GitHub,点击用户头像→Settings→SSH andGPG keys

4)New SSH Key

5)输入复制的密钥信息

6)回到Git bash 创建远程地址别名

(git remote add origin_ssh git@github.com:testGit2018y/test.git)

9、Eclipse操作,略,使用eclipse插件时多想想选项操作对应的命令及原理。

10、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

# 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, seehttp://www.java.com/en/download/help/error_hotspot.xml

hs_err_pid*

.classpath

.project

.settings

Target

在~/.gitconfig文件中引入上述文件

[core]

excludesfile =C:/Users/Lenovo/Java.gitignore

[注意:这里路径中一定要使用“/”,不能使用“\”]

11、git工作流

Gitflow工作流

通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。

常见结构:

1)主干分支master

主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致。

2)开发分支develop

主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。

3)bug 修理分支hotfix。修复完随时删除

主要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。

4)准生产分支(预发布分支)release

较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除。

5)功能分支feature。开发完后随时删除

为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。开发完成后会合并到开发分支。

Forking 工作流

Forking 工作流是在GitFlow 基础上,充分利用了Git 的Fork 和pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受不信任贡献者的提交。

二、git服务器搭建

官网地址

首页:https://about.gitlab.com/

安装说明:https://about.gitlab.com/installation/

安装命令摘录

sudo yum install -y curlpolicycoreutils-python openssh-server cronie

sudo lokkit -s http -s ssh

sudo yum install postfix

sudo service postfix start

sudo chkconfig postfix on

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh| sudo bash

sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee

实际问题:yum 安装gitlab-ee(或ce)时,需要联网下载几百M 的安装文件,非常耗时,所以应提前把所需RPM 包下载并安装好。

下载地址为:

https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm

调整后的安装过程

sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm

sudo yum install -y curlpolicycoreutils-python openssh-server cronie

sudo lokkit -s http -s ssh

sudo yum install postfix

sudo service postfix start

sudo chkconfig postfix on

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce

当前步骤完成后重启。

gitlab服务操作:

初始化配置gitlab:gitlab-ctl reconfigure

启动gitlab 服务:gitlab-ctl start

停止gitlab 服务:gitlab-ctl stop

访问Linux 服务器IP 地址即可,如果想访问EXTERNAL_URL 指定的域名还需要配置域名服务器或本地hosts文件。初次登录时需要为gitlab 的root 用户设置密码。应该会需要停止防火墙服务:service firewalld stop

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容