之前是在用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. SNMP的应用

    前两天项目要求一个附加功能,远程监视服务器的运行状况,要定期监视指定端口,指定业务,还包括服务器的磁盘空间,内存,CPU使用率等等.这头俩事还好说,ping和telnet也就搞定了,实在不行就开个so ...

  2. HDU 1143 Tri Tiling 递归问题

    将一个3*n的矩形用1*2的矩形填充,n为奇数时一定不能被填满,n*3%2==1 接下来处理这个问题我们要从简单的情况开始考虑,所谓递归就是要能将问题的规模不断减小,通过小问题的解决最后将复杂问题解决 ...

  3. ubuntu 禁止错误信息 report 问题弹出

    发现ubuntu只要出现点问题就会提示要不要report error, 光点cancel就点烦了. 而且今天重新安装了一台ubuntu结果开机就蹦出error, 好烦啊. 下面说个特别有效的解决办法, ...

  4. 可移植的配置visual studio工程第三方库

    现在编程有太多的好用的第三方库,例如 计算机视觉方面的opencv c++的扩充库boost 特殊的第三方库,相机库,通讯库等 使用这些库给我们带来了极大的便利,同时也有很多困扰.这个工程在我电脑上明 ...

  5. 关于window 查看端口命令

    今天小R又知道了一个新的小常识,个人觉得还是蛮实用的,可能对于有些新手来讲应该也不知道吧. 如:大家都知道window查看命令是用  “netstat -an”   , 如图显示一大推打开的端口. 但 ...

  6. SQL Server知识详解

    1.SET NOCOUNT ON的作用: 作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息. 语法:SET NOCOUNT {ON | OFF} 详解:当SET ONCOUNT ...

  7. lightoj 1078【同余定理】

    题意: 给你一个n和一个数 digit ,问你最少需要多少个 digit 使得整除于n; 思路: 同余定理(a+b)%n=(a%n+b%n)%n; (m%n+m%n*10+m%n*100+m%n*10 ...

  8. HDU5119【dp背包求方案数】

    题意: 有n个数,问有多少方案满足取几个数的异或值>=m; 思路: 背包思想,每次就是取或不取,然后输出>=m的方案就好了. #include <bits/stdc++.h> ...

  9. [Xcode 实际操作]八、网络与多线程-(17)使用网址会话对象URLSession向远程服务器上传图片

    目录:[Swift]Xcode实际操作 本文将演示如何通过网址会话对象URLSession向远程服务器上传图片. 网址会话对象URLSession具有在后台上传和下载.暂停和恢复网络操作.丰富的代理模 ...

  10. 跳转到另一个APP

    看看这个代码: http://code4app.com/codesample/4fcc512d6803fae60b000002 inApp跳转,不过需要Nimbus类库. 要跳转到另一个APP,需要另 ...