之前是在用SVN,现在因为小伙伴比较喜欢Git,所以也开始学习Git,很感谢 时光穿梭机 - 廖雪峰 的无私奉献。本文用来记录我在学习Git过程中的收获和笔记,廖雪峰大神的Git教程参考这里

1、Git介绍:

2、Git概念:

  工作区与版本库:此段详情参考这里

    工作区(Working Directory):就是你在电脑里能看到的目录。版本库(Repository):工作区有一个隐藏目录“.git”,这个不算工作区,而是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。把文件往Git版本库里添加的时候,是分两步执行的:

    第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用“git commit”提交更改,实际上就是把暂存区(Unstaged)的所有内容提交到当前分支。对于修改之后,但是没有经过git add,是不会提交到当前分支的,这就是Git最关键的跟踪管理修改而不是文件的概念,此点见这里

3、Git指令:

  git config:配置Git,比如字体等等。安装好后,要通过下面两条指令配置用户信息。

  $ git config --global user.name "Your Name"
  $ git config --global user.email "email@example.com"

  git add fileName:将工作区的内容添加到暂存区,可以使用*表示左右文件,也可以针对特定文件用正则。

  git commit -m 'message':将暂存区内容提交到版本库,版本跟踪控制就是针对commit,版本号就可以理解成commit ID。

  git status:查看当前工作区的状态。

  git checkout --file:丢弃工作区的修改。若readme.txt自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态;若readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。

  git reset [--Par] ID:ID表示版本号,在Git中,HEAD表示最新的版本(也就是刚刚commit的那个版本,git log时出现的第一个),HEAD^表示上一个版本,HEAD^^表示上上个版本,当然也可以使用HEAD~100表示往上100个版本。ID可以用HEAD表示,用于返回到之前的版本,ID也可以是commit ID,当使用reset之后,想要返回到HEAD之后的版本,只要还能够找到之前的commit ID,就可以回到HEAD之后的版本,其实commit ID可以不写全,只要前几位能保证Git能够唯一识别版本就行。Git内部维护一个HEAD指针,版本控制就是通过修改HEAD指针,因为即使返回到之前的版本,后面的版本也并没有彻底删除,如果使用“git reset --hard HEAD”之后,想要返回之后的版本,但是忘记cimmit id,可以使用后面的git reflog命令找回。

  有关HEAD更详尽的描述,见后面分支管理。

  git log:查看所以提交的commit的信息,包括commit ID(一个16进制的SHA值,而不是像SVN那样的1、2、3,这是因为Git是分布式的,多人工作时,每个人都会有版本号,所以不能用1、2、3依次增加)、Author、Date和message。如果内容太多,可以使用 --pretty=oneline,使每个commit在一行显示。但是git log只会显示HEAD时间之前的版本,如果使用了“git reset --hard HEAD”后,想要查看HEAD后的版本,可以使用git reflog查看commit id。

4、Git的分支操作:

  Git中,通过commit维护一条时间版本线,各个分支版本通过指针指定commit ID来维护。master是指向master分支版本的id,每新建一个分支(如dev),都会创建一个指针dev指向创建时当前分支指针所指向的版本。而HEAD时间上是指向当前分支的指针(如master、dev)。所以每次commit时,只是更改当前分支的指针指向。每次分支切换,也就是更改HEAD指针指向要切换到的分支。此处一定要参考这里

  查看分支:git branch。列出仓库中所有分支,当前分之前加星号。git branch -r查看远程分支。

  创建分支:git branch name

  切换分支:git checkout name

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

  合并某分支到当前分支:git merge name,默认Git会用“Fast forward”模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用“Fast forward”模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。git merge --no-ff -m 'message' name,--no-ff参数,表示禁用“Fast forward”;因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

  删除分支:git branch [-d] name, -d表示强制销毁。

  分支冲突与解决概念见这里

  分支管理策略:  

    在实际开发中,我们应该按照几个基本原则进行分支管理:

    首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

    那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

    所以,团队合作的分支看起来就像这样:

            

  隐藏工作区、缓存区(没有“git add”的修改):如果当前分支工作还没有完成,所以暂时不打算commit或add,然后此时需要到其他分支做其他工作,是没法直接切换(因为有没提交的修改)。所以可以把工作区或缓存区的修改隐藏起来。

  可以通过git stash隐藏未提交的更改(就是暂存到其他地方),其他分支完成任务后,返回该分支,可以git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除。用git stash pop,恢复的同时把stash内容也删了。git stash list 查看所有的stash记录。

