1.Git介绍

  • Git是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。
  • Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。
  • Git 是根据GNU的GPL(通用公共许可证)V2的条款分发的自由/免费软件,安装参见:http://git-scm.com/
  • Git本身可以做到版本控制,但其所有版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。
  • GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。

集中式版本控制系统与分布式版本控制系统的区别

  • 集中式

    版本库是集中存放在中央服务器,用户客户端只有文件的某个版本.

    需要的时候,用户先从中央服务器下载最新版本的文件到本地电脑,然后开始修改,修改完成后再把自己修改后的版本推送给中央服务器。

    集中式版本控制系统最大的毛病就是必须联网才能工作,如果客户端到中央服务器的网络不好的时候,就会很影响工作的效率.

  • 分布式

    远程服务器保存所有版本,用户客户端也可以保存所有版本

    分布式版本控制系统中每个人的电脑上都有一个完整的版本库.需要的时候,可以不需要联网,因为版本库就在你自己的电脑上。

    多人协同工作的时候,一个用户在自己电脑上改了文件A,另一个人在他的电脑上改了文件B,工作结束只需把各自的修改推送给对方,就可以互相看到对方的修改了。

2. 配置git的用户信息

git config --global user.name 'your_name'
git config --global user.email 'your_email'

git config的三个作用域

缺省等同于local

git config --local			# 只对某个git仓库有效
git config --global # global对当前用户所有仓库有效
git config --system # system对系统所有登录的用户有效

显示config的配置,加--list

git config --list --local
git config --list --global
git config --list --system

3.git仓库管理

3.1 初始化git仓库

1.把已有的项目代码纳入git管理

cd 项目代码所有文件夹
git init

2.新建的项目直接用git管理

cd 某个文件夹
git init your_project # 会有当前路径下创建和项目名称同名的文件夹
cd your_project

3.2 往仓库里添加文件

git add files       # 添加文件
git add . # 把工作区所有文件移动在暂存区
git commit # 提交信息,加上 -a 选项可以把暂存区里的所有文件都进行提交

3.3 文件重命名和删除

git mv old_file_name new_file_name
git rm file_name

3.4 通过git log查看版本演变历史

查看版本演变历史的命令

git log

可添加的选项:
--oneline # 以每一行的方式查看当前分支的所有提交日志
--pretty=online # 用commit id(版本号)显示修改记录,减少log文件的输出,使每条记录只输出一行
-n4 # 以每一行的方式查看当前分支最近的4条提交日志
--all # 查看所有分支的提交日志
--graph # 以图形化方式查看提交日志

可以通过gitk图形界面工具来查看版本历史

3.5 查看git仓库的信息

git status                      查看当前git仓库的状态
git diff * 检查上一次对文件所做的修改内容
git log 查看版本库的修改历史记录
git reflog 用来记录每一次命令(查询某次修改的版本号)

3.6 git的区域状态说明

工作区:

工作区(word directory)就是在电脑上能看到的目录
当前开发程序所在的目录为工作区,该区域的文件会有状态变化且状态由git自动检测
目录中的文件的任何变化(增,删,改),git都会检测到,可以使用git status命令查看

版本库:

版本库(repository)工作区有一个隐藏目录.git,保存的就是git的版本库
工作区检测到有文件发生变化,那么意味着文件状态被改变,这时就可以当做一个版本进行提交

工作区的代码通过git add来加入到暂存区,使用git commit命令把暂存区的文件加入到当前分支的(一般为git自动创建master的分区)

git的版本库中一个区域,称之为stage(或者叫index)的暂存区.
在工作区的文件被修改,使用`git status`查看状态时,显示文件的颜色为红色
使用`git add`把文件从工作区移到暂存区,再使用`git status`查看状态时,显示文件的颜色为绿色

3.7 git区域操作

git checkout --filename         撤销工作区的修改,把工作区的文件恢复到暂存区的状态
如果文件修改后还未放到暂存区,撤消修改就回到未修改之前的状态
如果文件修改后已添加到暂存区,撤消修改就回到添加进暂存区时的状态
git reset HEAD filename 把暂存区的修改撤消掉,重新放回到工作区,这条命令是在把修改后的文件提交到暂存区之后又后悔了,使文件恢复到版本库的状态
git reset HEAD 取消暂存区所有文件
git reset HEAD -- index.html 把暂存区中的index.html恢复成跟工作区一样,可以添加多个文件
git checkout -- index.html 把工作区恢复成和暂存区一样
git stash 储存当前工作现场
git stash list 查看stash区域的所有信息
git stash apply 取出stash区域中的文件放到当前工作区,但是文件还保存在stash区域中,可以反复使用
git stash drop 删除最近一次储存的stash
git stash pop 取出stash区域中的文件放到当前工作区中,文件不会继续保存到stash区域中
git stash stash@{num} 恢复指定stash
  • 注意

    • 若误删文件时,使用git checkout --filename 来恢复到未删除之前的状态
    • 确实要删除一个文件,使用git rm filename将其从git版本库中删除
    • git checkout和git reset都是在将文件add到暂存区,没有commit时的撤消修改
    • 若已经将文件从暂存区commit到版本库而未推送到远程时,可以回退到上一个版本
    • 若文件已经被推送到远程,则无法撤消

