这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记
为什么要学习git
协同工作:绝大多数公司都是基于Git进行代码管理。
开源社区:绝大多数的开源项目都是基于Git维护的。
01Git是什么
1.1版本控制
版本控制:一种记录一个或者若干个文件内容变化,以便将查阅特定版本修订情况
版本控制能更好的关注变更,方便对改动的代码进行检查,预防事故的发生;也能够随时切换到不同版本,回滚误删误改的问题代码;
三种版本控制
1.1.1本地版本控制
最初方式
通过本地复制文件夹,来完成版本控制,一般可以通过不同的文件名来区分版本
解决方案
开发了一些本地版本控制软件,如RCS
基本原理
本地保存所有变更的补丁集,可以理解成就是所有Diff,通过补丁,我们可以计算出每一个版本的实际文件内容
缺点
只能本地使用,无法进行团队协作,使用场景有限
1.1.2集中版本控制
代表性工具SVN
基本原理
提供一个远端服务来保持文件,所有用户将文件提交到该服务器中
增量保存每次提交的Diff,如果提交的增量中和远端现存文件有冲突,则需要本地提前解决
优点
学习简单,容易操作
支持二进制文件,对大文件支持更友好
缺点
本地不储存版本管理的概念,所有提交都只能连接上服务器后才能提交
分支上的支持不够友好,对于大型项目团队合作比较困难
用户本地不保存所有版本代码,如果服务端故障,可能容易导致历史版本的丢失
1.1.3分布式版本控制
Git
基本原理
每个库都有存在完整的提交历史,可以直接在本地进行代码提交
每次提交记录的都是完整的文件快照,而且不是记录增量
通过Push等操作来完成和远端代码的同步
优点
分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
分支管理功能强大,方便团队合作,多人协同开发
校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易丢失代码
缺点
相对于SVN更复杂,学习成本更高
对于大文件的支持不是特别的好(git-lfs工具可以弥补这个功能)
Git常用命令总结
1.添加和删除文件
添加指定文件到暂存区
git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录
git add [dir]
添加当前目录的所有文件到暂存区
git add .
添加每个变化前,都会要求确认 对于同一个文件的多处变化,可以实现分次提交
git add -p
删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]
改名文件,并且将这个改名放入暂存区
git mv [file-original] [file-renamed]
2.代码提交
提交暂存区到仓库区
git commit -m [message]
提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]
提交工作区自上次commit之后的变化,直接到仓库区
git commit -a
提交时显示所有diff信息
git commit -v
使用一次新的commit,替代上一次提交
如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
重做上一次commit,并包括指定文件的新变化
git commit --amend [file1] [file2] ...
3.分支
列出所有本地分支
git branch
列出所有远程分支
git branch -r
列出所有本地分支和远程分支
git branch -a
新建一个分支,但依然停留在当前分支
git branch [branch-name]
新建一个分支,并切换到该分支
git checkout -b [branch]
新建一个分支,指向指定commit
git branch [branch] [commit]
新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]
切换到指定分支,并更新工作区
git checkout [branch-name]
切换到上一个分支
git checkout -
建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]
合并指定分支到当前分支
git merge [branch]
选择一个commit,合并进当前分支
git cherry-pick [commit]
删除分支
git branch -d [branch-name]
删除远程分支 git push origin --delete [branch-name]
git branch -dr [remote/branch]