5、标签管理: 

  Git标签也是版本库的一个快照,但其实它就是指向某个commit的指针(跟分支很像,但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

  git tag [-a] tagName -m 'message' [commit ID]:创建标签,默认tag是指向当前分支的最新提交,即:HEAD,但是可以通过指定commit ID使tag指向某个特定commit。

  git tag:显示所有tag,是按tagName的字母顺序排序,不是按照时间。

  git show tanName:显示tagName这个标签的信息。

  推送标签到远程仓库:git push origin tagName可以推送一个本地标签;git push origin --tags可以推送全部未推送过的本地标签。

  删除本地标签:git tag -d tagName。

  删除远程仓库的标签:1、先删除本地tag;2、然后通过git push origin :refs/tags/tagName删除远程仓库。

6、GitHub相关使用:

GitHub与Git的关系,ssh key的配置参考这里这里。GitHub私人只能建免费public的仓库,想要创建private需要收费或者学生和教育人士可以建私有仓库,申请在此。也可以使用BitBucket,相关使用和GitHub没有太大的区别

  1、添加本地仓库到远程仓库:

git remote add origin git@github.com:DwyaneTalk/testGit.git:关联远程库
git push -u origin master:首次推送到远程库
git push origin master:之后的推送,推送之后,GitHub仓库页面就会显示更改。后面会介绍Pull Request概念。

  其中origin指远程库,第一条是将本地仓库与远程库关联。关联之后,首次推送时加 -u, Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

  2、克隆远程仓库:

  开发中,也可以现在远程GitHub上创建仓库,然后本地打开Bash之后,通过克隆本地仓库,并关联远程仓库,这样只要开发小组每人都克隆一下,就可以协同开发。

   git clone git@github.com:DwyaneTalk/gits.git

  PS:上面都是通过ssh进行传输的,GitHub也支持HTTPS等方式,但是相对速度较慢且每次需要输入口令。比如上面地址换成https://github.com:DwyaneTalk/gits.git就可以。完成上面之后,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

3、多人协作分支操作:

    查看远程库信息,使用git remote [-v]

    本地新建的分支如果不推送到远程,对其他人就是不可见的;  

    在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    从本地推送分支,使用git push origin branch-name,如果因为冲突(其他人也对某文件进行修改,并已经提交)推送失败,先用git pull抓取远程的新提交;

    从远程抓取分支,使用git pull,如果有冲突,要先处理冲突,然后在push。如果提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。  

其他参考:http://blog.csdn.net/shulianghan/article/details/18812279

Git 学习教程【转+总结】的更多相关文章

  1. git学习教程

    猴子都能懂的GIT入门 http://backlogtool.com/git-guide/cn/ 廖雪峰的Git教程 http://www.liaoxuefeng.com/wiki/001373951 ...

  2. git学习教程二之远程仓库学习

    首先你需要注册一个github用户名,我的github账户是:1654218052@qq.com 由于本地的git仓库和github的仓库是通过SSH加密的,所以我们还需要设置一点东西哦 第1步:创建 ...

  3. Git学习教程一之安装Git&&&本地仓库建立

    一. 安装git 1:在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项一直安装即可. 2:安装完成后,在开始菜单里找到“Git”-> ...

  4. Git学习教程三之分支管理

    实战流程: 1:代码库克隆一份至本地 2:新分支操作 2.1  在需要的文件中创建并指向新的分支方便写代码  git checkout -b <name>                2 ...

  5. (转)git学习教程

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

  6. Git 学习(五)远程仓库

    Git 学习(五)远程仓库 之前的章节所说的是本地Git仓库的操作,版本管理的优越性显然不会仅仅在本地.远程仓库也就是服务器或是网络端的仓库操作也是必须的. 本文具体说明 Git 的远程仓库操作,示例 ...

  7. git学习基础教程

    分享一个git学习基础教程 http://pan.baidu.com/s/1o6ugkGE 具体在网盘里面的内容..需要的学习可以直接下.

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

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

  9. 【学习总结】Git学习-参考廖雪峰老师教程四-时光机穿梭

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

随机推荐

  1. 什么是weex

    Weex是一个使用web开发体验来开发高性能原生应用的框架 在集成WeexSDK之后,你可以使用javaScript和现代流行的前端框架来开发移动应用. Weex的结构是解耦的,渲染引擎与语法层是分开 ...

  2. NHibernate错误:Could not compile the mapping document的解决

    用动软代码生成器的NHibernate生成模板,生成一个“XML映射模板”,老是提示Could not compile the mapping document的问题. 各种的找,就是没找到问题. 后 ...

  3. 51nod1228

    伯努利数 这个是答案 其中的b是伯努利数,可以n^2预处理 伯努利数n^2递推 #include<bits/stdc++.h> using namespace std; typedef l ...

  4. 【旧文章搬运】KeUserModeCallback用法详解

    原文发表于百度空间及看雪论坛,2010-01-10 看雪论坛地址:https://bbs.pediy.com/thread-104918.htm  代码及附件可到这里下载=============== ...

  5. CS231n 2016 通关 第四章-NN 作业

    cell 1 显示设置初始化 # A bit of setup import numpy as np import matplotlib.pyplot as plt from cs231n.class ...

  6. Sudo环境变量继承

    sudo中默认配置会重置环境变量,所以使用sudo的时候需要小心这点.如何让sudo继承我们需要的环境变量?有如下两种方法: #sudo visudo 或者 #vi  /etc/sudoers     ...

  7. 改变bootstrapSwitch按钮状态

    $('.switch-state').bootstrapSwitch('state',true);

  8. HDFS源码分析一-概述

    HDFS 主要包含 NameNode, SecondaryNameNode, DataNode 以及 HDFS Client . 我们从以下这几部分讲: 1. HDFS概述 2. NameNode 实 ...

  9. c# 调用 webservices (转载)

    .net 调用webservice 总结 最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice . 我们都知道,调用webserivice 最简单 ...

  10. C#操作cmd

    C#经常操作CMD,使用的话就用下面的2和3进行整理一下使用吧. 1.简单的调用命令不需要回传数据,最简单 public static void ipcmd(object p) { Process p ...