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里面存放着

  1. stage,
  2. git自动创建的第一个分支master
  3. 一个指向master的指针HEAD

git add添加文件后暂存区的状态变成这样

git commit提交文件后暂存区的状态变成这样

git追踪的是修改而非文件本身

  1. 新建一个文件

    git追踪的是修改
  2. git add进stage中

  3. 修改这个文件

    git追踪的是文件的修改
  4. git commit进repository中

    问题出现了: 发现commit的是第一次的修改(即:git追踪的是修改)

    原因在于: git追踪的是文件的修改,也就是只会commit被add进stage中的文件版本

    解决方法:

    1. 第一次修改 -> git add -> git commit -> 第二次修改 -> git add -> git commit
    2. 第一次修改 -> git add -> 第二次修改 -> git add -> git commit

撤销修改

git checkout -- file 是用版本库的版本替换工作区的修改

  1. 还没有git add到stage,撤销工作区的修改

  2. 已经git add到stage,撤销工作区的修改(add后再修改工作区)

    上面两种情况都能用: git checkout -- file

  3. 工作区已经修改,并且已经git add到stage(修改工作区再add)

    git reset [version] file 是将stage撤销到work directory

    //先用reset把暂存区的修改撤销掉(unstage),重新放回工作区
    git reset HEAD file
    //然后用checkout丢弃工作区的修改
    git checkout -- file

删除文件

处理使用rm或者右键删除的文件

  1. 的确要删除文件 git rm file
  2. 无操作删除,想要恢复 git checkout -- file用版本库的最新版本替换工作区的修改

创建ssh秘钥

ssh-keygen -t rsa -C "youremail@example.com"

远程仓库

  1. 关联远程仓库

    git remote add origin [address]

    git remote add origin [branch] [address]

  2. 将本地仓库推送至远程仓库

    //第一次推送
    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
  3. 列出远程仓库的分支

    git remote

  4. 从远程仓库克隆

    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

多人协作的工作模式通常是这样:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功
  5. 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系1. 没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

分支管理

  1. Git中默认创建一条主分支叫做master,而HEAD指向这个主分支master,master再指向最新的commit

  2. 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上

  3. 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变

  4. 假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并

  5. 合并完分支后,可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支(最少要有一条master分支)

分支管理相关命令

  1. 创建并切换到分支

    git checkout -b [branchName]
    git switch -c [branchName]

    关于参数 -b

    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev    //创建分支
    $ git checkout dev //切换分支
    Switched to branch 'dev'
  2. 创建分支

    git branch [branchName]

  3. 切换分支

    git checkout [branchName]

  4. 查看分支

    git branch

  5. 合并分支

    git merge [branchName]

  6. 删除分支

    git branch -d [branchName]
    git branch -D [branchName] //用于当分支文件时进行强制删除
  7. 恢复分支

    git branch [SHA1] [Version]
    git branch e4d9s89 HEAD //例子

分支之解决冲突

  1. 正常的冲突情况

    1. 新分支上修改了文件,并正常添加、提交
    2. master分支上无法看到dev分支上的改动,冲突产生

    解决方法:

    直接git merge,此时的模式为fast-forward模式

  2. 第一种冲突

    1. 新分支上修改了文件,正常添加、提交

    2. master分支上也修改了文件且内容不同,正常添加、提交

    3. 在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.
    4. master分支和feature1分支各自都分别有新的提交,变成了这样:

    解决方法:

    1. 打开文件查看冲突处
    <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> feature1
    1. 在主分支中手动修改不同处(我们希望的内容)并添加、提交

merge时禁用Fast Forward模式

git merge --no-ff -m [description] [branchName]

可以看到,不使用Fast forward模式,merge后就像这样:

git stash区

作用:当分支工作没完成不能提交,但是又有新任务需要马上做时,就可以使用git stash当前分支中的work directory冻结起来

