看完我的笔记不懂也会懂----git
- Git学习笔记
- 什么是Git
- 首次使用Git
- DOS常用命令
- Git常用命令
- 关于HEAD
- 版本回退
- 工作区、暂存区与版本库
- git追踪的是修改而非文件本身
- 撤销修改
- 删除文件
- 创建ssh秘钥
- 远程仓库
- 远程仓库之远程协助
- 分支管理
- 分支管理相关命令
- 分支之解决冲突
- merge时禁用Fast Forward模式
- git stash区
- 标签管理
Git学习笔记

什么是Git
git是一个分布式版本控制系统
首次使用Git
//参数 --global代表机器上所有的仓库都默认使用这个配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
DOS常用命令
ls //显示指定路径上所有文件或目录的信息
dir //显示指定路径上所有文件或目录的信息
pwd //查看当前路径
mkdir //创建文件夹目录
rd //删除文件夹目录
cd 路径 //切换至指定路径
Git常用命令
git init //初始化当前目录作为git仓库
git add 文件 //添加文件到git仓库的暂存区
git commit -m //提交文件到git仓库的版本库(当前分支)
git status //查看当前git仓库的状态
git diff //比较工作区与最后一次commit的不同
git log //命令显示从最近到最远的提交日志
git log --pretty=oneline //让输出的日志更加简洁
git log --graph --pretty=oneline --abbrev-commit //输出分支合并图
git reflog //查看最近的版本操作记录
rm //删除文件
关于HEAD
HEAD指向git当前的最新版本
HEAD^指向git上一个版本 HEAD^是上上个版本
跨越多个版本可以使用 HEAD~版本数
版本回退
回退到上一个commit
git reset --hard HEAD^
回退到指定版本
git reset --hard SHA号
工作区、暂存区与版本库
工作区(work directory): 就是git init后的我们能看到的那个文件夹目录
暂存区(stage/index): git add后文件存放的地方
版本库(repository): git commit后文件存放的地方
repository里面存放着
- stage,
- git自动创建的第一个分支master
- 一个指向master的指针HEAD
git add添加文件后暂存区的状态变成这样
git commit提交文件后暂存区的状态变成这样
git追踪的是修改而非文件本身
新建一个文件
git追踪的是修改
git add进stage中修改这个文件
git追踪的是文件的修改
git commit进repository中
问题出现了: 发现commit的是第一次的修改(即:git追踪的是修改)
原因在于: git追踪的是文件的修改,也就是只会commit被add进stage中的文件版本
解决方法:第一次修改 -> git add -> git commit -> 第二次修改 -> git add -> git commit第一次修改 -> git add -> 第二次修改 -> git add -> git commit
撤销修改
git checkout -- file 是用版本库的版本替换工作区的修改
还没有
git add到stage,撤销工作区的修改已经
git add到stage,撤销工作区的修改(add后再修改工作区)
上面两种情况都能用:git checkout -- file工作区已经修改,并且已经
git add到stage(修改工作区再add)
git reset [version] file 是将stage撤销到work directory//先用reset把暂存区的修改撤销掉(unstage),重新放回工作区
git reset HEAD file
//然后用checkout丢弃工作区的修改
git checkout -- file
删除文件
处理使用rm或者右键删除的文件
- 的确要删除文件
git rm file - 无操作删除,想要恢复
git checkout -- file用版本库的最新版本替换工作区的修改
创建ssh秘钥
ssh-keygen -t rsa -C "youremail@example.com"
远程仓库
关联远程仓库
git remote add origin [address]git remote add origin [branch] [address]将本地仓库推送至远程仓库
//第一次推送
git push -u [remoteName] [branchName]
//例子
git push -u origin master //以后推送
git push [remoteName] [branchName]
//例子
git push origin master //关于参数-u
作用是:可以简化git push操作,即以后git push可以代替git push origin master
列出远程仓库的分支
git remote从远程仓库克隆
git clone [address]
远程仓库之远程协助
查看远程仓库信息
git remote
git remote -V //显示更加详细(包含fetch和push地址)
在本地创建和远程分支对应的分支
git checkout -b [branchName] [remoteName]/[branchName]
建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>推送自己的修改 - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并 - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功 - 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系1. 没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>
分支管理
Git中默认创建一条主分支叫做master,而HEAD指向这个主分支master,master再指向最新的commit
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并
合并完分支后,可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支(最少要有一条master分支)
分支管理相关命令
创建并切换到分支
git checkout -b [branchName]
git switch -c [branchName]
关于参数 -b
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:$ git branch dev //创建分支
$ git checkout dev //切换分支
Switched to branch 'dev'
创建分支
git branch [branchName]切换分支
git checkout [branchName]查看分支
git branch合并分支
git merge [branchName]删除分支
git branch -d [branchName]
git branch -D [branchName] //用于当分支文件时进行强制删除
恢复分支
git branch [SHA1] [Version]
git branch e4d9s89 HEAD //例子
分支之解决冲突
正常的冲突情况
- 新分支上修改了文件,并正常添加、提交
- master分支上无法看到dev分支上的改动,冲突产生
解决方法:
直接git merge,此时的模式为fast-forward模式第一种冲突
新分支上修改了文件,正常添加、提交
master分支上也修改了文件且内容不同,正常添加、提交
在master分支上
git merge时,冲突产生$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
master分支和feature1分支各自都分别有新的提交,变成了这样:
解决方法:
- 打开文件查看冲突处
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
- 在主分支中手动修改不同处(我们希望的内容)并添加、提交
merge时禁用Fast Forward模式
git merge --no-ff -m [description] [branchName]
可以看到,不使用Fast forward模式,merge后就像这样:
git stash区
作用:当分支工作没完成不能提交,但是又有新任务需要马上做时,就可以使用git stash将当前分支中的work directory冻结起来
git stash相关命令
git stash冻结当前分支的工作区git stash list查看有哪些stashgit stash apply恢复到最近的stash,并且不删除stash信息git stash pop恢复到最近的stash,并且删除stash信息git stash apply stash@{num}恢复到指定的stashgit stash pop stash@{num}恢复到指定的stash
//实例
git status //当前在master分支
git switch -c dev //创建并切换至dev分支
//突然有紧急任务。。。。
git stash //冻结当前分支(dev)
git switch -c task / /创建并切换至紧急任务分支
//完成紧急任务
git checkout master //切换master分支,准备合并刚刚完成的紧急任务
git merge --no-ff -m 'finish task' task //合并刚刚完成的紧急任务
git switch dev //切换至dev分支
git branch -d task //删除已经完成任务了的task分支
git stash list //查看stash的列表
git stash pop //解冻刚刚的工作区并删除stash list信息
标签管理
打标签是将标签放在一个commit上,作用是:更方便、迅速的找到对应的commit,例如:
- 如果没有tag,就应该是我要恢复到
sd67gh7那个commit - 有tag的话,就应该是,我要恢复到
version1.0
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
标签的相关命令:
查看标签
git tag
在当前最新commit上打下标签
git tag [tagName]
在指定commit上打下标签
git tag [tagName] [SHA]
在打标签时附带说明
git tag -a [tagName] -m [description] [SHA]
查看指定tag的信息
git show [tagName]
删除tag标签
git tag -d [tagName]
推送某个标签到远程
git push origin <tagName>
推送全部标签到远程
git push origin --tags
删除远程指定标签
git push origin :refs/tags/[tagName]
看完我的笔记不懂也会懂----git的更多相关文章
- 看完我的笔记不懂也会懂----bootstrap
目录 Bootstrap笔记 知识点扫盲 容器 栅格系统 源码分析部分 外部容器 栅格系统(盒模型)设计的精妙之处 Bootstrap笔记 写在开始: 由于我对AngulaJS的学习只是一个最浅显的过 ...
- 看完我的笔记不懂也会懂----AngulaJS
目录 Angular.js学习笔记 ng-app(指令) ng-model ng-init angular之表达式 双向数据绑定 数据流向的总结 作用域对象 控制器对象 依赖对象与依赖注入 命令式与声 ...
- 看完我的笔记不懂也会懂----Node.js
Node.js 学习 - 命令行窗口 - 进程与线程 - ECMAScript的缺点 - Node模块化 - Node中的全局对象 - 包 package - NPM包管理器 (Node Packag ...
- 看完我的笔记不懂也会懂----javascript模块化
JavaScript模块化 模块化引子 模块化的历史进化 模块化规范 CommonJS规范 Node.js(服务器端) 下项目的结构分析 browerify(浏览器端) 下项目的结构分析 AMD规范 ...
- 看完我的笔记不懂也会懂----less
目录 Less学习 语法篇 注释 变量 映射(Maps) @规则嵌套和冒泡 less中的嵌套规则 less中的混合 less的运算 extend延伸/继承 less忽略编译(转义) 导入(Import ...
- 看完我的笔记不懂也会懂----MongoDB
MongoDb数据库学习 - 数据库的分类 - 数据库基本概念 - MongoDB常用指令 - MongoDB的CURD - sort({key:*[1,-1]}).limit(num).skip(n ...
- 看完我的笔记不懂也会懂----MarkDown使用指南
目录 语法 [TOC] 自动生成目录 1. 标题 2. 文本强调 3. 列表 4. 图片 5. 超链接 6. 文本引用 7. 分割线 8. 代码 9. 任务列表 (MPE专属) 10. 表格 11. ...
- 看完我的笔记不懂也会懂----ECMAscript 567
目录 ECMAscript 567 严格模式 字符串扩展 数值的扩展 Object对象方法扩展 数组的扩展 数组方法的扩展 bind.call.apply用法详解 let const 变量的解构赋值 ...
- 看完我的笔记不懂也会懂----Ajax
Ajax(Asynchronous JavaScript And XML) - 本次学习所用到的插件 - XML - JSON - 关于AJAX - HTTP协议 - AJAX重点之XMLHttpRe ...
随机推荐
- C++模板的介绍
作者:良知犹存 转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN 1. 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码.C++模板的作用,类 ...
- Python爬虫入门教程:豆瓣Top电影爬取
基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一. ...
- 2019ICPC南昌邀请赛 Sequence
题意:给出n个点的权值,m次操作,操作为1时为询问,每次询问给出 l 和 r ,求 f(l,r).操作为0时为修改权值.f(l,r)=f(l,l)⊕f(l,l+1)⊕⋯⊕f(l,r)⊕f(l+1,l+ ...
- 【uva 247】Calling Circles(图论--Floyd 传递闭包+并查集 连通分量)
题意:有N个人互相打了M次电话,请找出所有电话圈(Eg.a→b,b→c,c→d,d→a 就算一个电话圈)并输出.(N≤25,L≤25,注意输出格式) 解法:由于N比较小所有n^2或n^3的复杂度都没有 ...
- 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)
题意:给一个N(N<=100)个点的联通图(无自环和平行边),求苗条度(最大边-最小边的值)尽量小的生成树. 解法:枚举+Kruskal.先从小到大排序边,枚举选择的最小的边. 1 #inclu ...
- Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment、Captain Flint and a Long Voyage
题目链接:Captain Flint and Crew Recruitment 题意: t组输入,每一组输入一个n.这里我们说一下题目定义的近似质数概念: "如果可以将正整数x表示为p⋅q, ...
- hdu5371 Hotaru's problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...
- Keepalived+LVS实现LNMP网站的高可用部署
Keepalived+LVS实现LNMP网站的高可用部署 项目需求 当我们访问某个网站的时候可以在浏览器中输入IP或者域名链接到Web Server进行访问,如果这个Web Server挂了, ...
- 力扣119.杨辉三角II-C语言实现
题目 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 来源:力扣(LeetCod ...
- Linux 驱动框架---cdev字符设备驱动和misc杂项设备驱动
字符设备 Linux中设备常见分类是字符设备,块设备.网络设备,其中字符设备也是Linux驱动中最常用的设备类型.因此开发Linux设备驱动肯定是要先学习一下字符设备的抽象的.在内核中使用struct ...