10分钟带你入门git到github
git的产生背景
开局先来一个故事吧,故事看完如果不想看枯燥无味的指令,没关系我已经把这篇文章的内容录制成了一个视频,点击文末阅读原文就可以观看。或者说你已经熟练掌握git的使用了,可以直接跳到总结部分(一个好玩的游戏)去检验下你掌握的熟练程度。

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
git 的安装
本文使用的是win7平台。
Git可以在Linux、Unix、Mac和Windows这几大平台上安装了,可以根据自己的操作系统去官网下载。

git 常见命令
介绍命令之前先来张图吧,所有的命令都是围绕张图的

Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放文件的改动,事实上它只是一个文件,保存即将提交到文件列表信息。
Repository: 本地仓库区(或版本库),就是安全存放数据的位置,这里面有我们提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
Remote: 远程仓库,托管代码的服务器。
弄清楚上面四个概念,我们就开始实操吧。通过
git init命令创建Git可以管理的仓库(本地库初始化)
Administrator@XCRBHXD05IEZEVS MINGW64 /d
$ mkdir gitstudy
Administrator@XCRBHXD05IEZEVS MINGW64 /d
$ cd gitstudy/
Administrator@XCRBHXD05IEZEVS MINGW64 /d/gitstudy
$ git init
Initialized empty Git repository in D:/gitstudy/.git/
执行完这个命令我们可以看到文件下面会多一个.git的文件夹,以后在这个文件夹下(工作区)的都可以被git管理了。

git add命令把文件添加到暂存区。
下面我们创建(echo>文件名字)一个demo.txt文件
$ echo > demo.txt

此时的demo.txt文件是带个蓝色?的,当我们执行git add - demo.txt后

那如果这个目录下面有几百个文件都要加到暂存区怎么办?
此时可以使用git add . 这个命令可以把当前目录下所有文件加入暂存区。
git status查看显示工作区和暂存区的状态。
$ git status
git commit -m"提交信息描述"命令把文件添加到本地仓库。
$ git commit -m"第一次提交"
[master (root-commit) 22f0a2b] 第一次提交
 1 file changed, 1 insertion(+)
 create mode 100644 demo.txt
提交后demo.txt颜色是不是变绿了。


git commit -am"文件描述"【am】 就是 【add modify】 两个命令的合并。比如我们修改了两个文件demo.txt和demo1.txt。这时候我们可以直接使用git commit -am命令
git commit -am"第三次提交"
如果新增了文件,必须使用分开的命令,不能用合并命令。
git add .
git commit -m 'update'
回退
未使用git add(文件必须是commit 过的)
- 使用
git checkout -- filename(文件名)注意中间有-- 
$ git checkout -- demo.txt
- 回退所有的文件修改使用
git checkout . 
 git checkout .
已使用git add,未使用git commit
- 使用 
git reset HEAD filename(指定文件名) 
git reset HEAD demo.txt
- 回退所有文件修改 
git reset HEAD 
 git reset HEAD
在使用本命令后,本地的修改并不会消失,而是回到了上面 未使用git add 缓存代码,继续使用用git checkout -- filename,就可以放弃本地修改。
已使用 git commit 未push
git reset --hard HEAD^回退到上一次commit的状态(这个命令需谨慎执行)。HEAD^(代表上一次)或者通过git reset --hard <commitid>(是版本号 可以根据git log查看,每次commit都会生成一个)
 git reset --hard HEAD^
git reset --mixed HEAD^(--mixed也可以省略),保留工作区,并且清空暂存区。就是回到上一次git add之前。
git reset HEAD^
git reset --soft HEAD^重置HEAD到指定的版本,不会修改暂存区和暂存区就是回到上一次git commit之前,适用于合并commit节点。
git reset --soft HEAD^
git revert <commitid>会回退到之前的那次提交,会产生一个新的commit,将这次回退作为一次修改记录提交,这样的好处是不修改历史提交记录。
 git revert e241441d8a85b2d89
