git基础指南
来源:互联网 发布:redis消息队列 php 编辑:程序博客网 时间:2024/06/03 14:01
git基础指南
@(OTHERS)[others, git]
- git基础指南
- 一基本原理
- 一概述
- 二git文件的三种状态
- 二基本操作
- 一取得项目的Git 仓库
- 1从当前目录初始化
- 从现有仓库克隆
- 二提交代码
- 三远程仓库
- 1查看当前的远程库
- 2添加远程仓库从远程仓库抓取数据
- 3推送数据到远程仓库
- 4查看远程仓库信息
- 5远程仓库的删除和重命名
- 四查看提交历史
- 一取得项目的Git 仓库
- 三常用操作
- 一参与开源项目
- 二gitlab项目
- 三将现有代码上传
- 三常用分支操作
- 查看所有分支
- 创建本地新的dev分支
- 发布dev分支
- 在dev分支开发代码
- 删除分支
- 6checkout某一个历史版本
注:git有很完善的官方文档,同时有中文版,但版本较旧。
一、基本原理
(一)概述
1、在分布式的版本控制系统中,诸如Git,Mercurial,Bazaar 还有Darcs 等,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
2、Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一连接。
3、在Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用CVCS 的话,差不多所有操作都需要连接网络。因为Git 在本地磁盘上就保存着所有有关当前项目的历史更新,所以处理起来速度飞快。
(二)git文件的三种状态
对于任何一个文件,在Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中;已提交表示该文件已经被安全地保存在本地数据库中了。
由此我们看到Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作
目录以及暂存区域。
每个项目都有一个git 目录,它是Git 用来保存元数据和对象数据库的地方。该目录非
常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。
所谓的暂存区域只不过是个简单的文件,一般都放在git 目录中。有时候人们会把这个
文件叫做索引文件,不过标准说法还是叫暂存区域。
基本的Git 工作流程如下所示:
1. 在工作目录中修改某些文件。(git clone后修改文件)
2. 对这些修改了的文件作快照,并保存到暂存区域。(git add)
3. 提交更新,将保存在暂存区域的文件快照转储到git 目录中。(git commit)
所以,我们可以从文件所处的位置来判断状态:如果是git 目录中保存着的特定版本文
件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
二、基本操作
(一)取得项目的Git 仓库
有两种取得Git 项目仓库的方法。第一种是在现存的目录下,通过导入所有文件来创建
新的Git 仓库。第二种是从已有的Git 仓库克隆出一个新的镜像仓库来。
1、从当前目录初始化
要对现有的某个项目开始用Git 管理,只需到此项目所在的目录,执行:
$ git init
初始化后,在当前目录下会出现一个名为.git 的目录,所有Git 需要的数据和资源都
存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。
如果当前目录下有几个文件想要纳入版本控制,需要先用git add 命令告诉Git 开始对
这些文件进行跟踪,然后提交:
$ git add *.c$ git add README$ git commit -m 'initial project version'
现在,你已经得到了一个实际维护着若干文件的Git 仓库。
2 从现有仓库克隆
如果想对某个开源项目出一份力,可以先把该项目的Git 仓库复制一份出来,这就需要
用到git clone 命令。如果你熟悉其他的VCS 比如Subversion,你可能已经注意到这里
使用的是clone 而不是checkout。这是个非常重要的差别,Git 收取的是项目历史的所有
数据(每一个文件的每一个版本),服务器上有的数据克隆之后本地也都有了。实际上,即便服务器的磁盘发生故障,用任何一个克隆出来的客户端都可以重建服务器上的仓库,回到当初克隆时的状态。
克隆仓库的命令格式为git clone [url]。比如,要克隆Ruby 语言的Git 代码仓库
Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
这会在当前目录下创建一个名为“grit” 的目录,其中内含一个.git 的目录,并从同
步后的仓库中拉出所有的数据,取出最新版本的文件拷贝。如果进入这个新建的grit 目
录,你会看到项目中的所有文件已经在里边了,准备好后续的开发和使用。如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令最后指定:
$ git clone git://github.com/schacon/grit.git mygrit
唯一的差别就是,现在新建的目录成了mygrit,其他的都和上边的一样。
Git 支持许多数据传输协议。之前的例子使用的是git:// 协议,不过你也可以用
http(s):// 或者user@server:/path.git 表示的SSH 传输协议。
(二)提交代码
1、检查当前状态
git status
2、跟踪新文件或者暂存文件
git add .
暂存这次更新,需要运行git add 命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)。
3、忽略某些文件
创建.gitignore文件
4、查看差异
git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用
git diff --cached
命令。(Git 1.6.1 及更高版本还允许使用git diff –staged,效果是相同的,但更好记
些。)
5、提交
git commit -m "comment"
这个代码就被提交到本地仓库了。
6、删除文件
git rm *.txt
(三)远程仓库
1、查看当前的远程库
git remotegit remote -v
一般默认的远程仓库命名为origin,默认的分支名称为master。
2、添加远程仓库&从远程仓库抓取数据
$ git remoteorigin$ git remote add pb git://github.com/paulboone/ticgit.git$ git remote -v$ git fetch pb
如果是克隆了一个仓库,此命令会自动将远程仓库归于origin 名下。所以,git fetch
origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次fetch 以
来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下git clone 命令本质上就是自动创建了本地的master 分支用于跟踪远程仓库中的master 分支(假设远程仓库确实有master 分支)。所以一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中当前分支。
3、推送数据到远程仓库
项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程
仓库。实现这个任务的命令很简单: git push [remote-name] [branch-name]。如果要把本地的master 分支推送到origin 服务器上(再次说明下,克隆操作会自动使用默认的
master 和origin 名字),可以运行下面的命令:
$ git push origin master
4、查看远程仓库信息
我们可以通过命令git remote show [remote-name] 查看某个远程仓库的详细信息,比
如要看所克隆的origin 仓库,可以运行:
git remote show origin
5、远程仓库的删除和重命名
$ git remote rename pb paul$ git remote rm paul
(四)查看提交历史
1、git log可以查看基本的信息,如
$ git logcommit 49d14429375bf9b4be29be603eaa22e6287ce1deAuthor: jinhong-lu <lu_Jin_hong@163.com>Date: Tue Oct 13 17:33:18 2015 +0800 testcommit d79066da60cd1a6721acc0ea3336b4b8a84f85beAuthor: jinhong-lu <lu_Jin_hong@163.com>Date: Tue Oct 13 14:12:32 2015 +0800 new
默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上
面。看到了吗,每次更新都有一个SHA-1 校验和、作者的名字和电子邮件地址、提交时
间,最后缩进一个段落显示提交说明。
git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。
2、git log –p -2
git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。
我们常用-p 选项展开显示每次提交的内容差异,用-2 则仅显示最近的两次更新.
在做代码审查,或者要快速浏览其他协作者提交的更新都作了哪些改动时,就可以用这个选项。
3、git log –stat,仅显示简要的增改行数统计
4、指定log的格式
git log --pretty=format:"%h - %an, %ar : %s"ca82a6d - Scott Chacon, 11 months ago : changed the verison number085bb3b - Scott Chacon, 11 months ago : removed unnecessary test codea11bef0 - Scott Chacon, 11 months ago : first commit
5、完整选项:
选项说明-p 按补丁格式显示每个更新之间的差异。--stat 显示每次更新的文件修改统计信息。--shortstat 只显示--stat 中最后的行数修改添加移除统计。--name-only 仅在提交信息后显示已修改的文件清单。--name-status 显示新增、修改、删除的文件清单。--abbrev-commit 仅显示SHA-1 的前几个字符,而非所有的40 个字符。--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。--graph 显示ASCII 图形表示的分支合并历史。--pretty 使用其他格式显示历史提交信息。可用的选项包括oneline,short,full,fuller 和format(后跟指定格式)。
详见官方文档。
三、常用操作
(一)参与开源项目
$git clone https://github.com/lujinhong/dao.git$vi pom.xml$git add .$git commit -m "change version"[master 8ed26de] change version 1 file changed, 1 insertion(+), 1 deletion(-)$ git push origin master
(二)gitlab项目
1、在web页面上创建一个项目并取得URL
2、git clone后操作如同上面
其实更好的办法是使用IDE。
(三)将现有代码上传
git initgit remote add origin ssh://git@192.168.1.1:22/ljhn1829/lujinhong.gitgit add .git commit -m 'new'git push origin master
或者也可以clone以后再将当前代码add进来,然后push。
(三)常用分支操作
1. 查看所有分支
git branch --all # 默认只有master分支,所以会看到如下两个分支# master[本地主分支] origin/master[远程主分支]# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步
2. 创建本地新的dev分支
git branch dev # 创建本地分支git branch # 查看分支# 这是会看到master和dev,而且master上会有一个星号# 这个时候dev是一个本地分支,远程仓库不知道它的存在# 本地分支可以不同步到远程仓库,我们可以在dev开发,然后merge到master,使用master同步代码,当然也可以同步
3. 发布dev分支
发布dev分支指的是同步dev分支的代码到远程服务器
git push origin dev:dev # 这样远程仓库也有一个dev分支了
4. 在dev分支开发代码
git checkout dev # 切换到dev分支进行开发# 开发代码之后,我们有两个选择# 第一个:如果功能开发完成了,可以合并主分支git checkout master # 切换到主分支git merge dev # 把dev分支的更改和master合并git push # 提交主分支代码远程git checkout dev # 切换到dev远程分支git push # 提交dev分支到远程# 第二个:如果功能没有完成,可以直接推送git push # 提交到dev远程分支# 注意:在分支切换之前最好先commit全部的改变,除非你真的知道自己在做什么
5. 删除分支
git push origin :dev # 删除远程dev分支,危险命令哦# 下面两条是删除本地分支git checkout master # 切换到master分支git branch -d dev # 删除本地dev分支
6、checkout某一个历史版本
git loggit checkout -b redis2 a8e55ff906b3917dcd0125f497fa009f49b6c3b2
将a8e55ff906b3917dcd0125f497fa009f49b6c3b2这个历史commit checkout到一个新的branch redis2。
- git基础指南
- git基础指南
- git指南
- git 指南
- git 指南
- Git指南(3) - git分支
- Git权威指南
- git 的简易指南
- 《git权威指南》
- Git入门指南
- git - 简易指南
- git 简易指南+常用命令
- git - 简易指南
- git - 简易指南
- git简易上手指南
- Git权威指南.pdf
- 官方:git - 简易指南
- git - 简易指南
- 分治、动态规划和贪心
- 图解DHCP的4步租约过程
- LeetCode 92 Reverse Linked List II (Python详解及实现)
- 如何写一个UEFI EDKII的应用:how to write a UEFI EDKII application
- C++对于参数的传递详解
- git基础指南
- 汉字统计
- 在 Windows 下安装部署 PHP 7.0 本地开发环境
- Uva 621 Secret Research
- Matlab取整函数 fix, floor, ceil, round的区别
- Pie (二分)
- linux命令后台运行
- spark之4:基础指南(源自官方文档)
- 论文笔记:GoogLenet