远飞闲记

阅读、思考、技术

Git学习笔记

🗓️发布日期:2014-05-14 · 🗺️总字数: 2560 字 · ⏱️阅读时间: 6 Minute

以前的项目都是使用的SVN,也了解一点点GIT的使用但没有系统的去学习过它的使用.最近有时间在近两天系统的学习了下Git Pro这本书的内容并更进一步的加强了我对git的了解和使用的技巧.

什么是版本控制?

版本控制是一种记录一个或者若干文件内容变化,在将来某天我希望查看其特定版本修订的系统.

版本控制系统的分类:

本地版本控制系统:

就是对文件改成不同的名字进行备份,优点简单,缺点时混淆在一个文件夹内一旦弄错不容易恢复.有rcs

集中式版本控制系统

集中式版本控制系统((Centralized Version Control Systems,简称 CVCS)),单一服务器集中管理所有文件的修订版本,协同工作的人通过客户端取出最新版本进行提交更新.其中Subversion(SVN)、CVS及Perforce等系统,优点能查看其他人对文件做了什么,管理员能对客户端进行权限的分配.缺点:都在同一个服务器上维护代码,如果服务器宕机一小时那么谁也无法提交更新.最坏的情况时如果服务器文件丢失那么谁也不能保证客户端代码时最新的.

分布式版本控制系统

        客户端并不是提取最新版本文件的快照,而时把整个仓库镜像到了本地.优点就是任何一个协同工作的服务器发生故障,事后都能从任何一个镜像出来本地仓库恢复. 目前的系统有Git、Mercurial、Bazaae、Darcs等

为什么要使用版本控制工具?

  • 在将来某天可以查看以前版本修订的内容
  • 在工作时误操作删除文件后不需要抓狂,可以快速的恢复文件。
  • 在多人协作工作时不会因为自己的改动而替换别人的更动.

 

GIT的工作原理

git时记录的时更改的快照,每次提交更新会遍历一遍所有的文件的指纹信息作一快照,然后保存一个指向这一快照的索引,如文件未变化则不会保存而只对上一次保存的快照作一链接.

所有操作都是本地完成的不要联网操作。

在保存到git之前,对所有数据都要进行内容的校验和计算并将此结果作为数据的唯一标识和索引.所有保存在git中的内容都是通过一个SHA-1算法计算出的校验和.

常用的git操作大多仅仅是把数据添加到数据库

文件的三种状态: 已修改:对已经从git目录中取出的文件进行过修改 已暂存:对修改的文件放在下次提交的时要保存的清单中 已提交:标识该文件已经安全的保存在本地的数据库中了.

所有文件的元数据和对象数据库都保存在.git文件夹中,从项目取出某个版本的文件和目录用以后续的工作叫做工作空间,暂存区域只不过是个简单的文件保存快照的索引放在.git中

GIT工作流程:

  1. 在工作目录中对某些文件修改
  2. 对修改后的文件进行快照,然后保存在暂存区域
  3. 提交更新,将保存到暂存区域的文件快照永久的转储到git目录中  

 


 

Git的安装

Liunx: Fedora: $yun install git-core Ubuntu: $apt-get install git

Mac OS: 通过homebrew安装:  $brew install git MacPorts: $sudo prot install git-core+svn+doc+bash_completion+gitweb  图形化方式安装:

Window:   msysGit


Git 配置

用户信息 $git config –global user.name “名字” $git config –global user.email 电子邮件地址

文本编辑器 $git config –global core.editor 编辑器名

差异性分析工具 $git config –global merge.tool 工具名(vimdiff) Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息

查看配置信息 git config –list 查看特定的信息: $git config user.name


GIT基础

从工作空间初始化新仓库: git init 从现有仓库克隆:git clone   仓库地址 检查当前文件状态: git status 跟踪新文件:git add 提交更新: git commit -a(不需要对修改进行add操作) -m “说明” 忽略某些文件:在目录下创建一个.gitrgnore文件,其中加排除版本更新文件.文件内容可以使用glob模式匹配 查看已暂存和未暂存的更新:git diff –cached(查看暂存起来文件的变化) 移除文件:git rm 可选 -f(强制移除文件) 文件名 移动文件: git mv 文件名

查看提交历史 :git log 可选参数: -p(显示最近提交内容的差异) -2(显示最近两次更新) -word-diff(查看单次的变化) -stat 增改行数的统计 –pretty=oneline显示在一行 图形化查看提交历史工具: git gitk 撤销操作:git commit –amend 将文件全加到暂存区域: git add . 取消已经暂存的文件: git reset HEAD <file> 取消对文件的修改: git checkout – <文件名>

远程仓库

查看当前的远程库:git remote 可选参数 -v(显示对应的克隆地址) 添加到远程仓库: git remote add [shortname] [url] 抓取远程仓库的数据: git fetch [remote-name] 推送数据到远程仓库:git push [remote-name] [branch-name] 查看远程仓库的信息: git remote show [remote-name] 原始克隆的远端仓库中抓取数据合并到当前工作目录的分支中: git pull 远程仓库的删除和重命名:git remote rename 名字 新名字 删除对应的远端仓库: git remote rm 名字

标签

 显示已有标签: git tag  可选-l “1.4.*“显示1.4版本的所有标签 含附注的标签:git tag -a [tag_name] -m ‘注释’ 签署标签: git tag -s [tag_name] -m ‘注释’ 验证标签: git tag -v [tag_name] 后期加注标签: git tag -a [tag_name] 提交对象的校验和前几位 分享标签:git push [remote_name] [tag_name] 可选 –tags(一次性推所有标签)

别名: git config –global alias.别名 git命令

 


 

GIT分支

分支其实时某个对象往回看的历史,git创建分支实际保存的是一个校验和的文件很廉价很快速,就是向一个文件写拉41个字节(外加一个空白符),所有分支都是在本地仓库中操作

创建分支:git branch [branch_name] 切换分支: git checkout 可选-b(新建并切换到分支) 分支名 删除分支: git branch -d  -D(强制删除) [branch_name] 合并分支: git merge [branch_name] 浏览所有分支 :git branch 可选 -v(查看各分支最后一个提交) –merged(当前分支已经和哪些分支合并了) –no-merged(当前分支和哪些分支未合并) 获取远程分支: git fetch [remote_name]/[branch_name] 推送本地分支: git push [remote_name] [branch_name] 合并远程分支: git merge [remote_name]/[branch_name] 删除远程分支: git push [remote_name] :[branch_name] 跟踪远程分支: git checkout –track [remote_name]/[branch_name]

衍合(rebase)把一个分支里提交的改变移到另一个分支里重放一遍,更整洁的提交历史,使用目的想要得到一个能在远程分支上干净应用的补丁

git rebase [主分支] [特性分支] 衍合的风险: **一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。 **如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些尚未公开的提交对象,就没问题。如果衍合那些已经公开的提交对象,并且已经有人基于这些提交对象开展了后续开发工作的话,就会出现叫人沮丧的麻烦。

🏷️