Git简介

1、Git是目前世界上最先进的分布式版本控制系统(没有之一)
2、集中式和分布式版本控制系统有什么区别呢?
     区别在于历史版本维护的位置:Git本地仓库包含代码库还有历史库,在本地的环境开发就可以记录历史;而SVN的历史库存在于中央仓库,每次对比与提交代码都必须连接到中央仓库才能进行。这样的好处在于:自己可以在脱机环境查看开发的版本历史;多人开发时如果充当中央仓库的Git仓库挂了,可以随时创建一个新的中央库然后同步就立刻恢复了中央库

安装Git

1、linux上安装Git
      sudo apt-get install git
2、windows上安装Git
      msysgit是Windows版的Git,从https://git-for-windows.github.io下载,然后按默认选项安装即可。
      打开Git Bash既是
3、自报家门
        $ git config --global suer.name "pony"
        $ git config --global user.email "pony@126.com"

创建版本库

1、创建方法:

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录(确保目录名不包含中文)
$ cd D:/doc/
$ mkdir learngit
$ cd learngit/
$ pwd

/d/doc/learngit
2、通过git init命令把这个目录变成Git可以管理的仓库

$ git init

Initialized empty Git repository in d:/doc/learngit/.git/
3、把文件添加到版本库中
※不要用windows默认编辑器,编码有问题,建议使用notepad++,而且默认编码设置为UTF-8 without BOM既可
 任务:将readme.txt添加到Git
    (1)readme.txt加到仓库(即放到项目的文件夹下 ) 
    (2) $ git add readme.txt
    (3)$ git commit -m "wrote a redme    //-m是本次提交的说明
