之前是在用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. attachEvent与addEventListener的区别 真实例子

    转自:https://www.cnblogs.com/Rosefxd/p/4921330.html 近日遇到attachEvent与addEventListener两个事件,哟,果断研究一下~~ 先普 ...

  2. 技术胖Flutter第三季-15垂直布局Column组件

    博客地址: https://jspang.com/post/flutter3.html#toc-8eb 垂直布局 左对齐: crossAxisAlignment: CrossAxisAlignment ...

  3. Cookie和Session(3)

    关于Cookie和Session Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. 1)cookie 是一种发送到客户浏 ...

  4. C++泛型编程之函数模板

    泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中, ...

  5. 利用YYLabel 进行图文混排+高度计算

    利用YYLabel 进行图文混排+高度计算 1.项目需求: 用一个控件显示图片和文字,并且依据图片和文字动态计算控件的高度. 2.方案: 利用YYLabel控件和属性字符串处理. 注:(在使用YYLa ...

  6. uoj#282. 长度测量鸡(构造)

    传送门 打表题--只有\(n\leq 3\)有解否则无解→_→ 或者严格证明的话是这样,因为算上端点一共\(n+1\)个点,共\(\frac{n(n+1)}{2}\)个点对,所以点对之间两两距离不相等 ...

  7. 洛谷P3312 [SDOI2014]数表(莫比乌斯反演+树状数组)

    传送门 不考虑$a$的影响 设$f(i)$为$i$的约数和 $$ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^nf(gcd(i,j))$$ $$=\sum\limi ...

  8. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  9. spark sql 对接 HDFS

    上一篇博客我向大家介绍了如何快速地搭建spark run on standalone,下面我将介绍saprk sql 如何对接 hdfs 我们知道,在spark shell 中操作hdfs 上的数据是 ...

  10. Windows服务使用Windsor容器

    该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. Windsor是ABP框架自带的IOC容器. 关于什么是IOC,你可以Bing或者Go ...