Git

1. Git简介

1.1 git是什么

1.1.1概念

Git:git是一款开源的分布式的版本控制软件

Github:是一个基于git的面向开源及私有软件项目的托管平台

因仅支持git 作为唯一的版本库格式进行托管 故名gihub

1.1.2.Git的特点

①Git从服务器上克隆完整的项目到本机,相当于每一个开发者都拥有一个项目的完整版本

②开发者在自己的机器上创建分支,修改代码.

③将自己本地创建的分支提交到本地的版本库

④在单机上合并分支

⑤新建一个分支,把服务器上的最新版的代码fetch下来,然后跟自己的主分支合并

⑥Git最大的亮点在于分支的管理.

1.2     什么是版本控制

版本控制概念:

这种方法是工程图(engineering drawings)维护(maintenance)的标准做法, 它伴随着工程图从图的诞生一直到图的定型。 一种简单的版本控制形式,例如,赋给图的初版一个版本等级“A”。当做了第一次改变后,版本等级改为“B”,以此类推等等.

1.2.1未引入版本控制的问题:

现实开发中最麻烦的是多人开发中的版本控制,如果未引入版本控制的概念,我们服务器上仅存在一个我们从最初开始开发的项目,我们每一次的增删改也是在这个项目之上,所以如果某一个开发者提交了带有bug的代码,或者对这个已经存在的项目进行更新操作,如果更新失败,则这个项目就废弃了

一个项目如果有多个人开发,开发人员A,B,C,分别对项目中的同一代码进行了修改,那后一次提交的人的代码,就会覆盖前一个人的代码

 
 
 
 
 

1.2.2传统的集中式版本控制

集中式版本控制系统(Centralized
Version Control Systems,简称 CVCS),版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器

这么做最显而易见的缺点是中央服务器的单点故障。如果维修一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史.

1.2.3使用分布式版本控制系统

分布式,当我们连接共享版本库时,可以先将服务器上的项目,克隆到本地,相当于每一台电脑上都有整个项目的文件备份,在没有网时也可以开发,完成开发后,可以先提交到本地仓库,当有网的时候,再提交到共享版本库,这样一来,如果我们的服务器或者我们自己的电脑出故障,我们也没有任何担心

1.3Git的安装

①下载软件https://git-scm.com/官网地址

②进行安装

最重要的一步,其它可以直接走默认

选择这一步可以直接将我们的git命令,添加到系统变量中

2. git入门

工作区,暂存区,主分支的概念

获取帮助

git help

如果向对某个具体的命令获取帮助,可以使用
git help <verb>

2.1设置开发者的个人信息

多人开发的项目中,通过设置的用户名来区分开发者,设置email来联系开发者

2.1.1配置当前项目中的用户信息(局部)

先创建一个本地版本库

在配置当前项目的用户信息时,需要进入git管理的项目中来进行设置

1.配置用户名:Git config user.name “用户名” 用来区分谁开发的代码

2.配置邮箱信息:git
config uer.eamil “邮箱” 可能是多个国家的开发者,便于联系开发者

配置以后会可以在隐藏的.git文件夹的config文件中查看到,

也可以使用git config –list进行查看

2.2.2配置全局用户信息

1.配置用户名:git - -global config user.name “用户名” 用来区分谁开发的代码

2.配置邮箱信息:git -
-global config uer.eamil “邮箱” 可能是多个国家的开发者,便于联系开发者

可以在C:\Users\Administrator\.gitconfig中查看

2.2创建仓库

①创建文件夹E:\Mygit

②初始化仓库:

进入我们创建的文件夹
cd e:\Mygit ,使用命令 git init进行初始化仓库

这时候会在当前文件夹下创建一个.git隐藏文件夹,.git文件夹是我们的仓库信息,一定不要修改

③对仓库信息进行配置,主要是设置user.name和user.email,如果设置了全局的用户信息,可以忽略

2.3添加文件

在仓库中添加一个hello.java的文件

①  
查询仓库的状态:git
status

②  
将文件加入到暂存区:git
add
文件名

使用git status 再次查询出文件的状态

现在的文件并没有真正的提交到主分支上(主分支就是我们真正要运行的程序的所有代码).

③ 提交到本地版本库:git commit –m”注释信息”

git commit -m"创建一个java文件"

此时文件就被提交到了主分支上

查询指定文件的日志记录:git
log
文件名 如果出现end 使用q退出

74d914fdda87ba20f52b907413fb7eb3a29973de是我们的版本号

