GIT原理和常用命令速成

【原创,2018-03-16,15:33:49】

刚开始学习GIT的时候,以为只要掌握几个基本的操作指令就万事大吉了。但是随着GIT使用的深入,如果不了解些原理就会遇到各种各样让人一脸懵逼的问题,所以还是要对GIT原理有一些基本了解,这里默认已经掌握常用的基本指令了。(随便搜教程看下就行,例如clone pull push add commit log reset status branch checkout差不多吧,文末也会记录一些常用命令)

ps. 文中列举了许多英文单词,因为在外文手册和help中经常会看到这些单词,而不容易得知其对应中文意思,所以这里把常用的概念注释了出来。



一、GIT原理

原理先从git-gui版本的visuallize history图开始说起,先举例子上图(win下):

(ps. win版本直接安装git-gui就好,linux上安装gitk,并且shell中用gitk --all & 执行)

这是git中的树状图,表示了版本的演进发展过程,每个节点在英文手册或者help中称为point。下方的节点表示父节点,上面的节点表示子节点,子节点由父节点演化得到。

1、每一个圆点表示一个开发版本,每次commit或者pull、stash等就会出现新的子节点,后面的文字表示commit时写的注释信息

2、左侧方框表示分支branch名称(例如master, average等),连线的节点表示该分支当前的版本。

3、黄色表示HEAD指针指向的point(表示处于当前工作状态下),常说成HEAD指针指向当前工作状态的分支,但是图中有一些节点是没有对应分支的,此时这个节点对应的分支就用hash值表示,哈希值在git-gui中可以查到或者git log中查到。

所以从此处开始,后文中不区分节点和分支的概念,两者是一一对应的,只是有的分支有名字,有的分支没有名字(哈希值,并且git branch 也默认不显示),因此HEAD也可以当做分支名称使用

4、每一个仓库包括三部分:工作区、版本库(暂存区和分支),如图所示(图片来自网络)

工作区:对应于当前仓库(repository)目录(linux叫目录,win叫文件夹)下除了.git文件夹外其他所有文件

版本库:对用于.git中的文件,包括暂存区(stage/index)的数据 + 各个版本分支(按照上面3的说法就是指各个节点)的数据

5、文件分为三种状态:unstaged, stage,  commit之后的文件

git add 命令就是把unstaged的数据提交到缓存区表位staged状态

git commit 命令就是把staged的数据提交,生成一个新的point

git status 命令可以查看处于unstaged, staged 状态的文件,

其中unstaged文件又分为modified(之前存在的文件做出修改), untracked(新建文件)

ps. git status 输出结果中还给出了从stage撤回到unstaged, 从modified恢复修改之前的指令,untracked文件的恢复就是rm删除就可以了



二、常用指令(尽量按照使用GIT时可能碰到的先后顺序写)

1、从零开始

(1)从远程主机下载已有的仓库开始

a)ssh方式(关于SSH公钥秘钥的产生和设置这里就不提了,网上随便一搜就有)

git clone [email protected]域名:用户ID/仓库名称.git

b) https方式

git clone https://域名/用户ID/仓库名称.git

输入用户名和密码

(2)从本地主机新建仓库开始

git init

2、本地分支的操作

git branch 查看本地分支

git branch -a 查看本地分支和远程分支

git checkout -b AAA BBB 在BBB节点上建立名字为AAA的分支并切换到该分支(即移动HEAD指针)

(缺省-b AAA:分支名字使用哈希值表示,只输入哈希值的前几位就可以了 )

(缺省BBB:默认使用HEAD指针的节点)

git branch -d AAA 删除名字为AAA的分支

(ps. 有一些节点没有分支名字并且不是现有分支的父节点,在GIT中会保存一段时间,之后就可能被删除了)

3、完成本次开发准备本地提交

(git status 查看文件状态)

git add 文件名/.(点表示所有unstaged文件)

git commit -m "xxx

4、版本还原(保证不存在unstaged和staged的文件才可以使用还原功能,可以commit,或者撤回add和修改,或者stash把未commit文件加入到栈)

分为两种情况:

a)HEAD指向有名字的分支,可以理解为把该分支移动到HEAD指向节点的父节点,并且移动HEAD指针到该父节点

b)HEAD指向没有名字的分支(哈希值表示),reset等价于移动HEAD指针的checkout指令

这里主要针对a情况

git log -n 查看记录(显示当前节点的所有父节点)

git reset --soft XXX 把当前分支(有名字)移动到历史分支XXX,工作区文件不变,版本库中有差异的文件直接放入到暂存区(index),即staged状态

git reset --mixed XXX (--mixed可缺省) 当前分支(有名字)移动到历史分支XXX,工作区文件不变,版本库中有差异的文件放入到unstaged状态

git reset --hard XXX 当前分支(有名字)移动到历史分支XXX,工作区文件也都全部还原到历史版本

ps1. reset不会立刻把git树中的节点删除掉,而是会保存一段时间

ps2. XXX参数为分支名称,可以是有名字的分支名称,无名字分支的哈希值名称,HEAD指针变形(HEAD^表示上一个父节点,HEAD^^上两个父节点)

5、push(同4)

(origin表示该仓库对应的远程仓库,在clone之后已经默认设置好了,不过可以修改也可以建立新的源)

git push origin AAA:BBB 把AAA分支推到远程BBB分支(缺省 “:BBB”:远程分支和本地分支同名,远程没有同名分支则新建;缺省“AAA”:删除远程BBB分支)

(缺省“AAA:BBB”:push HEAD指针指向的分支,远程分支和本地分支同名)

(缺省 "origin AAA:BBB"): 若源是惟一的,则origin可以省略,指令作用同上

6、pull(同4)

(1)pull = fetch + merge

(2)pull一般用于本地已经存在的分支,用于同步

git pull origin AAA:BBB(AAA是远程分支,BBB是本地分支)

(缺省:BBB表示本地分支和远程分支同名,缺省AAA:BBB表示HEAD分支,origin唯一的时候也可以缺省)

(3)fetch一般用于获得本地不存在的分支,或者已知本地和远程分支有冲突想要先检查区别再合并的情况

fetch会修改FETCH_HEAD指针,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。(也当做一个分支名称就可以了)

git fetch origin AAA:BBB(同上)

(这里比较坑的一点即是缺省AAA:BBB表示的是master分支,不!是!HEAD!)

(4)git diff AAA:BBB 比较AAA分支到BBB分支的变化,如果结果太长建议使用重定向,让结果输出到文件(例如git diff AAA:BBB > a.diff )

(缺省:BBB,表示AAA分支到当前HEAD分支的变化,例如git diff FETCH_HEAD)

关于diff输出的标记符号:

参考:http://blog.csdn.net/zcube/article/details/42246331

@@ -AAA分支的起始行号,AAA分支的结束行号(如果之后一行逗号后面省略) +BBB分支的起始行号,BBB分支的结束行号(只有一行逗号后面省略) @@

(5)git merge AAA 表示AAA分支合并到当前分支(缺省AAA表示FETCH_HEAD分支合并到当前分支)

如果发生冲突,需要自己去文件中修改,文件中的标记如下:

<<<<<<<到=======是当前分支的文件内容,=======到>>>>>>>是合并文件的文件内容

7、栈

一般用于两种情况

(1)自己在本地上做了一些修改但由于没完成还不想提交,发现远程也做了一些修改,所以可以先把本地的修改加入到栈中,然后pull,在读出修改信息

(2)在开发中突然发现一个更重要的问题需要修改测试,可以把当前的部分没完成的工作加入到栈中

git stash 把所有unstaged和staged的文件修改加入到栈中

git stash pop 读出栈的修改(如发生冲突需要自己去修改)

git stash drop 扔掉栈中的第一条

git stash clear 清空栈

就先写到这里,其他的补充以后再添加

原文地址:https://www.cnblogs.com/qh4869/p/8577320.html

时间: 2024-07-30 04:43:45

GIT原理和常用命令速成的相关文章

Git 基本原理与常用命令