已使用 push
git push -f可以在本地执行以上操作后,然后强行推送到远程仓库
git push -f
删除
git rm <文件名>这个必须是commit之后的文件
 git rm demo.txt
git rm -f <文件名>这个执行add未执行commit可以删除
 git rm -f 4.txt
远程仓库
- 以上都是在本地仓库进行操作的,提交的代码别人也是看不到的,如果写着代码硬盘坏了咋办?那是不是所有的代码都没了。所以写完了代码赶紧推送到服务器上去。
 
添加远程库
用命令git remote add origin git@server-name:path/repo-name.git;关联远程仓库
关联之前肯定要在远程创建仓库
- 首先要到https://github.com/全球最大同性交友网站上注册一个账号。已有账号的就忽略了。
 - 接下来就是新建一个远程仓库了。


 
 git remote add origin git@github.com:workit1/studygit.git
关联后,使用命令git push -u origin master第一次推送master分支的所有内容。
git push -u origin master
以后,每次本地提交后可以使用命令git push origin master推送最新修改到远程仓库。
从远程库克隆
- 前面我们了解先有本地仓库,再有远程库的时候,如何关联远程库。但是一般实际开发中我们是先有远程仓库的,然后从远程库克隆。

 
 git clone https://github.com/workit1/gitstudy.git
分支管理
git checkout -b<创建分支名> 表示创建并切换分支
Administrator@XCRBHXD05IEZEVS MINGW64 /d/gitstudy (master)
$ git checkout -b feature_a
Switched to a new branch 'feature_a'
基于master分支创建了feature_a分支并且切换到了feature_a分支。
git checkout <name>或者git switch <name>切换分支
 git checkout master
git branch -a查看所有分支,包含远程分支git branch查看本地所有分支- 合并分支
 
git merge master
当有冲突的时候这里会个正在合并的状态

- 取消合并,此时你如果不想合并了,可以使用
git merge --abort取消。 
git merge --abort
- 删除分支
 
- 删除本地分支
git branch -d <name> 
	git branch -d feature_a
- 删除远程分支
git branch -D <name> 
实际项目中如果我们需要开发一个功能完整的流程是什么样的呢?
多数公司模式应该下面这样的流程吧。
1.先基于主干分支 拉出一个功能分支(feature_xx)进行开发。
2.开发完成后测试基于这个功能分支进行测试。
3.测试完成后,开发把功能分支合并到主干分支。
合并代码操作如下:
- 先切换到主干分支(
release),主干分支git pull拉下远程分支最新代码(可能有同事提交了新的代码) - 切回到功能分支 把本地主干最新代码合(
git merge)并到当前功能分支,如果合并有冲突就解决冲突后重新提交。 - 切换到主干分支执行
git merge功能分支。(这一步实际工作中一般人是不能这么操作的),代码必须要先发起一个merge request经过代码review才能进行合并到主干分支的。 - 合并完主干分支后,功能分支就可以删除了。
 
总结
- 以上命令基本上可以应付工作中大多数场景了,不过
git还有很多高级的玩法。如果大家想更深入学习了解的话,我这边为大家整理了一份Git的学习资料,从学习入门到高阶。还有git所有命令的思维导图。公众号【java金融】回复【git】就可以免费获取了。

 - 还为大家找了一个可以在线练习
git的学习网站。赶紧去试试吧,超级有意思,相信你一口气就通关了。
https://learngitbranching.js.org/?locale=zh_CN

 - 视频地址
 
结束
- 由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
 - 如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
 - 感谢您的阅读,十分欢迎并感谢您的关注。
 

参考
https://www.liaoxuefeng.com/wiki/896043488029600/896202780297248
10分钟带你入门git到github的更多相关文章
- Azure IoT Hub 十分钟入门系列 (1)- 10分钟带你了解Azure IoT Hub 并创建IoT Hub
		
建议您先对<Azure 上 IoT 整体解决方案概览 >进行了解. 本文主要分享一个案例: 10分钟-了解Azure IoT Hub并创建Azure IoT Hub 本文主要有如下内容: ...
 - 都9102年了,还不会Docker?10分钟带你从入门操作到实战上手
		
