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. bzoj 4650 & 洛谷 P1117 优秀的拆分 —— 枚举关键点+后缀数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4650 https://www.luogu.org/problemnew/show/P1117 ...

  2. ubuntu下使用code::blocks编译运行一个简单的gtk+2.0项目

    在具体的操作之前,首先需要安装一些必要的软件.ubuntu下默认安装了gcc,不过缺少必要的Header file,可以在命令行中输入下面的指令安装build-essential套件:sudo apt ...

  3. jquery调用spring mvc接口返回字符串匹配

    背景:有个增删改页面,用jquery祭出ajax异步调用接口,spring mvc响应对象是个json字符串,jquery根据响应结果判断,如果删除成功给出提示.那么问题来了,接口里响应的字符串怎么匹 ...

  4. QQ2008自动聊天精灵delphi源码

    QQ2008自动聊天精灵delphi源码   unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Grap ...

  5. DataGrid方法标注

    在VS2010中无法增加了CColumn和Ccolumns类 解决方案,方案名->右击->添加类->ActiveX控件中的MFC类->添加弹出了“从ActiveX控件添加类向导 ...

  6. Ubuntu apt-get卸载小记

    过sudo apt-get install xxxx 安装软件后,总是无法卸载干净,这里以Apache 为例,提供方法:首先sudo apt-get remove apache2再sudo apt-g ...

  7. 微信小程序之工具js封装与使用

    工具库的创建与使用 创建一个common文件夹 在common文件夹中创建一个utils文件夹 在utils文件夹中创建util.js // 工具 function tool() { console. ...

  8. Playbooks 中的错误处理

    Topics Playbooks 中的错误处理 忽略错误的命令 控制对失败的定义 覆写更改结果 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. ...

  9. Android 4 学习(15):持久化:Files, Saving State and Preferences

    参考<Professional Android 4 Development> 持久化:Files, Saving State and Preferences Android中的数据持久化 ...

  10. Python将两个数组合并成一个数组,多维数组变成一维数组

    1.extend方法 c1 = ["Red","Green","Blue"] c2 = ["Orange"," ...