需要注意的是,git是对文件更改的管理,不是基于文件的管理

4.git分支及合并操作

git branch                                  # 查看当前分支并且看到在哪个分支下工作
git branch -v # 查看本地git分支
git branch -av # 查看所有分支及其详细信息,如果添加远程仓库,会显示远程仓库上的分支
git branch dev # 创建一个dev分支
git checkout -b dev # 创建dev分支并切换到dev分支上工作
git checkout -b temp 5ccb4b3 # 基于5ccb4b3这个版本创建一个temp的分支
git checkout -b branch2 branch1 # 基于branch1分支创建并切换到branch2分支
git checkout dev # 切换到dev分支
git checkout master # 切换回master分支
git branch -d dev # 删除dev分支,删除分支时,分支相关的信息也会被删除
git branch -D branch_name # 删除指定分支,删除分支时,分支相关的信息也会被删除
git checkout --* # 把文件返回到修改之前的状态
git merge dev # 把dev分支合并到当前分支
git merge --no-ff -m "commit_message" dev # 不使用fast forward模式合并dev分支到当前分支

需要注意的是:

  • 1.合并分支的时候如果出现冲突,那么将会出现冲突提醒,此时修改文件,解决冲突后再次提交就可以了
  • 2.可以使用git log或者git log --graph指令来查看分支与分支合并情况
  • 3.通常在合并分支时,一般都是用fast forward模式,但是不能执行快速合并而且不会起冲突,这时合并之后就会做一次新的提交.
  • 4.当基于某个远程分支创建并切换到新的分支修改并commit之后,如果要提交到远程分支时,可以直接使用 git push 把本地分支的修改同步到远程仓库的指定分支(如果不是基于远程master分支创建则同步到远程仓库时也会同步到远程非master分支)
  • 5.修复bug时,需要新建并切换到bug分支.bug修复并提交后,合并到主分支,然后将临时bug分支删除.此时把临时bug分支快速合并到主分支后,临时bug分支里的提交信息就会消失,此时可以不使用快速合并,使用递归合并的方式将临时bug分支提交到主分支,这样临时bug分支里的提交信息也可以保留

5.版本回退

git reset --hard HEAD^          回退到上一个版本
git reset --hard HEAD^^ 回退到上两个版本
git reset --hard 123456 回退到版本号为123456的版本
git reset --hard commit_id^ 回退到指定commit_id的版本
  • 注意

    • HEAD^为上上一个版本,HEAD表示当前版本
    • 使用git reset命令回退后,再使用log命令将只能获得当前HEAD版本之前的版本,此时可以使用git reflog找到比当前版本新的版本的commit id就可以回滚回去了
    • log命令可以查看提交历史,reflog可以查看命令历史

6.忽略文件的推送

有的时候,提交推送的时候不想提交某些文件,此时可以在这个项目根目录下新建一个名为.gitignore的文件,

在这个文件里可以进行配置提交的时候忽略哪些文件,配置使用正则表达式的形式.

比如:

*.py                忽略所有的以py结尾的文件
test/a.* 忽略test目录下所有的以a开头的文件
test/[abc].py 忽略test目录下a.py或b.py或c.py这三个文件
[abc] 忽略根目录下a或b或c这三个文件
test/* 忽略test目录下的所有文件
!test/a.py 忽略test目录下不是a.py以外的所有文件,即只提交a.py这个文件

配置完成后,需要清除本地缓存,然后再次提交.

清除本地缓存的命令:

git rm -f --cached .

7.git diff命令

git diff                                    # 比较工作区和暂存区所有文件的差异
git diff 3c6fab966158f9 72ec71f3c2aa # 比较两次提交的差异
git diff HEAD HEAD~1 # git上一次提交与上上一次提交的差异
git diff HEAD HEAD^1^1 # git上一次提交与前两次提交的差异
git diff HEAD HEAD~2 # git上一次提交与前两次提交的差异
git diff HEAD HEAD^1 # git上一次提交与上上一次提交的差异
git diff HEAD HEAD^1 -- index.html # git上一次提交与上上一次提交中index.html文件的不同
git diff -- index.html # 比较工作区和暂存区中的index.html文件的差异
git diff --cached # 修改文件后,把修改的文件添加到暂存区中,查看暂存区和HEAD文件的差异
git diff master dev # 比较master分支和dev分支的差异
git diff master dev -- index.html # 比较index.html文件在master分支和dev分支的差异

两个分支的位置不同,显示文件的加减是不同的

8.修改提交的commit

git commit --amend                      # 修改最新提交的commit信息

9.git rebase操作

9.1 修改任何commit的message信息的步骤

1.列出所有的提交日志

git log --oneline               # 每行显示一条提交记录
git log --pretty=oneline
gitk # 图形化显示所有提交记录

2.进入修改交互模式

git rebase -i 版本号

这里的版本号为:要修改提交信息的版本号的上一个版本号。例如:按提交顺序从1到6,如果想修改版本4的提交信息,则此处的版本号应该为第3个版本号

3.进入交互模式后,会有如下提示:

# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

并列出在进入交互式模式时输入的版本号后的所有提交信息,把想修改的信息之前的pick修改为 r 或者 reword,然后:wq保存并退出

此时会打开想修改的commit的message信息,按vim编辑器的用法修改保存就可以

4.查看修改之后的commit message

git log --oneline

前提是必须要配置全局用户名和用户邮箱

9.2 把连续的多个commit合并成一个commit

1.查看所有提交记录

git log --oneline

2.进入git交互式模式

git rebase -i 版本号

这里的版本号为:要修改提交信息的版本号的上一个版本号。例如:按提交顺序从1到6,如果想合并版本4和版本5的提交信息,则此处的版本号应该为第3个版本号

3.进入交互模式后,会有如下提示:

# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

并列出在进入交互式模式时输入的版本号后的所有提交信息,把被合并的版本号的commit信息前的pick换成 s 或 squash,然后保存并退出

此时会打开合并后的commit提交信息窗口,按vim编辑器的用法修改保存就可以

4.查看修改之后的commit message

git log

可以看到把多个commit合并成一个commit后,所有提交的版本号都改变了

例子:现在有多次提交的版本号v1,版本号v2,版本号v3,版本号v4,版本号v5,版本号v6,想把v2和v3,v4这三次提交合并成一个新的提交,操作步骤:

git rebase -i v1
在打开的文件中,把v2和v3前面的pick修改成s,然后保存并退出
在新打开的窗口中,把未注释的行的内容修改为合并后想要的新内容,然后保存并退出
使用git log命令查看,就可以看到合并后的提交信息了

git的学习笔记(一):git本地操作的更多相关文章

  1. git的学习笔记(二):git远程操作

    1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...

  2. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  3. RX学习笔记:JavaScript数组操作

    RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...

  4. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  5. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  6. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

  7. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

  8. Python3+Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记13(js操作应用:弹出框无效如何处理)'''from sel ...

  9. Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...

随机推荐

  1. [C++]PAT乙级1004. 成绩排名 (20/20)

    /* 1004. 成绩排名 (20) 读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生 ...

  2. 修改输入框placeholder的样式

    1. h5页面: //修改placeholder 样式 (chrome,其余类似加前缀) ::-webkit-input-placeholder { color:rgba(21,30,38,0.35) ...

  3. ES5新增内容

    一.数组API实际开发中forEach和map会多一些=>是es6语法中的arrow function举例:(x) => x + 6相当于function(x){return x + 6; ...

  4. 允许长单词、数字、URL换行到下一行

    CSS3 word-wrap 属性 normal 只在允许的断字点换行(浏览器保持默认处理) break-word 在长单词.数字.URL地址内部进行换行 页面效果图: 源码:

  5. jq的load

    1.用于监听加载是否完成 当指定的元素(及子元素)已加载时,会发生 load() 事件. 该事件适用于任何带有 URL 的元素(比如图像.脚本.框架.内联框架). 根据不同的浏览器(Firefox 和 ...

  6. struts基础3-把数据写入页面

    一.OGNL(Object-Groph Navigation Language) 是一种强大的表达式语言,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能. 1)与 ...

  7. 【tmos】SpringBoot登录拦截

    我的代码 public class WebLoginInterceptor implements HandlerInterceptor { @Autowired private WeixinConfi ...

  8. wx小程序-音频视频!

    1.音乐的启动跟暂停 dom里面图片切换的另一种方法 通过变量 改变路径 2.监听 在onload里面 3.定义了一个全局变量 然后在但页面中获取 app.js 单页面中 app.js 的三个生命周期

  9. sort和uniq去重操作【转】

    去除重复行 sort file |uniq   查找非重复行 sort file |uniq -u   查找重复行 sort file |uniq -d   统计 sort file | uniq - ...

  10. python3+selenium入门09-键盘事件

    Keys类提供了键盘上几乎所有按键的方法.通过send_keys()方法不仅可以用来模拟键盘输入,还可以用它来模拟键盘上的按键.包括组合键,比如Ctrl+a等 需要导入Keys类 from selen ...