[master (root-commit) bd23402]
 1 file changed, 2 insertions(
 create mode 100644 readme.txt

4、为什么有add和commit?

    因为可以add多个文件之后,再commit

时光机穿梭

查看状态

  • 要随时掌握工作区的状态,使用git status命令。

  • 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

zlm@ZLM-PC /d/Doc/learngit (master)
$ git status
On branch master
nothing to commit, working directory clean
zlm@ZLM-PC /d/Doc/learngit (master)
//修改了readme.txt后再次查看状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working
        modified:   readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
 
$ git diff readme.txt        //查看到底修改了什么
WARNING: terminal is not fully functional
diff --git a/readme.txt b/readme.txt
index 084d42e..37bbe8d 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system
+Git is a distributed version control system
 Git is a free software
\ No newline at end of file

版本回退

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

commit后面的一长串数字是commit_id(版本号) 。HEAD是最新版本,HEAD^是上一版本,HEAD^^是上上版本,HEAD~100是前100个版本
 
返回上一版本:
$ git reset --hard HEAD^
HEAD is now at 5ba7890 add distributed
 
返回某一个指定版本,只需要写版本号前几位就行,git会自动找到
$ git reset --hard bd2340
HEAD is now at bd23402 wrote a redme file
 
$ git reflog        //用来记录每一次命令
WARNING: terminal is not fully functional
bd23402 HEAD@{0}: reset: moving to bd2340
5ba7890 HEAD@{1}: reset: moving to HEAD^
17dc2d4 HEAD@{2}: commit: append GPL
5ba7890 HEAD@{3}: commit: add distributed
bd23402 HEAD@{4}: commit (initial): wrote a redme file

工作区和缓存区

git add之后:
git commit之后:

管理修改

每次修改,如果不add到暂存区,那就不会加入到commit

git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别

撤销修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

从版本库恢复文件:
$ git checkout -- test.txt
删除版本库中的文件:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt

远程仓库

 

GitHub

1、注册一个github账号(https://github.com/ ) ,就可以获得git远程仓库
2、创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "lingzeng86@126.com"
然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
3、登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,就可以了。

添加远程库

1、在GitHub添加一个仓库名字为“learngit”
2、本地库与GitHub做关联
        $ git remote add origin git@github.com:zenglingming/learngit.git
         origin是固定用法,表示远程仓库      
3、本地库所有内容推送到远程库
        $ git push -u origin master
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of know
n hosts.
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.65 KiB | 0 bytes/s, done.
Total 20 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To git@github.com:zenglingming/learngit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.       
   把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master 
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!        
※上图中的SSH警告只会出现一次,是因为需要吧GitHub的Key添加到本机的一个信任列表里,以后不会再有。

从远程库克隆

1、在GitHub创建一个新仓库,名字叫gitskills,可以勾选上“Initialize this repository with a README”
2、git clone git@github.com:zenglingming/gitskills.git
    

 当然也可以用https://github.com/zenglingming/gitskills 的htpps协议也可以clone,但除了速度慢之外,每次推送还需要输入口令。而ssh支持的原生git协议是最快的。

分支管理

Git的创建分、切换和分支速度很快,1秒钟内就能完成!

创建与合并分支

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

解决冲突

当branch和master都有新的提交,branch合并到master时,会有冲突,这就需要手动解决。
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...

分支管理策略

 

Git分支十分强大,在团队开发中应该充分应用。

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而默认的fast forward合并就看不出来曾经做过合并。

1、创建并切换到dev分支:git checkout -b dev
2、修改readme.txt,提交
        $ git add readme.txt
        $ git commit -m "add merge"
3、切换回master:$ git checkout master
4、普通模式合并dev分支        
        $ git merge --no-ff -m "merge with no-ff" dev
5、查看分支历史
        $ git log --graph --pretty=oneline --abbrev-commit

Bug分支

1、在dev正常开发中,有一个bug要解决,先用stash功能吧当前工作现场“存储”起来
        $ git stash
2、用git status查看工作区,就是干净的(除非有没有被Git管理的文件)
3、从master拉取bug分支,如:issue-101,修改之后,commit
4、切换到master,合并分支issue-101,然后删除分支issue-101
5、切换到dev分支,查看保存的工作现场
        $ git stash list
        stash@{0}:WIP on dev:6224937 add merge
6、恢复工作现场
        方法1:git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
        方法2:git stash pop,恢复的同时把stash内容也删了
※查看保存的工作现场,然后可以恢复指定的stash
$ git stash list
$ git stash apply stash@{0}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Git教程--廖雪峰的更多相关文章

  1. 《Git教程-廖雪峰》学习笔记

    一.创建版本库 ①初始化一个Git仓库:git init ②添加文件到Git仓库:1.git add<file> ;  2.git commit 二.时光机穿梭 ①查看工作区状态,文件是否 ...

  2. github教程--廖雪峰的官方网站

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

  3. Git教程学习(二)

    教程来自: Git教程(廖雪峰的官方网站) 主要命令: $ git log #查看已提交内容 $ git log --pretty=oneline #查看已提交内容(紧凑版) $ git reset ...

  4. Git教程学习(一)

    教程来自: Git教程(廖雪峰的官方网站) 学习Git的基本内容,对教程内容进行理解并脱水 1. Git简介 2. 安装Git 1. ubuntu上安装Git $ sudo apt-get insta ...

  5. git学习笔记——廖雪峰git教程

    OK,先附上教程--廖雪峰的官方网站 友情连接:git官网 简介 这里我只想引用他的原文: Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的.实际情况是这样的: L ...

  6. 廖雪峰的java教程

    F:\教程\0-免费下载-廖雪峰 公司电脑地址: G:\学习中\廖雪峰的java教程 廖雪峰java课程地址: https://www.feiyangedu.com/category/JavaSE 0 ...

  7. git常用命令总结--廖雪峰老师Git教程命令总结

    学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西. 如果没有学过,这是传送门 下面这个图很重要 一.git初始化本地仓库和配置 echo "想输入到文件的内容,一般 ...

  8. 【学习总结】Git学习-参考廖雪峰老师教程-总

    公元2018-10-21 实验室台式机 win7 64位 参考教程: 廖雪峰Git教程 其他资料:Git-book 北大一只总结的笔记,最终整理的时候可以参考:Git笔记 评论区看到的另一个人,总结在 ...

  9. 廖雪峰Git入门教程

    廖雪峰Git入门教程  2018-05-24 23:05:11     0     0     0 https://www.liaoxuefeng.com/wiki/00137395163059296 ...

随机推荐

  1. mysql时间运算

    DELETE FROM zhongqiu WHERE caretatime<=ADDDATE(NOW(),-14) caretatime` timestamp NOT NULL DEFAULT ...

  2. Memcached的限制和使用建议

    1. 在Memcached中可以保存item数据量没有限制的,只要内存足够 2. Memcached单进程最大使用内存2G,要使用更多内存,可以分多个端口开启多个Memcached进程 3. Memc ...

  3. oracle查询题目2道

    1.列出与“SCOTT”从事相同工作的所有员工. ①先查询SCOTT从事的是什么工作 select job from emp where name like='SCOTT'; ②select enam ...

  4. netty中的websocket

    使用WebSocket 协议来实现一个基于浏览器的聊天室应用程序,图12-1 说明了该应用程序的逻辑: (1)客户端发送一个消息:(2)该消息将被广播到所有其他连接的客户端. WebSocket 在从 ...

  5. SQL Server2005中文版x64安装29506错误解决办法

    在使用SQL Server 2005简体中版安装时,使用X86(32位操作系统下)安装没有出现任何问题.可是在X64(64位操作系统下)安装过程没有出现问题,可是安装完成后却没有Microsoft S ...

  6. python's ninteenth day for me 类的组合,继承。

    组合: 表示一个类的对象作为另一个类对象的属性. 实例化的过程: 1,创建一个对象. 2,__init__ 给对象添加一些属性,对象默认的名字为self. 3,将self所指向的内存空间返回给实例化他 ...

  7. Python 正则表达式之选择

    In [4]: import re In [5]: re.findall(r"\d+","jjj1234mm222")Out[5]: ['1234', '222 ...

  8. 9.solr学习速成之group

    Group与Facet的区别  facet的查询结果主要是分组信息:有什么分组,每个分组包括多少记录:但是分组中有哪些数据是不可知道的,只有进一步搜索.        group则类似于关系数据库的g ...

  9. python---Redis 学习笔记

    缓存 前言: 大家都听过缓存,缓存是干啥的呢?我们可以和json和pickle来说,两个程序之间实现信息交互,可以通过在A程序中把数据改成json ,然后传给B程序,通过文件这个介质.文件这个效率很低 ...

  10. Java面向对象-方法的重载

    Java面向对象-方法的重载 所谓方法的重载, 类里面有两个或者多个重名的方法,但是方法的参数个数.类型.顺序至少有一个不一样,这时候局构成方法重载: 上代码: package com.java123 ...