当我学习一个新东西的时候,习惯于把它看成一种解决方案.而在每一种解决方案的背后,都会存在一个或多个问题.而整个学习过程就是在寻找,明确这些问题.
为什么会有git
git本身作为一个解决方案,肯定存在与之相对应的问题.
学完之后发现git解决两个问题.
- 做有些事情时候很少有人能够从头到尾一气呵成.需反复地修改才能完成.为了让修改工作更加高效,记录历史信息就非常有必要了.(在软件开发领域,把记录历史这一件事情叫做版本控制)
- 如果两个人要合作做一件事情,那么在合作中会出现的一些问题git可以帮助他们解决.
解决方案的两种形式
目前的解决方案主要分为两种
集中式
其代表为svn
通过将修改的内容统一提交到远程服务器,由远程服务器来记录每一次提交历史信息.每一次提交就相当于创建一个恢复点.在未来的某个时刻,可以直接恢复到以前的某一个提交之后的状态.
svn通过分支功能来辅助参与者相互协作.在完成一个产品的时候给每一个参与者创建一个分支(类似于一个副本,当然这里不可能是一个完全的copy,只是一个指向主分支的一个指针).然后每一个参与者都是在自己的分支上完成相应工作,最终合并到主分支.以此来达成协作.
分布式
其代表为git
通过将修改的内容提交到本地服务器,由本地服务器来记录每一次修改的历史信息.好处在于不用联网就可以达到记录历史信息的目的.
git同样是通过分支功能来达成协作的.不同的是,因为是分布式的,所以每一个参与者都有一个完整的备份,安全性更高.而且git有一个非常大的优势,在于它有一个全球公用的服务器(github),可以实现全球范围内的协作.
如何使用git
几个新概念
- Working Directory(工作区)
就是一个工作目录,文件的修改内容最开始是保存在这里的,如上图. - Repository(版本库)
为.git文件夹 -
Stage(暂存区)
一个为了优化使用体验而设计的一个存储区域,位于.git文件夹内部.比如你有A-J总共10个要提交的文件,但是文件A,D,H为相关文件要一次性提交,如果等10个文件全部编辑完后直接提交的话操作起来比较麻烦.如果用stage的话,可以在完成每一个文件后将其add到stage中.之后,就可以一次性提交了.
-
分支
分支只是一个形象的描述.每当新建一个分支的时候实际上只是新建了一个指针.然后由这个指针跟踪的若干提交共同组成了一个分支.
git针对记录历史信息提供的解决方案有:
- 查看当前版本库的状态,提交修改
git status
--将修改提交到stage
git add file
--将修改从stage提交到版本库
git commit file
- 可以退回到之前的某一次提交.
git reset --hard commit_id
- 用暂存区提供(新增,撤销,提交)每一次修改(包括增,删,改)的功能.
--将修改退回到stage,或者上一次提交的状态.
git checkout -- file
--将stage中的内容退回到上次提交时的状态.
git reset HEAD file
--删除版本库中的文件
git rm file
- 可以对比当前版本与之前版本的异同.
--各种异同对比,分支,文件,工作区和暂存区
git diff
git针对辅助协作提够的解决方案有:
- 创建,删除,合并(merge)新的分支.
--创建新分支
git branch branchName
--切换分支
git checkout branchName
--分支合并
git merge branchName
--删除分支
git branch -d branchName
- 提供stash功能可以保存工作区中未提交时的内容.方便未来的某个时刻恢复工作区.
本地库和github交互:
--创建与远程分支关联的本地分支
git checkout -b branch-name origin/branch-name
--建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name;
--推送本地修改
git push origin branch-name
--同步远程修改
git pull
--clone远程分支
git clone git_address
以上的内容算是我使用git的一个知识框架.有很多的细节没有说明,但是只要有了这个框架,到时候填充细节的话就很容易了.