git stash相关命令

  1. git stash 冻结当前分支的工作区
  2. git stash list 查看有哪些stash
  3. git stash apply 恢复到最近的stash,并且不删除stash信息
  4. git stash pop 恢复到最近的stash,并且删除stash信息
  5. git stash apply stash@{num} 恢复到指定的stash
  6. git 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,例如:

  1. 如果没有tag,就应该是我要恢复到sd67gh7那个commit
  2. 有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的更多相关文章

  1. 看完我的笔记不懂也会懂----bootstrap

    目录 Bootstrap笔记 知识点扫盲 容器 栅格系统 源码分析部分 外部容器 栅格系统(盒模型)设计的精妙之处 Bootstrap笔记 写在开始: 由于我对AngulaJS的学习只是一个最浅显的过 ...

  2. 看完我的笔记不懂也会懂----AngulaJS

    目录 Angular.js学习笔记 ng-app(指令) ng-model ng-init angular之表达式 双向数据绑定 数据流向的总结 作用域对象 控制器对象 依赖对象与依赖注入 命令式与声 ...

  3. 看完我的笔记不懂也会懂----Node.js

    Node.js 学习 - 命令行窗口 - 进程与线程 - ECMAScript的缺点 - Node模块化 - Node中的全局对象 - 包 package - NPM包管理器 (Node Packag ...

  4. 看完我的笔记不懂也会懂----javascript模块化

    JavaScript模块化 模块化引子 模块化的历史进化 模块化规范 CommonJS规范 Node.js(服务器端) 下项目的结构分析 browerify(浏览器端) 下项目的结构分析 AMD规范 ...

  5. 看完我的笔记不懂也会懂----less

    目录 Less学习 语法篇 注释 变量 映射(Maps) @规则嵌套和冒泡 less中的嵌套规则 less中的混合 less的运算 extend延伸/继承 less忽略编译(转义) 导入(Import ...

  6. 看完我的笔记不懂也会懂----MongoDB

    MongoDb数据库学习 - 数据库的分类 - 数据库基本概念 - MongoDB常用指令 - MongoDB的CURD - sort({key:*[1,-1]}).limit(num).skip(n ...

  7. 看完我的笔记不懂也会懂----MarkDown使用指南

    目录 语法 [TOC] 自动生成目录 1. 标题 2. 文本强调 3. 列表 4. 图片 5. 超链接 6. 文本引用 7. 分割线 8. 代码 9. 任务列表 (MPE专属) 10. 表格 11. ...

  8. 看完我的笔记不懂也会懂----ECMAscript 567

    目录 ECMAscript 567 严格模式 字符串扩展 数值的扩展 Object对象方法扩展 数组的扩展 数组方法的扩展 bind.call.apply用法详解 let const 变量的解构赋值 ...

  9. 看完我的笔记不懂也会懂----Ajax

    Ajax(Asynchronous JavaScript And XML) - 本次学习所用到的插件 - XML - JSON - 关于AJAX - HTTP协议 - AJAX重点之XMLHttpRe ...

随机推荐

  1. MiniProfiler性能分析工具— .Net Core中用法

    前言: 在日常开发中,应用程序的性能是我们需要关注的一个重点问题.当然我们有很多工具来分析程序性能:如:Zipkin等:但这些过于复杂,需要单独搭建. MiniProfiler就是一款简单,但功能强大 ...

  2. 通过HBase Observer同步数据到ElasticSearch

    Observer希望解决的问题 HBase是一个分布式的存储体系,数据按照RowKey分成不同的Region,再分配给RegionServer管理.但是RegionServer只承担了存储的功能,如果 ...

  3. Hive 中日志的存放位置

    目前hive启动无法成功,想查看下hive的日志定位问题,但发现hive的安装目录下并没有hive的日志,后来经过在网上谷歌发现: Hive中的日志分为两种 系统日志,记录了hive的运行情况,错误状 ...

  4. inceptor es表插入成功,返回报错you should set transaction.type before any DCL statement

    在finebi下用星环的连接驱动去写inceptor es表,发现插入能成功,但是返回一个报错: Caused by: java.sql.SQLException: Error to commit. ...

  5. Inceptor常用SQL

    1.创建数据库 建一个数据库exchange_platform. DROP DATABASE IF EXISTS exchange_platform CASCADE; CREATE DATABASE ...

  6. 【noi 2.7_7219】复杂的整数划分问题(算法效率)

    题意:若干组数据,分别问 N划分成K个正整数之和的划分数目.N划分成若干个不同正整数之和的划分数目.N划分成若干个奇正整数之和的划分数目. 解法:请见我之前的一篇博文内的Article 2--[noi ...

  7. hdu 4521 小明系列问题——小明序列 线段树

    题意: 给你一个长度为n的序列v,你需要输出最长上升子序列,且要保证你选的两个相邻元素之间在原数组中的位置之差大于d 题解: 这个就是原来求最长上升子序列的加强版,这个思路和最长上升子序列的差不多   ...

  8. SpringSecurity简单使用

    什么是SpringSecurity? Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置 ...

  9. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  10. H5网页应用打包安卓App (全网最详细教程)

    img { box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important } .red { color: rgba(255, 0, 0, 1) } ...