git知识总结-2.git基本操作之原理说明
0.前言
本文主要对git常用命令的工作原理做一个详细的说明,常用命令主要包括:
1.git add
git add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。
2. git commit
git commit主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。
3. git branch
关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作。
4. git merge
merge命令把不同的分支合并起来。如下图,在实际开发中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。
注:一般在merge之后,会出现conflict,需要针对冲突情况,手动解除冲突。主要是因为两个用户修改了同一文件的同一块区域。如下图所示,需要手动解除。
5. git rebase
rebase又称为衍合,是合并的另外一种选择。在开始阶段,我们处于new分支上,执行 git rebase dev ,那么new分支上新的commit都在new分支上重演一遍,最后checkout切换回到new分支。
这一点与merge是一样的,合并前后所处的分支并没有改变。
git rebase dev ,通俗的解释就是new分支想站在dev的肩膀上继续下去。rebase也需要手动解决冲突。
注1: merge与rebase的区别,请参考 <<merge与rebase区别>>
注2:在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,如果此时运行git pull -r,也就是git pull –rebase,相当于git fetch + git rebase,参考:简单对比git pull和git pull --rebase的使用
6. git pull
当你使用git pull时,它将会获取远程服务器(你请求的,无论什么分支)上的代码,并且立即合并到你的本地厂库,pull是一个高等级的请求,默认会支持fetch+merge的操作,如果不是为了使用上的方便,你可以完全不使用它。
1 $git checkout localbranch
2 $git pull origin master
3 $git branch
4 master
5 *localbranch
上面的命令会将远程服务器上的master分支合并到localbranch中。
7. git fetch
fetch和pull很相似,只是fetch不会做任何的合并操作。
1 $git checkout localbranch
2 $git fetch origin remotebranch
3 $git branch
4 master
5 *localbranch
6 remotebranch
因此,fetch指是获取remotebranch,然后创建一个本地copy,你不应该直接对这个copy做任何的操作,而应该应该创建一个本地分支,然后在本地分支上进行工作。
8. git Clone
clone将会克隆一个本地厂库,
1 $cd newfolder
2 $git clone git@github.com:whatever/something.git
3 $git branch
4 *master
5 remotebranch
clone会为它被克隆的远程repo创建一个名为“origin”的local repo,并为远程repo的活动分支创建一个本地分支以及远程跟踪分支。
9. git reset
reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区。
如下图显示了soft mixed和--hard的作用范围。
10. git checkout
1.切换到某个分支
git checkout hotfix
上面这个命令做的不过是将HEAD移到一个新的分支,然后更新工作目录。
因为这可能会覆盖本地的修改,Git 强制你提交或者缓存工作目录中的所有更改,不然在 checkout 的时候这些更改都会丢失。和 git reset
不一样的是,git checkout
没有移动这些分支。
2.切换都某个提交或恢复文件的两种用法
git checkout [<commit>] [--] <paths> ... 注:其中---表示路径标记,以免路径和分支同名时用以区分
第1种用法(包含<paths>的用法)不会改变HEAD头指针,主要使用于指定版本的文件覆盖工作区中对应的文件。
如果省略<commit>,如git checkout paths,则会用暂存区的文件覆盖工作区中的文件,否则git checkout commit paths用指定提交中的文件覆盖暂存区和工作区中的对应文件
第2种用法(不包含<paths>的用法)单纯的检出某个commit或分支,如git checkout commit或git checkout branch是会改变HEAD头指针的。
只有当HEAD切换到某个分支的时候如git checkout branch才可以对提交进行跟踪,否则就会进入“分离头指针”的状态。如果省略用法2后面的<branch>如git checkout,则默认对工作区进行状态检查
这和 checkout 到另一个分支是完全一样的:把 HEAD 移动到特定的提交。比如,下面这个命令会 checkout 到当前提交的祖父提交。
git checkout HEAD~2
这对于快速查看项目旧版本来说非常有用。但如果你当前的 HEAD 没有任何分支引用,那么这会造成 HEAD 分离。这是非常危险的,如果你接着添加新的提交,然后切换到别的分支之后就没办法回到之前添加的这些提交。因此,在为分离的 HEAD 添加新的提交的时候你应该创建一个新的分支。
11. git revert
git revert用一个新提交来消除一个历史提交所做的任何修改
注:revert与reset的区别
(1)git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
(2)在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。
因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,减少冲突。
但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入,产生很多冲突。
(3)git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
12. git push
上传本地仓库分支到远程仓库分支,实现同步。
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,
第一个master是本地分支名,第二个master是远程分支名
1. git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
2. git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
3. git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
4. git push
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
5 git push 的其他命令
这几个常见的用法已足以满足我们日常开发的使用了,还有几个扩展的用法,如下:
(1) git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式.如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置
(2) git push --all origin 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项
(3) git push --force origin git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。
(4) git push origin --tags //git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令
13.其他命令
参考文档
1.http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html git checkout 命令详解
2.https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-%E4%BB%A3%E7%A0%81%E5%9B%9E%E6%BB%9A%EF%BC%9AReset%E3%80%81Checkout%E3%80%81Revert-%E7%9A%84%E9%80%89%E6%8B%A9 代码回滚:Reset、Checkout、Revert 的选择
git知识总结-2.git基本操作之原理说明的更多相关文章
- git知识总结-2.git基本操作之操作汇总
0.前言 一般来说,日常使用只要记住下图6个命令,就可以了.但是熟练使用,恐怕要记住60-100个命令. 上图分别为: Workspace:工作区 Index / Stage:暂存区 Reposito ...
- Git知识总览(四) git分支管理之rebase 以及 cherry-pick相关操作
上篇博客聊了<Git知识总览(三) 分支的创建.删除.切换.合并以及冲突解决>,本篇博客我们主要来看一下 rebase 变基相关的操作.rebase 操作和 merge 操作最终都可以达到 ...
- Git知识总览(二) git常用命令概览
上篇博客我们从 git clone 和 git status 两个命令开始,引出了一系列的git操作命令, 请参见:<Git知识总览(一) 从 git clone 和 git status 谈起 ...
- git知识总结-1.git基础之数据存储
1.前言 git包含四种对象文件: blob tree commit tag(目前没用到,暂时忽略) 2. git对象的关系 图 git三种对象关系 粗略一看,可以大致感觉出blob类似于文件 ...
- Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
上篇博客聊了<git分支管理之rebase 以及 cherry-pick相关操作>本篇博客我们就以Learning Git中的关卡进行展开.下方列举了LearningGit中的 merge ...
- Git知识总览(六) Git分支中的远程操作实践
前几篇博客陆陆续续的讲了好多关于Git操作的内容,本篇博客仍然也不例外,不过本篇博客的主题是关于git的远程操作的.依照之前博客的风格,我们依然依托于LearningGitBranch中的相关内容来探 ...
- git知识总结-4.git服务器搭建及迁移git仓库
1. 前言 因为手里有一份代码之前是直接从其它git服务器上克隆下来的,现在想自己搭建一个git服务器把这份代码管起来. 2. 搭建git服务器 1.安装git: $ sudo apt-get ins ...
- git知识总结-1.git基础之git reference
1.前言 Git版本管理的内容,是一系列由40bytes SHA-1字符串所代表patch,而Git References,则是对这些字符串的引用(也可以理解为别名).为什么需要别名呢?因为这些字符串 ...
- git知识总结-1.git基础之git分布式
1.前言 我们在介绍git版本管理的时候,没有提到“服务器”的概念,所有的版本管理操作,都是在本地进行的.这就是git与其它版本管理工具(如CVS.SVN等)最本质的区别所在:分布式. 所谓的分布式, ...
随机推荐
- Colorful Bricks CodeForces - 1081C ( 组合数学 或 DP )
On his free time, Chouti likes doing some housework. He has got one new task, paint some bricks in t ...
- centos7重置root密码
修改centos7的root密码重置非常简单,只需要登录系统,执行passwd按enter即可, 但是如果忘记root密码,该如何修改呢 1, 重启系统之后,系统启动进入欢迎界面,加载内核步骤时,选中 ...
- 总结idea几个实用的快捷键
Ctrl+R,替换文本Ctrl+F,查找文本 Ctrl+shit+R,全局替换文本Ctrl+shit+F,全局查找文本 Ctrl+Alt+L,格式化代码Alt+Insert,可以生成构造器/Gette ...
- MDS
转载:https://blog.csdn.net/victoriaw/article/details/78500894 多维缩放(Multidimensional Scaling, MDS)是一组对象 ...
- JQ高级
一.选择器 css语法选择器 $('css3 选择器位‘) 索引匹配 $('div:eq(0)') $('div').eq(0) 内容 $('div:contains(标签文本内容)') // 注:采 ...
- zsh!oh-my-zsh! 好看的主题和插件以及我的.zshrc
题外话,由于clear每次打的很麻烦,可以直接使用ctrl+L清屏,和clear等效. First: 安装好zsh和oh-my-zsh Second: 接下来就可以开始享受了 主题:cloud 满 ...
- python经典例题100题01
[程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? ans = [i*100+j*10+k for i in range(1, 5) for j in ra ...
- MySQL数据库、表常用操作
1.按条件查询表中数据: mysql> select user,host,password from user; 2.按组合条件查询表中数据: mysql> select id, pass ...
- Java基础 -- 持有对象(容器)
一 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 Class clazz; 也可以通过数组来持有多个对象,如 Class[] ...
- Maven(一)简介安装
一.什么是maven,它能干什么? ①:maven maven是一个项目管理工具.它包含了一个项目对象模型,一组标准集合,一个生命周期,一个依赖管理系统,和用来运行定义生命周期中插件目标的逻辑. 传统 ...