Docker简述 Docker是一种OS虚拟化技术,是一个开源的应用容器引擎.它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支 ...
 - 三分钟带你入门GitHub
		
一,首先,我们来说一下什么是GitHub GitHub是一个基于git打造的开源社区 ,同时也是一个大型同性交友平台 ,作为一个专业的程序员,你非常有必要知道并使用GitHub:作为一个国际化社区,所 ...
 - 5分钟带你入门Redis
		
转载请标明出处: http://blog.csdn.net/forezp/article/details/61471712 本文出自方志朋的博客 1.redis概述 redis是一个开源的,先进的 k ...
 - 45分钟带你入门Linux(附:笔者在工作室开讨论班录制的视频讲解)
		
第一部分 熟悉Linux基本操作 一.初识Linux 1.Linux特点 ◊ 开放性 ◊ 多用户 ◊ 多任务 ◊ 良好的用户界面 ◊ 设备独立性 ◊ 丰富的网络功能 ◊ 可靠的系统 ...
 - 5分钟带你入门vuex(vue状态管理)
		
如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习 ...
 - 五分钟带你入门TensorFlow
		
TensorFlow是Google开源的一款人工智能学习系统.为什么叫这个名字呢?Tensor的意思是张量,代表N维数组:Flow的意思是流,代表基于数据流图的计算.把N维数字从流图的一端流动到另一端 ...
 - 三分钟带你入门 redis 高可用架构之哨兵
		
什么是哨兵? 哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,需要人工介入才能完成故障转移,哨兵可以解决这个问题,在主从复制情况下,当主节点发生故障时 ...
 - 干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码
		
OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...
 
随机推荐
- 码农飞升记-Java是什么?
			
1.Java概述 Java 原名 Oak 是 Sun Microsystems 公司的 James Gosling 及其团队于 1995 年 5 月推出的 Java 程序设计语言 和 Java 平台 ...
 - 20191209_Centos7.2使用yum安装mysql
			
1. 下载mysql的rpm包 [root@izwz91qnvovd6suufon1ccz ~]# wget http://dev.mysql.com/get/mysql57-community-re ...
 - PyQt(Python+Qt)学习随笔:树型部件QTreeWidget中当前列currentColumn和选中项selectedItems访问方法
			
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 当前列访问方法 树型部件QTreeWidget的currentColumn()方法返回当前项中得到焦 ...
 - PyQt学习随笔:Model/View设计中支持视图中数据修改的方法及步骤
			
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 要支持视图中的数据可以修改,需要两个步骤: 1. 在视图中设置editTriggers属性支持在视图 ...
 - PHP代码审计分段讲解(7)
			
17 密码md5比较绕过 <?php if($_POST[user] && $_POST[pass]) { mysql_connect(SAE_MYSQL_HOST_M . ': ...
 - python+request+unittest+HTMLTestRunner
			
https://www.imooc.com/article/details/id/20813 https://www.cnblogs.com/fennudexiaoniao/p/7771931.htm ...
 - Python实现自动整理文件
			
前言 工作上的文档和资料好几个月没整理了,因为平常太忙都是随手往桌面丢.整个桌面杂乱无章全是文档和资料.几乎快占满整个屏幕了,所有我必须要整理一下了.但是手动整理太费时间了,于是我想到了python. ...
 - C#软件性能优化
			
C#软件性能优化 1. 性能 衡量一个软件系统性能的常见指标有:响应时间.负载.资源使用率.并发数.在软件中有具体的提高性能需求时,我们需分析该系统性能的影响由哪些因素组成,再针对各部分进行性能 ...
 - 计算机网络——HTTP知识点整理
			
1.HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少.它 ...
 - rsync 参数说明及使用参数笔记
			
第1章 rsync 命令简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据镜像同步备份的优秀工具. 1.1.1 语法格式 三种模式: 1)本地模式 rsync [选项] ...