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. poj 3046 Ant Counting——多重集合的背包

    题目:http://poj.org/problem?id=3046 多重集合的背包问题. 1.式子:考虑dp[ i ][ j ]能从dp[ i-1 ][ k ](max(0 , j - c[ i ] ...

  2. tomcat启动报错:org.springframework.beans.factory.BeanCreationException

    Web容器在启动时加载 spring 配置文件时解析xml失败常常引起容器启动失败.这次配置文件是 ibatis的sql脚本出了问题: Context initialization failed or ...

  3. PHP统计排行,分页

    1.分页参数 count 总数 firstRow   起始行 listRows   每一次获取记录数 list          每一页的记录(要与count对应一致就行) 2.分页对象 可以针对真实 ...

  4. Oracle 2套rac集群指向单机多实例的复制搭建

    Oracle 2套rac集群指向单机多实例的复制搭建 由于环境限制,现在需要把2套rac集群通过dg复制指向远端的单机多实例上面. rac指向第一个实例的前面已经有文档 这里直接添加第二个实例的复制搭 ...

  5. python's thirty day for me 异常处理

    ---恢复内容开始--- 程序的异常:报错之后程序终止. 异常处理搭配使用: l = ['创建老师','创建学校'] while True: try: for num,item in enumerat ...

  6. Python Twisted系列教程11:改进诗歌下载服务器

    作者:dave@http://krondo.com/your-poetry-is-served/ 译者:杨晓伟(采用意译) 你可以从这里从头阅读这个系列. 诗歌下载服务器 到目前为止,我们已经学习了大 ...

  7. Android 4 学习(13):Local Broadcast Manager & Intent Filter

    参考<Professional Android 4 Development> Local Broadcast Manager 简介 Local Broadcast Manager由Andr ...

  8. Swift中用正规表达式判断String是否是手机号码

    func isTelNumber(num:NSString)->Bool { var mobile = "^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$&qu ...

  9. 十分钟学会Fiddler

    一.Fiddler介绍 Fiddler是一个http抓包改包工具,fiddle英文中有“欺骗.伪造”之意,与wireshark相比它更轻量级,上手简单,因为只能抓http和https数据包,所以在针对 ...

  10. Mycat主从模式下的读写分离与自动切换

    1. 机器环境 192.168.2.136 mycat1 192.168.2.134 mydb1 192.168.2.135 mydb2 2在mysql1.mysql2上安装mysql 更改root用 ...