总结:

         每一次修改或者创建新文件时,都需要先使用    git add 文件名       的命令来将文件添加到缓存区,再使用git commit –m “注释信息” 来将我们的文件添加到版本库

         或者使用简化命令 git commit
–a –m”
注释信息” 来将我们的文件添加到版本库

2.4修改文件

Git 如何管理修改的文件

①  
将我们之前创建的Hello.java文件进行修改

查询当前仓库状态 git status

以上看到git的一个建议

(use "git add <file>..." to update what will be
committed)

(use "git checkout --
<file>..." to discard changes in working directory)

我们可以选择git add进行添加到缓存,或者我们可以使用git checkout进行恢复

使用
git diff HEAD Hello.java可以查看我们对文件具体做了哪些修改

②  
使用git add 文件名,将文件加入到缓存

③  
使用git commit –m”注释信息” 提交到本地版本库

如果进行了vim编辑器,首先Esc退出输入状态,然后Shift+;,再输入q!或wq!(不保存改动,wq!是保存文件的写入修改)退出

2.5.Git工作区与缓存区

工作区:包含.git文件夹的文件夹(除了.git文件夹)

仓库:也称为版本库,这个不算工作区

暂存区:.git版本库中有很多东西,包括重要要的称为stage 的暂存区,还有git为用户

自动创建的主程序分支master,以及指向master的HEAD指针,HEAD指针永远指向我们当前项目的最高版本

 
 
 
 
 
 
 
 
 
 
 
 
 

这个就像我们之前学习的mysql数据库中的事务一样,使用insert 增加了,但是没有使用commit是不会成功的

当使用commit后,会清空暂存区的内容

2.6 版本回退

我们每次提交代码后,都会生成一个40位的哈希值, 可以成为commit id

使用git log来查看我们的提交记录

可以使用git show +版本号来查看修改
此版本号的修改内容

2.6.1恢复到上一版本

使用git reset - - hard HAED~1 或使用git reset - - hard
HEAD^

2.6.2恢复到指定版本

①查询当前的日志信息 git reflog

Git log 和git reflog的区别:

git log只会查询历史有效版本的版本号

git reflog 会查询历史所有版本的版本号,包括已经废弃的

②找到想要恢复的版本号 使用 git reset –hard 版本号,进行恢复到指定版本

2.7撤销修改

2.7.1 未执行
git add 添加到缓存区时

可以使用
gid checkout  - -  Hello.java 与本地仓库中进行对比,同步

切记用于恢复文件时,文件名前面有--

2.7.2 已经执行git add 添加到了暂存区,但是没有执行git commit

可以使用
git reset HEAD Hello.java 将暂存区的内容恢复到了工作区

如果文件有错误,想恢复到上一次提交,还可以直接使用gid checkout  - -  Hello.java进行恢复

2.8删除文件

①.从磁盘上删除文件

还是可以使用git恢复的命令进行恢复

如果使用

删除文件,git rm <filename>

删除文件夹,git rm –r <文件夹名>

同时时候git commit时本地仓库中的文才会删除

3 Git和github

3.1注册账号

3.2生成SSH Key

使用git bash生成

Ssh-keygen –t rsa –c 429189785@qq.com

会生成两个文件

id_rsa –私钥

id_rsa.pub ---公钥

在github 的setting中选择SSH Keys 进行添加

将公钥的内容,粘贴进去

3.3添加远程仓库

①将本地已有仓库与远程仓库相关联

使用命令 git remote add origin https://github.com/zhaoqinrong/admin.git

Git remote add origin+远程仓库地址

但是目前为止,远程仓库中没有我们本地仓库的内容

②将本地所有内容,提交到远程仓库

使用命令git push –u origin master

会提示输入github的用户名和密码

由于是第一次推送,而且推送的为master分支,就会使用”-u”的参数将远程master与本地master进行关联

④  
修改本地文件后,提交到本地版本库add 和commit命令

⑤  
推送到远程仓库
git push

3.3 克隆仓库

将远程版本库克隆到本地

①  
,在github上建立仓库,并进行初始化

勾选Initialize this repository with a README初始化这个仓库

②  
克隆远程仓库

点击Clone or download,将仓库的地址复制下来

使用git clone +远程仓库地址,对远程仓库进行克隆

这样就克隆下来了

③  
在我们克隆的仓库中进行项目的开发,这里我们新建一个hello.java的文件
并使用add和commit命令进行本地版本库的提交

④  
使用git push
–u origin master
进行推送 Master为分支名

3.4克隆其他开源项目

①  
找到需要克隆的开源项目的地址,然后fork到自己的远程仓库

②  
复制自己仓库中这个项目的地址

③  
使用
命令

Git clone +远程仓库地址 进行克隆

3.5如何从远程仓库中获取更新

①远程仓库与本地仓库进行关联

要向从远程仓库中获取更新,必须先将本地仓库与远程仓库进行关联,可以使用

git remote add origin https://github.com/zhaoqinrong/Mygit

可以使用命令git remote rm origin删除关联的远程仓库

使用git remote show origin来查看ms远程仓库的具体分支

使用git remote –v 来查看与当前本地仓库相关联的远程仓库

origin为我们为远程仓库起的别名

③   使用git pull origin master进行获取并合并到本地仓库

如果直接使用git
pull
可以会出错,建议先git fetch到本地,然后使用git merge 合并

3.6 如何向远程仓库推送更新

我们编写项目后,需要将我们的项目推送到远程仓库

可以使用git push <url> <本地分支名>

①  
远程仓库与本地仓库进行关联

②  
推送更新

建议我们推送更新前都先使用pull获取远程仓库中的更新,然后在push推送

Ms 是我们远程仓库的一个别名,我们自定义

可以使用git push
ms master:mygit-1

将本地的master分支推送到ms远程仓库的mygit-1分支中

3.7删除远程仓库中的文件

①先要将本地仓库和远程仓库进行关联

进入到我们的git命令行页面后,先将远程代码pull到本地,保持本地仓库跟远端仓库同步。

④  
使用git rm 文件名 删除
文件

⑤  
,进行提交(和数据库事务一样,提交后才会处理)

⑥  
向远程仓库进行推送

4分支管理

Master 主分支,主要作为程序的发布

所以不能在master上进行开发,所以应该建立子分支进行开发

4.1 HEAD指针和Master指针

①在没有分支的情况下,Master指针永远指向当前的最高版本

而head指针指向master

 
 

②  
创建了新分支,HEAD指向了

③  
主分支和子分支进行合并

 

4.2分支创建

①创建分支:

使用命令 git
branch +
分支名

使用git  branch 查看当前项目的分支

⑦  
 切换分支
使用命令 git
checkout +
分支名

⑧  
 使用命令git
checkout +
分支名 切换到主分支,然后删除分支 使用命令 git branch –d +分支名

注意:要删除分支,必须要先切换到主分支

 

可以使用   git checkout –b +分支名    创建并切换分支

分支上的文件是相互独立的,修改文件不会影响

模拟:建立两个分支,并分别进行推送

先连接远程仓库 git remote set-url origin  https://github.com/zhaoqinrong/mygithub.git

然后分别推送分支 git push origin master    git
push origin brh

推送成功后可以在我们github上进行查看

4.3合并分支

①切换回主分支git
checkout master

②  
合并分支git
merge brh(
子分支名)

③,删除子分支
 git branch -d brh

③  
推送到远程仓库
git
push origin master

现在在本地没有brh的子分支,但是远程仓库中的子分支还在

④删除远程子分支git push
origin –delete brh(
子分支名称)

4.4 删除分支

删除本地分支:git branch –d <branch-name>

删除远程分支: git push origin –delete <branchName>

4.4 解决代码冲突

git fetch origin master

git merge origin/master

代码冲突如何产生的:

当我们在分支上进行开发的时候,难免遇到别的开发人员和我们自己向仓库中提交相同的代码

比如我们有一个商城的项目,开发人员A和开发人员B都对同一段代码做了修改,当A进行提交后并push到远程仓库中master合并,B再进行提交并与远程仓库中的master进行合并

这时候就会出现代码冲突

现在我们来模拟一下代码冲突,并试图解决

①  
在E盘新建文件夹
GitConflict,并初始化仓库git init

②  
在工作区创建名为Conflict.txt的文件,并写上hello git

③  
把文件提交到本地仓库

④  
创建新分支,名为Conflict并切换

⑤  
在conflict分支下对Conflict.txt文件进行修改

⑥  
然后在conflict分支下进行提交

⑦,切换到主分支

⑧  
再次对文件进行修改

⑨  
 提交修改后的文件

⑩  
和分支conflict进行合并

文件报错,有冲突

然后我们可以打开仓库中的Conflict.txt文件进行查看

中间内容表示有冲突的地方,我们可以选择保留一条信息,进行合并,假如我们保留一下数据

再次提交并合并

OK了

5.使用tag

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

打标签命令:git tag
<tagname>

在以往历史中的提交id上打标签

使用
:git tag <tagname> <commitid>

删除标签
git tag -d<tagname>

5 eclipse中使用git

5.1用eclipse将项目保存到github中

1首先注册github

2.使用eclipse生成一个SSHkey

3.在github上对进行添加

4.在github上创建一个新的仓库,并对仓库进行初始化

5.将我们的项目发布到刚刚创建的仓库中

因为我们这里是新项目,所以选择创建一个repository

表示我们的项目还没有指针

将项目提交到本地仓库

写上注释,选上所有文件进行commit and push

选择master分支

正在推送

成功

这是我们成功发布的项目,提交给github托管,当我们需要对项目进行修改的时候

5.2我们可以将项目从github上导入到本地

打开MyEclipseàfileàimport

正在导入

导入完成,然后我们在这个项目上进行开发,不会影响到我们仓库中的项目的完整性

目前是master分支,我们需要新建分支进行我们的开发

新建分支后,自动切换分支

5.3在分支上进行开发,并git到github分支上

1.现在我们已经切换到了上一节创建的分支上,现在我们在我们之前的项目上做一点修改

这是我在MyJindong分支上对项目进行的一个修改,新增了一个aaaaa.html的文件

2.先将我们修改的项目git到本地的仓库进行一次commit

2. 将更新推送到远程仓库,并自动创建分支

这是检查本地和远程仓库的差异:

检查出本地和远程仓库有差异,可以进行,然后在仓库中创建新分支,将我们的修改后的项目git到远程仓库

3.这是我们的新分支和master分支,这就成功的,将新分支git到了远程仓库

5.4将我们分支开发的项目和master分支的进行合并

我们第一版的项目有bug,我们在新分支上进行修改,将修改后的项目与我们的之前的项目进行合并

  1. 首先我们要确定我们要与哪个分支合并,然后将我们的项目切换到哪个分支下,然后使用Merge进行合并

我们这里要与主分支合并,首先切换到主分支,看主分支是否有更新,然后我们合并到本地项目

选择我们修改的项目进行本地合并

合并后的结果

  1. 然后选择push to upstream进行检查,是否有更新需要上传到我们的远程服务器

这是合并到远程仓库的结果.成功

5.5删除本地分支和远程分支

选择以后点击OK即可

5.6版本回退

便可以进行版本的回退

5.7 使用eclipse解决代码的冲突

模拟

①从远程仓库中导入一个项目到我们的eclipe中

导入过程不过讲解

这是我们导入的项目,并进行本地版本库的提交

②创建新分支

并对项目内容进行修改.然后提交到本地版本库

④  
切换到主分支master,对项目进行修改,并提交本地版本库

⑤  
,与conflict分支进行合并

便出现了我们期待的结果

⑥  
查看冲突的代码

标红的文件代表有冲突

⑦  
查看冲突的代码

双击

红色框起来的代码就是有冲突的代码,再手动进行修改

假设我们现在修改左侧的代码为

再次提交,然后合并查看效果

注意:如果git pull失败,则需要添加参数

[remote "origin"]

url
= https://github.com/zhaoqinrong/test.git

fetch
= +refs/heads/*:refs/remotes/origin/*

[branch "master"]

remote = origin

merge = refs/heads/master

最新文章

  1. 使用dbms_scheduler包创建定时任务
  2. #VSTS 日志# TFS 2015 Update 1 发布 – Git和TFVC代码库可以混合使用了
  3. 301 redirect Domain Name using global.asax
  4. dedecms 文章页调用来源合适时间的方法
  5. ssh 私匙登录, 文件rswrst权限
  6. C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库
  7. STL之deque双向队列
  8. poj 2054 Color a Tree(贪婪)
  9. PAT乙级-1042. 字符统计(20)
  10. 音频转化mp3 ,到底选vbr还是cbr
  11. 打造利器Qt Creator:代码todo工具的使用
  12. BZOJ2803[Poi2012]Prefixuffix——hash
  13. SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用
  14. Django REST framework基础:版本、认证、权限、限制
  15. python抓取猫眼电影列表
  16. XE5 修复 安卓 输入法隐藏 后 无法退出的问题 3.1
  17. oracle数据分组
  18. sql多表更新使用别名(小技巧)
  19. X day4
  20. PHP学习笔记(4)GD库画五角星

热门文章

  1. 「SCOI2016」妖怪 解题报告
  2. CF527E Data Center Drama(构造+欧拉回路)
  3. 低电平ViL
  4. 20165223 结对编程之四则运算week2-整体总结
  5. ftp sun jdk自带
  6. 洛谷P1072 Hankson的趣味题
  7. 网上找的Backbone.js
  8. python之设计模式
  9. request的基本应用
  10. padding内边距