开局先来一个故事吧,故事看完如果不想看枯燥无味的指令,没关系我已经把这篇文章的内容录制成了一个视频,点击文末阅读原文就可以观看。或者说你已经熟练掌握 很多人都知道,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了。 本文使用的是win7平台。 介绍命令之前先来张图吧,所有的命令都是围绕张图的 Workspace: 工作区,就是你平时存放项目代码的地方 Index / Stage: 暂存区,用于临时存放文件的改动,事实上它只是一个文件,保存即将提交到文件列表信息。 Repository: 本地仓库区(或版本库),就是安全存放数据的位置,这里面有我们提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。 Remote: 远程仓库,托管代码的服务器。 弄清楚上面四个概念,我们就开始实操吧。 通过 执行完这个命令我们可以看到文件下面会多一个 此时的 提交后 如果新增了文件,必须使用分开的命令,不能用合并命令。 在使用本命令后,本地的修改并不会消失,而是回到了上面 未使用 用命令 关联之前肯定要在远程创建仓库 关联后,使用命令 以后,每次本地提交后可以使用命令 基于 当有冲突的时候这里会个正在合并的状态 实际项目中如果我们需要开发一个功能完整的流程是什么样的呢? 多数公司模式应该下面这样的流程吧。 1.先基于主干分支 拉出一个功能分支(git的产生背景
git
的使用了,可以直接跳到总结部分(一个好玩的游戏)去检验下你掌握的熟练程度。git 的安装
Git
可以在Linux
、Unix
、Mac
和Windows
这几大平台上安装了,可以根据自己的操作系统去官网下载。git 常见命令
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] 第一次提交
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;
关联远程仓库 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>
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结束