版本控制
记录文件的内容变化,方便将来查阅指定版本的修订情况的系统
集中式版本控制系统
最大的缺点是如果共享仓库的服务(中央服务器)单点故障,则无法提交,无法协同工作了。该系统典型代表是SVN。
分布式版本控制系统
可以解决集中式控制系统中央服务器单点故障。它会将远程仓库克隆一份到本地,就有远程仓库发生了故障,也不会影响本地仓库的文件。该系统典型代表是GIT。
GIT特性
直接记录快照,而非记录差异
SVN每个版本记录的是文件与初始版本的差异
GIT每个版本记录的是文件快照。每次提交的时候,会对当时所有文件创建一个快照并保存这个快照的索引,如果文件没有修改,则不会创建快照,而只保留一个链接指向之前存储的文件
几乎所有操作都是本地执行
绝大多数操作只需访问本地资源,不需要来自网络上的其它计算机的信息。这也是git使用起来速度快的重要原因。
GIT区域
工作区:是电脑里能看到的目录
版本库:工作区里面的一个隐藏的目录.git
暂存区:.git/index文件,暂存区也叫索引(index)
工作区的文件先添加到暂存区,然后再从暂存区添加到版本库
GIT常用命令
仓库操作
获取仓库
git init
将本地为被版本控制的目录转化为Git仓库
git clone <url> <本地文件夹名字>
从远程克隆已经存在的Git仓库
查看仓库
git remote -v
查看远程仓库和url
git remote show origin
查看远程仓库的详细信息
查看文件状态
git status
文件状态的基本变化,还有已提交状态
暂存修改
git add <目录/文件名>
对于新文件,需要跟踪,即加入暂存区;对于已经被跟踪的文件,发生了修改,暂存已修改的文件
查看已暂存和未暂存的修改
当前哪些还未暂存?哪些是已经暂存但是还没有提交的? 通过git status可以查看涉及到哪些文件,但无法查看文件的修改内容,因此,需要使用git diff。
git diff
查看工作区文件和暂存区快照之间的差异
git diff --stage
查看暂存区与最后一次提交的文件之间的差异
提交更新
git commit <-m 提交描述>
将暂存区的快照提交到本地版本库中
git commit --amend
每次提交都会生成一条提交记录,如果第一次提交了,生成了提交记录,后面对同一文件做了修改,但是在提交的时候又不想生成一条提交记录,而是想和前一条合并成一条提交记录,可以使用下面命令, 进入shell并编辑描述保存退出即可。其实--amend并不一定要在有文件修改才能用,没有任何修改也可以用于修改提交描述。该命令会使得上一次提交的记录在版本库中从来没有存在过一样。
移除文件
git rm 文件名
移除暂存区的快照和工作区的文件
git rm --cache
仅移除暂存区的快照,工作区的文件保留。这个非常有用,当不想提交的文件被不小心提交了,可以通过该命令来保留工作区文件,删除暂存区快照,后续提交也删除本地版本库的文件
查看历史提交记录
git log
以时间倒序显示日志,内容包括校验和、作者、邮箱、提交时间、提交描述
git log --pretty=oneline
美化日志输出,指定以一行的方式显示
git log --pretty=oneline --graph
参数--graph可以让日志展示出分支、合并历史
撤销
撤销对文件的修改
git checkout -- 文件路径
该方式删除文件被修改但是未被暂存的修改
撤销暂存文件
git reset 文件路径
该方式是将文件从暂存区删除,但是保留工作区文件
git reset --hard 文件路径
改方式将文件从暂存区删除,也从工作区删除。慎用。
标签
查看标签
git tag
列出所有标签
git show 标签名称
列出指定标签的详细信息
打标签
标签分为轻量级标签和附注标签,轻量级标签不能使用-a/-m选项
git tag 标签名称 [版本号]
在指定版本号打一个标签,如果未指定版本号则在最新版本号打我轻量级标签
git tag -a 标签名称 [版本号] -m 标签描述
在指定版本号打一个标签,如果未指定版本号则在最新版本号打腐竹附注标签。-a表示打的是附注标签,-m表示可以添加标签木描述。通常使用附注标签。
推送到远程仓库
git push origin 标签名称
推送本地指定标签到远程仓库
git push --tags
推送所有不在远程仓库的标签推到远程
删除标签
git tag -d 标签名称
git push origin :refs/tags/标签名称
删除本地标签并推送到远程
git push --delete 标签名称
直接删除远程标签
查看分支
git branch
查看被检出的本地分支列表
git branch -r
查看远程分支列表
新建分支
方式一:
git banch <分支名>
新建分支
git checkout <分支名>
切换分支
方式二:
git checkout -b <分支名>
创建分支并切换分支
推送&跟踪分支
git push --set-upstream origin <分支名>
如果本地新建了分支,要分享这个分支需要推送到远程仓库
拉取远程仓库数据
git fetch
仅拉取本地没有的数据,但是不会修改工作目录的内容,需要自己合并
git pull
相当于git fetch+git merge操作
合并分支
合并有两种模式:Fast-forward和no Fast-forward
Fast-forward:直接移动指针到最新的提交版本
no Fast-forward:基于两个分支的末版本和两分支的最近的共同祖先版本,共3个版本生成一个新的提交
git merge <分支名>
将“分支名”分支修改合并到当前分支
查看分支是否已合并为master
git branch --merged <分支名>
列出已经合并到<分支名>中的分支,如果未指定分支则表示当前分支
git branch --no-merged <分支名>
列出未合并到<分支名>中的分支,如果未指定分支则表示当前分支
通过查看,如果分支已经合并了,那么如果不在使用,则可以删除分支
删除分支
git branch -d <分支名>
删除本地分支,删除之前检查merge状态,即被删除分支是否与上游分支合并了,未合并则报错
git branch -D <分支名>
强制删除本地分支,不检查merge状态
git push origin --delete <分支名>
删除远程分支
重命名分支
git branch -m oldName newName
重命名本地分支
重命名远程分支
git branch -m oldName newName
git push origin --detele oldName
在oldName分支执行git push --set-upstream origin 备份分支名
在newName分支执行git push --set-upstream origin newName
变基
合并不同分支的内容有两种方式:合并和变基
git rebase <分支名>
将当前分支变基到“分支名”分支
git checkout <分支名>
git merge 切分支前分支名
变基原理:找到两个分支的共同祖先,然后将当前分支从共同祖先之后的修改形成临时文件,然后将当前分支指针指向指定“分支名”分支的目标基底,最后应用临时文件到“分支名”并移动当前分支的指针。
金科玉律:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
贮藏与清理
如果在一个分支工作了一段时间,有些修改没有提交,那么想切换到另一个分支工作,那么先贮藏,然后切换分支去工作
git stash
将即跟踪文件的修改与暂存的改动存到栈上
git stash list
查看栈中贮藏的内容列表(栈的内容列表)
git stash apply <贮藏名>
应用栈中指定贮藏内容,如果未指定<贮藏名>则应用最新的贮藏内容。这个命令,会发现原先暂存的内容并没有在应用后重新暂存,而是在工作区。
git stash apply <贮藏名> --index
通过添加--index使得原先暂存的内容在应用后重新暂存,即能保证和git stash的状态一致
git stash drop <贮藏名>
从栈中删除指定的贮藏内容
git stash pop <贮藏名>
应用栈中指定的贮藏内容并删除
重置揭秘
重置到某个版本
git reset --soft <版本号>
将版本库还原到指定的版本号,暂存区和工作区不变
git reset [--mixed] <版本号>
将版本库和暂存区还原到指定的版本号,工作区不变.--mixed可以省略
git reset --hard <版本号>
将版本库、暂存区和工作区还原到指定的版本号
通过路径来重置
git reset <file>
从暂存区删除file,工作区保留
git add <file>
将file加入到暂存区
这两个操作刚好相反
撤销某一次操作
git revert <版本号>
该操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交
git仓库迁移到另一个git仓库
迁移仓库不仅仅要要留代码,还要保留分支、历史提交记录等信息
克隆裸库并镜像推送
1.git仓库创建新仓库test_admin_new
自行创建,略
2.克隆一个裸仓库,即不带工作区的仓库
git clone --bare git-server:/mm/test_admin
$ ls
test_admin.git/
3.进入裸仓库
$ cd test_admin.git/
3.以镜像的方式将代码推送到新仓库test_admin_new
git push --mirror git-server:/mm/test_admin_new
设置remote url并推送
1.git仓库创建新仓库test_admin_new
自行创建,略
2.查看远程仓库
git remote -v
3.设置本地文件中的remote url
git remote set-url origin git-server:/mm/test_admin_new
该命令修改的是.git/config文件的url配置,origin依据第二步查询到的结果
4.推送所有分支到远程
git push --all