git

一、概念

Git是一个开源的分布式版本控制系统

集中式:版本库集中放在中央服务器,开发人员要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的内容推送给中央服务器,必须联网才能工作。典型案例:SVN。特点:结构简单,但安全性低、依赖网络。

分布式:没有“中央服务器”,每个人的电脑上都是一个完整的版本库,有网络时相互推送最新的内容即可。典型案例:git。特点:适合分布式开发、便利、可离线,但模式复杂、保密性差。

二、常用术语

仓库repository:受版本控制的所有文件修订历史的共享数据库;

工作空间workspace:本地硬盘用户帐户上编辑的文件副本;

暂存区staging area:是工作区用来提交更改(commit)前可以暂存工作区的变化;

检入checkin:将新版本复制回仓库;

检出checkout:从仓库中将文件的最新修订版本复制到工作空间;

提交commit:对各自文件的工作副本做了更改,并将这些更改提交到仓库;

冲突conflict:多人对同一文件的工作副本进行更改,并将这些更改提交到仓库;

合并merge:将某分支上的更改联接到此主干或同为主干的另一个分支;

分支branch:从主线上分离开的副本,默认分支叫master;

head:头是一个象征性的参考,最常用以指向当前选择的分支;

标记tags:标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态;

三、Git理论

3.1工作区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(RepositoryGit Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。

Workspace:工作区,就是你平时存放项目代码的地方;

Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息;

Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;

Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;

 

3.1工作流程

git的工作流程一般是这样的:

1、在工作目录中添加、修改文件;

2、将需要进行版本管理的文件放入暂存区域;

3、将暂存区域的文件提交到git仓库。

因此,git管理的文件有三种状态:已修改(modified,已暂存(staged,已提交(committed)

 

 

 

四、Git操作

4.1 创建工作目录

工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。常用指令:pullclonecheckoutaddcommitpush.

 

 

 

4.2 创建仓库

$ git init  # 在当前目录新建一个Git代码库

$ git init [project-name]  # 新建一个目录,将其初始化为Git代码库

$ git clone [url]  # 克隆一个项目和它的整个代码历史(版本信息)

$ git status [filename]  #查看指定文件状态

$ git status  #查看所有文件状态

$ git add [file1] [file2] ... # 添加指定文件到暂存区

$ git add [dir]  # 添加指定目录到暂存区,包括子目录

$ git add . # 添加当前目录的所有文件到暂存区

$ git rm --cached <file> #直接从暂存区删除文件,工作区则不做出改变

$ git reset HEAD <file>... #如果已经用add 命令把文件加入stage了,就先需要从stage中撤销

$ git clean [options]  #移除所有未跟踪文件

$ git rm --cached readme.txt  #只从stage中删除,保留物理文件

$ git rm readme.txt #不但从stage中删除,同时删除物理文件

$ git mv a.txt b.txt #把a.txt改名为b.txt

$ git diff [files] #查看文件修改后的差异

$ git checkout [<branch>]

$ git commit [file1] [file2] ... -m [message] # 提交暂存区的指定文件到仓库区

4.4、GIT分支

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

$ git branch (branchname) #创建分支

$git checkout (branchname)  #切换分支

$ git branch #列出分支

$ git branch -d (branchname)

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Gitmaster指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

五、Git GUI-sourcetree

SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。强大,功能丰富,基本操作和高级操作都设计得非常流畅.

当我们对Git的提交、分支已经非常熟悉,可以熟练使用命令操作Git后,再使用GUI工具,就可以更高效。

第一次运行SourceTree时,SourceTree并不知道我们的Git库在哪。如果本地已经有了Git库,直接从资源管理器把文件夹拖拽到SourceTree上,就添加了一个本地Git库:

 

也可以选择New-Clone from URL”直接从远程克隆到本地。

提交

我们双击learngit这个本地库,SourceTree会打开另一个窗口,展示这个Git库的当前所有分支以及文件状态。选择左侧面板的“WORKSPACE”-“File status”,右侧会列出当前已修改的文件(Unstaged files):

 

选中某个文件,该文件就自动添加到Staged files”,实际上是执行了git add README.md命令:

 

然后,我们在下方输入Commit描述,点击“Commit”,就完成了一个本地提交:

 

实际上是执行了git commit -m "update README.md"命令。

使用SourceTree进行提交就是这么简单,它的优势在于可以可视化地观察文件的修改,并以红色和绿色高亮显示。

分支

在左侧面板的BRANCHES”下,列出了当前本地库的所有分支。当前分支会加粗并用○标记。要切换分支,我们只需要选择该分支,例如master,然后点击右键,在弹出菜单中选择“Checkout master”,实际上是执行命令git checkout master

 

要合并分支,同样选择待合并分支,例如dev,然后点击右键,在弹出菜单中选择“Merge dev into master”,实际上是执行命令git merge dev

 

推送

SourceTree的工具栏上,分别有PullPush,分别对应命令git pullgit push,只需注意本地和远程分支的名称要对应起来,使用时十分简单。

注意到使用SourceTree时,我们只是省下了敲命令的麻烦,SourceTree本身还是通过Git命令来执行任何操作。如果操作失败,SourceTree会自动显示执行的Git命令以及错误信息,我们可以通过Git返回的错误信息知道出错的原因:

 

六、个人总结

曾经:以前对git研究的不深入,简单的知道git是一个分布式的版本控制系统,使用经验缺乏,对使用的一些规范欠缺,导致出现一些问题不知所措,依赖于idea内置的控件操作,有时出现莫名的bug,代码提交不全,覆盖同伴的代码等,出现冲突时没办法及时高效的解决。

现在:深入了解了git的工作流程,使用sourcetree工具对项目工程进行版本控制管理。

个人理解:虽然git的版本控制功能很强大,但是就公司及团队的使用情况来讲就是最简单最基本的功能,大家都是拉取服务器的同一分支develop,然后在各自的电脑上开发自己的功能,结束后commit到本地,然后及时push到服务器供大家共同使用,这种情况是因为大家都协同开发同一较大的功能模块,彼此依赖性较高,对小功能完成后及时提交,所以使用同一分支简单高效。等功能完成之后再合并到主分支发布使用。

在本地库代码本身是一份,并记录了所有的操作,对于分支的操作就是一个类似指针的形式,指到哪个位置就是具体的某个分支;工作区就是我们能编辑的地方,就是当前分支的内容。

纸上得来终觉浅,绝知此事要躬行,还是在具体的实践中才能更熟悉的使用git,多使用、多分析才能真正掌握。

posted @ 2021-01-11 15:14  zhangtianhong511  阅读(138)  评论(0)    收藏  举报