平时使用过两种版本控制软件 SVN 和 Git,平心而论,如果纯粹自己使用,那么绝对 Git 更加适合,本地库.远程库.离线工作.强大而灵活的分支.大名鼎鼎的Github, 这些都是选择 Git 的原因.记得刚接触时Git,感觉 Git 如此强大,再加上其是由大名鼎鼎的 Linus 所编写,所以花了很多的时间看各种资料,不过后来那些不常用的命令与功能还是仅仅停留在知道与了解的层面.Git 只是一种工具,是为了满足某种需求而被编写出来的一种工具,对于工具做到善加利用即可.当然,要做到善加利用,一定

Git本地库常用命令集

Git本地库常用命令集 以下所有的git命令都是在测试目录/git/下进行的.mkdir /git git init : 初始化git本地库在git本地库目录下执行该命令将会初始化一个git的本地库目录,此时在该目录下将会生成一个.git文件夹,其中包含有git本地库的配置文件及项目文件 git init git config [user.name][user.email] : 设置签名设置签名主要是为了使git能够区分提交代码的人员,其中签名级别又分为: 项目级别/仓库级别 : git con

git的一些常用命令

Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调各个版本的文档内容的一致性,这些文档包括但不限于代码文件.图片文件等等.早期SVN占据了绝大部分市场,而后来随着Git的出现,越来越多的人选择将它作为版本控制工具,社区也越来越强大.相较于SVN,最核心的区别是Git是分布式的VCS,简而言之,每一个你pull下来的Git仓库都是主仓库的一个分布式版

Git原理及常用操作命令总结

Git 原理 1.直接记录快照,而非差异比较 2.近乎所有操作都是本地执行 3.时刻保持数据完整性 4.多数操作仅添加数据 1.直接记录快照,而非差异比较 git 只关心文件数据的整体是否发生改变,而大多数其他系统则只关心文件内容的具体差异. git 并不保存这些前后变化的差异数据.git 更像把变化的文件作快照后,记录在一个微型的文件系统中,每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引.为了提高性能,若文件没有变化,git 不会再次保存,而只对

Git之 基本常用命令

Git基本常用命令如下: mkdir:         XX (创建一个空目录 XX指目录名) pwd:          显示当前目录的路径. git init          把当前的目录变成可以管理的git仓库,生成隐藏.git文件. git add XX       把xx文件添加到暂存区去. git commit –m “XX”  提交文件 –m 后面的是注释. git status        查看仓库状态 git diff  XX      查看XX文件修改了那些内容 git

git配置及常用命令

1.配置 1)在网上下载git软件.我的是Git-1.9.5-preview20150319.exe和TortoiseGit-1.8.14.0-64bit.msi. 安装完后,从开始菜单点击git bash 2)输入 ssh-keygen -C "[email protected]" -t rsa 来生成一对密钥,默认保存到~/.ssh目录. 3)输入git config --global user.email [email protected] git config --global

Git 入门和常用命令详解

git 使用使用教程   git 使用简易指南  常用 Git 命令清单 下载   https://git-scm.com/downloads 工作流 本地仓库由三部分组成. 工作区:保存实际的文件(本地实际的文件目录) 缓存区(Stage / Index):临时保存文件改动 HEAD:指向最近一次提交的后果 下图说明了 Git 的工作流程 图片来源:http://www.runoob.com Git 常用命令 git init 创建新仓库.在当前目录中创建新的 Git 仓库,生成.git文件夹

Git与GitHub常用命令

说在前面的话,本文是跟着张哥的 GitHub 系列教程操作的,张哥微信公众号: googdev 雾艹-.. 一直在出差(借口)- 看了一下两个月没写博客了,真是太TM可怕了!!! 赶紧补一发,压压惊 git 注:在使用的任何的 git 命令前,都要切换到 git 项目目录下 git init 初始化一个 git 仓库 git status 查看当前 git 仓库的状态 git add file 修改 file 文件的状态为添加,并没有提交,只是存在缓存区 git rm –cached file

Git配置和常用命令

Git配置 git config --global user.name "hunng" git config --global user.email "[email protected]" git config --global color.ui true git config --global alias.co checkout git config --global alias.ci commit git config --global alias.st sta