首页 > 技术文章 > Git入门

WonderfulU 2019-07-12 21:36 原文

Git 下载地址:

https://git-scm.com/download

1.为什么要进行版本管理

1).明确分工

2)提高协同,多人开发的速度

3)提高代码质量,取出僵尸代码

2.git是什么:

目前世界上最先进的分布式版本控制系统

3.历史:

作者:Linux 两周时间用C写了一个分布式管理控制系统

4.集中式和分布式版本控制的主要区别

  1.集中式版本控制(svn)

    完全依赖中央服务器

  2.分布式版本控制

    每个人的电脑就是一个服务器

远程仓库(不是必须的)的作用:数据备份 远程交互

5.git原理以及常用命令

 

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

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

 

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

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

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

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

工作区(work tree):存放所有当前文档。此目录下的文件才会被Git管理

本地仓库:管理并保存所有的文档变化及历史状态。

创建版本库的步骤

1) 进入需要管理的目录

2) 执行 git init 命令

将一个文件添加到本地仓库,分两步:

3) 使用 git add <file> 命令,添加文件。可以一次添加多个文件。

4) 使用 git commit 命令提交一次即可

 差异比较

git diff -- readme.txt命令可以查看工作区和版本库里面最新版本的区别

日志查看

我们通过 git log 命令可以查看历史的每次提交信息: 

如果嫌输出信息太多,可以加上--pretty=oneline参数:

 查看所有关联日志

我们可以通过git reflog命令看到以前的每次执行动作

指令git reset --hard {commit id}

如果要进行版本回退或前进一般分两步

1) 通过git log  git reflog 查看操作日志吗,查找版本的commit id

2) 通过 git reset --hard <commit id> 设置HEAD到指定版本

其实版本的回退仅仅是修改HEAD指针的位置而已因此Git进行版本的切换svn要快的多

撤销修改分两种情况

1) 撤销工作区修改,使用git checkout -- <file>

2) 撤销暂存区修改分两步

a) 使用git reset HEAD <file>来撤销暂存区修改。

b) 使用git checkout -- <file>来撤销工作区修改

文件删除

使用 git rm <file>删除文件可以使用git reset –hard 版本编号 恢复文件

 总结

git init 创建版本库

git add <file> 或者git add . 添加文件

git commit –m “” 提交文件

git diff  文件比较差异

git status 查看文件状态

git log  查看此版本之前的提交日志

git reflog 查看此分支所有提交日志

git reset HEAD <file> 来撤销暂存区修改。

git checkout -- <file> 来撤销工作区修改

git rm <file>来删除文件

6.客户端工具TortoiseGit

小乌龟就是一个UI界面,很方便,相关操作底层走的其实都是命令行操作.

安装以及安装中文语言包

创建本地仓库

在任意目录下新建文件夹-->进入文件夹-->鼠标右键-->Git在这里创建版本库

注意:一般不勾选纯版本库

添加文件并提交

创建一个文件-->编写内容-->文件夹中右键选择TortoisGit(T)-->添加(等同于 git add)-->写日志-->提交

差异对比

修改文件-->文件夹中右键选择TortoisGit(T)-->比较差异

提交修改

文件夹中右键选择TortoisGit(T)-->Git提交->"master"

查看提交日志

文件夹中右键选择TortoisGit(T)-->显示日志

版本回退

直接在日志显示日志界面

选中要返回的提交,然后右键,选中:重置“master”到这个版本-->重置类型Hard-->确定

版本回退到回退之前的版本

文件夹中右键选择TortoisGit(T)-->选中 显示引用记录-->

找到需要回退的提交,右键,选中:重置“master”到这个版本

撤销修改

文件夹中右键选择TortoisGit(T)-->还原

7.Git分支管理原理

 


第一次提交--第二次提交--第三次

谁在工作区工作就指向谁(如果在第三次,那么Head-->Master(指针)指向第三次)

第四次修改

Head-->Dev分支指向第四次

第五次修改

Head-->Dev分支指向第五次

返回到第三次做修改(head指向第三次)

所以切换分支,只需要把HEAD指向另一个分支即可,所以Git分支实现了光速切换!

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并,

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支,

Git的分支管理基本就是创建新的指针改变HEAD指向删除指针等操作几乎没有文件的增删.

8.分支管理tortoise操作) 

创建分支

文件夹中右键选择TortoisGit(T)-->写入分支名称(这里我们用dav)和说明

切换分支

文件夹中右键选择TortoisGit(T)-->切换/检出-->

选择要切换的分支(dav)

在dav分支修改文件,并提交,然后切换回master

查看文件内容,发现并没有变化,因为刚才的修改是在dev完成的,master没有影响。

合并分支

文件夹中右键选择TortoisGit(T)-->合并-->选择合并的分支dav-->查看内容

解决冲突

切换到dav修改,提交

切换到master修改,提交

用master合并dav(会失败,因为发生冲突)

查看文件-->手动解决冲突(根据需求处理)

然后文件夹中右键选择TortoisGit(T)-->解决冲突-->提交

 9. 分支管理git命令(命令行了解)

创建分支

git checkout -b 分支名  创建并切换到新的分支

相当于以下两条命令:

git branch dev    # 创建分支

git checkout dev  # 切换到具体分支

git branch 查看所有分支当前分支前面会有一个*表示

dev分支上进行修改和提交

此时dev分支已经比master领先了一次提交,并且HEAD指向的是dev

合并分支

使用git checkout master切换回master分支

 查看内容:

  发现readme并没有改变,因为刚才修改的是dev分支,此时的HEAD已经指向了master.

使用git merge dev命令将 dev分支的修改合并到master分支

删除分支 

使用git branch -d dev 命令删除dev分支,dev就是具体的分支名

制造冲突

新建一个分支dev,修改分支上的文件,提交

切换master分支,修改文件,提交

解决冲突 

自动合并失败必须先解决文件冲突才能提交

根据实际情况进行冲突解决,再次提交

可以利用

git log --graph --pretty=oneline --abbrev-commit命令来查看所有分支

最后删除分支

 总结

1) 使用git branch 分支名 创建分支

2) 使用git checkout 分支名 来切换分支

3) 也可以使用 git checkout -b 分支名 来完成 创建并切换分支的操作

4) 使用git merge 分支名 来合并分支到当前分支

5) 使用git branch -d 分支名 来删除指定分支,注意:要删除一个未合并的分支。需要使用-D参数进行强制删除

10.保存工作区状态(命令行)

把当前工作区的内容进行“快照”,等待以后恢复使用

场景:

创建并切换到dev分支,修改文件,查看状态,有修改待提交。但是现在我们需要去进行紧急的BUG修复,没办法继续开发dev

使用git stash命令 保存工作区

切换回master

假设bug修复完成,然后我们再次回到dev分支去查看

通过git stash list命令来查看

有两个方法进行恢复stash内容

1) 方式1:用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

2) 方式2:用git stash pop,恢复的同时把stash内容也删了:

3) 注意以上指令都可以在后面紧跟 stash的序号,来操作指定stash,例如: git stash apply stash@{0}

总结

git stash 保存工作区;

git stash list 查看工作区;

git stash apply stash@{编号} 恢复工作区,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

git stash pop  stash@{编号},恢复工作区的同时把stash内容也删了。

 

 

推荐阅读