1.版本控制工具的演变
1.1本地版本控制系统(VCS)
- 利用数据库记录文件的历史更新差异。例如rcs
- 缺点:不同系统上的不能协同工作
1.2 集中化的版本控制系统(CVCS)
- 将版本信息和修改信息都保存在中央服务器上。如果需要对比代码就要和中央仓库中的代码进行比较。例如 CVS Subversion
- 缺点:服务器单点故障的时候,中央服务器或者网路有问题的时候,就不能提交代码,对比等操作了。工作就不能进行了
1.3 分布式版本控制系统(DVCS)
- 将中央服务器的代码都拷贝到本地仓库中,本地仓库就是中央仓库在某个特定时刻的完整拷贝。
- 使用者提交代码或者进行对比的时候都可以和本地仓库交互来完成。与别人要共享的时候才将本地仓库推送到远程仓库。
- 一旦远程仓库宕机,可以用本地仓库进行恢复。
1.4 SVN和Git 区别
(1) 存储上的区别: git 保存的是快照,svn保存的文件的变化
-
svn 存储的是每个文件的变化 。当你需要从version4 到version2的时候就需要根据△来计算。当版本进行来回之间修改的时候效率就会很低。
-
git 存储完整的文件快照 如果要从version4 到version2 只要将指针的指向切换就行了。所以版本进行分支切换效率高
(2)git 几乎所有操作都是在本地完成,svn需要与服务器通讯才能完成操作。
(3)git 使用SHA-1 hash生成提交版本号(保证内容的完整性),svn使用递增的编号来作为版本号。
2. git 基本概念
2.1 git 的三种状态
- 已修改:修改了文件,没有放入到暂存区域中。
- 已暂存:已修改文件包含到了下次提交的快照中,但是没有提交
- 已提交:文件已经在本地仓库中,可以在分支的历史上查看到提交
2.2 git的三个区域
- 工作目录:就是某个版本的快照内容,提取到工程环境下,供大家修改。
- 暂存区域:是一个文件,保存了下一次需要提交的文件列表信息。
- git仓库:保存元数据,当使用远程服务器克隆或者推送就是使用这个
3.git 基本命令
git init
创建一个空的本地仓库或者重新初始化一个已经存在的仓库
git clone
克隆远程仓库到本地目录
git remote
管理远程仓库
-
git remote
查看远程仓库
-
git remote add [shortname] [url]
添加新的远程仓库
-
git remote -v
查看远程仓库和克隆地址
-
git remote rm xx
删除远程仓库 -
git remote rename xx yy
将远程仓库在本地的简称重命名 -
git remote show [remote-name]
查看远程仓库的详细信息
git status
记录工作区状态
git log
记录提交日志
- git log -p -2
-p 显示每次提交的内容差异, -2 显示最近两次的提交
–since --before 表示从指定日期的起始和指定日期的结束 --author 指定作者
git reflog
记录分支的所有操作
git log 只记录了提交日志,而git reflog记录了所有的提交日志;git reflog只存在于使用者的本地仓库,而不会与远程仓库同步,而git log 远程仓库和本地仓库保存相同
git config
修改git配置文件
- git config --add
git config --add user.name xxx
git config --add user.email xxx - git config -e
查看配置
git add
将xxx从工作区加到暂存区(包括未跟踪和已经跟踪)
- git add . 或者git add *
将所有修改的操作添加到暂存区。 - git add -u [
]
把中所有跟踪文件中被修改过或已删除文件的信息添加到索引库。它不会处理那些不被跟踪的文件。省略 表示 .
git commit
-
git commit -m ‘xxxx’
将暂存区的提交到本地仓库 -
git commit -a -m ‘xxx’
将工作区中已经跟踪的直接跳过暂存区提交到本地仓库 -
git commit --amend
修改最后一次提交
git push
git push [remote-name] [local-branch-name]:[remote-branch-name](默认使用 origin 和master)
注意:在推送之前,将远程分支抓取到本地
- git push -u origin mybranch
将分支mybranch设置为跟踪来自origin的远程分支mybranch,下一次推送的时候直接git push
git diff
显示不同提交,不同工作区域,不同分支之间的差别
- git diff
查看工作区与暂存区之间的差别(默认)
git add 以后就会同步了。
- git diff --cached 或者 git diff --staged
查看暂存区和本地仓库的区别
使用 git commit 就会使暂存区和本地仓库同步 - git diff commit_id1 commit_id2
比较不同提交记录(commit)的区别 (可以是commit id的前几位)
- git diff branch1 branch2
比较不同分支的区别
git fetch
拉取远程仓库到本地分支,但不会自动合并到当前分支。需要进一步手动合并git merge origin/mybranch
git merge
合并分支
(1)当要和master分支合并的时候,先切换master分支,然后合并
(2)git merge --abort
将这次的合并取消
git pull
拉取远程仓库到本地分支 并且 合并分支(git fetch+git merge)
git branch
- git branch
查看当前分支
git branch -v
查看各个分支最后一个提交的对象
git branch --merge
查看已经并入当前分支的分支
git branch --no-merge
查看未并入当前分支的分支 - git branch xxx
创建分支 - git branch -d xxx
删除分支
git checkout
-
git checkout xxx
将分支切换到xxx -
git checkout -b xxx
创建分支xxx,并切换到xxx -
git checkout的另外一种用法:将本地工作区还原成本地仓库的样子
git checkout – filename
也可还原到某个版本号的文件
git checkout commit_id filename
也可还原到上次提交的文件
git check HEAD~ filename (HEAD表示当前提交,HEAD~就是上一次提交)
git reset
- git reset HEAD~
将暂存区重置到上一次提交。然后head指向上一次提交 - git reset --hard HEAD~ 或者git reset --hard commit_id
将暂存区和工作区重置到上一次提交(这种情况是不可逆的,用的时候小心!)
它会将之后的提交版本号都撤销 - git reset --soft HEAD~
只是将head 指向上一次提交。
注意:可以使用git diff 和git diff --cached 进行验证比较
git revert
撤销已经存在的提交,与git reset相比不会将版本号消除
git revert commit_id
git cherry-pick
用于把某次的提交的内容合并到当前分支
应用情景:急于把修复的内容提交,而其余的业务不需要提交,那么就是先切换到master分支,然后
git cherry-pick commit_id 如果有冲突就解决冲突。解决完冲突 git cherry-pick --continue
git rebase
用于把一个分支的修改合并到当前分支
与git merge 的区别就是更加整洁
参考 git pro http://git.oschina.net/progit/