内容简介:很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制
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 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.bilibili.com/video/BV1Xt4y1X73x/
结束
-
由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
-
如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
-
感谢您的阅读,十分欢迎并感谢您的关注。
-
特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢
参考 https://www.liaoxuefeng.com/wiki/896043488029600/896202780297248
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- TiDB入门(四):从入门到“跑路”
- MyBatis从入门到精通(一):MyBatis入门
- MyBatis从入门到精通(一):MyBatis入门
- Docker入门(一)用hello world入门docker
- 赵童鞋带你入门PHP(六) ThinkPHP框架入门
- 初学者入门 Golang 的学习型项目,go入门项目
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
新零售:低价高效的数据赋能之路
刘润 / 中信出版集团 / 2018-9 / 65.00元
小米新零售,如何做到20倍坪效? 天猫小店,如何利用大数据助力线下零售? 盒马鲜生,为什么坚持必须用App才能买单? 名创优品,实体小店在电商冲击下,如何拥抱春天? 新零售的未来在何方?什么样的思维模式才可应对? 新零售,不是商界大佬的专用名词,它就在我们生活触手可及的各个角落——小到便利店的酸奶,大到京东商城的冰箱,都蕴含着消费者、货物、经营场所三者共同作用的经济逻......一起来看看 《新零售:低价高效的数据赋能之路》 这本书的介绍吧!