Git的常用命令与版本控制
Git和SVN的区别
-
Git:分布式存储
-
SVN:集中式存储
分布式存储和集中式存储
集中式中央存储:
在集中式的中央存储中,所有的代码和相关分支信息都是属于存储的中央服务器的。
当你需要拉代码的时候,本地会向服务器获取最新版本信息,从而在本地存储下来。
并且同时,因为SVN使用的是增量存储,所以只会存储你之前上传的版本信息和代码。
分布式存储:
在分布式存储中,每一台电脑都可以是版本管理服务器。
当你从线上拉取代码下来的时候,Git会将版本的信息和文件的修改都发给你。
Git和SVN是如何保存分支的
依据上述不同存储方式的区别可知。
Git在存储版本信息的时候,实际上会对版本进行校验,你本地的分支如果落后于线上的版本时
会提示你将本地的分支升级为最新的线上分支,也就是pull。
因为它必须保证你当前本地的版本库也是一种分布式存储,这样哪怕线上的库宕机了,你本地也可以有最新的、并且包括整个分支的代码。
而当你尝试拉取的线上代码,和你本地的文件有重复的时候,会提示你本地必须提交相对应的文件,才可以继续拉取代码。
从而达到,如果哪怕你本地的代码被冲突了,被莫名其妙合并成另外一个文件了,缺行少列了,也都无所谓。
因为你可以回滚到曾经提交的那个版本,那个版本里的文件还没有被拉下来的代码冲突。
但如果是SVN则不会,因为它是一种增量式的存储。如果你的代码和线上的代码不同,则会将你的修改和线上的修改合并成一个冲突文件存在于服务器上,默认为你有修改,并且擅自主张将可以合并的行和列给合并,把不能检测到合并的不同行和不同列形成冲突的代码块放在文件中。
所以在使用SVN进行版本管理的时候,一直会强调先拉后提。因为害怕本地因为版本库的落后,而导致提交代码时将线上最新的代码给回复成之前落后版本的代码。
Git常用的版本管理概念
Git版本控制流程
根据上面图片的展示,来详细说一下Git中,常用的版本控制流程。
在说版本控制流程前,大致说一下Git在初始化时的操作。
git init : 将当前在的文件目录,初始化为一个空的Git仓库。这个仓库在初始化后,会多出一个.git的隐藏文件夹
git config : 当你需要对当前git仓库进行某些设置的时候,则需要使用此配置,大多数情况下会使用这个来配置登录的账号和邮箱。
在说完了基本的仓库初始化过程,再来说整体的版本管理流程。
- 在初始化完了仓库后,仓库中会默认有一个名为master(主)分支。
- 一般来说,多人协作工作时,很少直接会在master上直接修改代码。多数时,是创建各自分支,或develop分支进行工作,最后当需要出某个迭代版本时,更新到master分支上,并打上tag。
- 在有了库,以及主要分支后,那么就可以通过克隆,将版本库克隆到本地了。
- 克隆到本地后,就可以按照正常的编写代码了。
- 在编写代码后,进行提交,将当前的代码以一个提交单位,保存到本地。
- 最终检查无误,推到线上。
- 在这里,推送到线上会有两种情况,其中一种是成功顺利推送。还有一种是推送失败,提示你,必须将线上代码拉下来才可以推送。如果是提示你必须拉下来,那么就可能是本地文件与线上文件有冲突。那么拉一下线上的代码后,本地会形成冲突文件。
- 解决冲突文件。形成的冲突文件会很清晰得展示前后的文件对比。并且哪一方是本地,哪一方是线上的,展示的也很清楚,你可以选择使用线上的那一部分,也可以选择使用你自己的这一部分,或者是线上线下的都使用。
- 在解决冲突文件后,再推送是推送不上去的。因为你的冲突文件修改完后实际上还是在本地,你需要先提交一下,才能继续推送。
- 在冲突完如果使用查询当前本地文件状态的命令后,你也许会发现,待提交的文件里多出很多不属于你的文件。这是正常的。因为当产生冲突以后,git会自动将线上与你冲突的文件当时提交时一起提交的文件,和你本地这一次一起提交的文件放在一起当作一个新的提交重新提交。而这一次,又被称为合并,也叫冲突合并。
- 所以,在处理冲突的时候,实际上你的分支进入了冲突并且需要被合并的状态中。虽然你可以随意修改其他没有问题的任何的文件代码,但我不推荐这么做。因为当你去修改后,实际上你的本次修改就和其他因为冲突的文件一起被提交上去了。到时候如果你因为代码错误,想要回退到这个版本时,也会把当时线上因为冲突而拉下来的文件一起再次拉下来,因为属于同一次提交。
- 一般而言根据以上对于冲突时,分支的状态。可以了解,如果遇到冲突。那么就先把冲突解决,并且提交。然后再继续进行其他的修改,或直接推送到线上,表示修复了本次冲突。
分支间处理流程
分支之间的处理一般分为以下几个步骤。
- 拉取分支:从版本库中拉取所有分支。
- 创建分支:以当前所在分支,创建一个新的分支。新的分支中的代码,与之前所在的分支中一样。
- 修改分支:对当前的分支进行名称修改,或者是代码修改。
- 合并分支:将其他分支合并进当前分支。
- 提交分支:提交当前分支进版本库。
- 删除分支:删除本地/远程分支。
PR——Pull Request
PR是一种特殊的分支合并方式。
主要的目的是将一个分支里的代码,合并到另一个分支,而这个分支,甚至可以不需要在同一个仓库中。
Git常用的版本管理命令
仓库拉取及提交流程相关命令
git clone [repoURL]: 仓库拉取命令
git checkout [branchName]: 切换分支命令。
git checkout .: 切换当前分支。
!!!必须要注意的是:切换分支本身是用来切换到其他分支的。
所以当你想用这条命令,切换到当前分支时。
潜意思其实就是将当前所作的更改,全部恢复到这个分支刚开始的时候。
git checkout [fileName]: 与git checkout .切换到当前分支是一个概念。
当你想在当前分支中,checkout一个原本线上的一个文件,也就是将线上的文件覆盖本地的这个文件。
本地这个文件所做的所有修改将会被覆盖成线上当前分支的文件。
git pull: 拉取当前分支的线上代码。
git pull [remoteStream] [branchName]: 拉取绑定过的指定远程仓库的指定分支。
git status: 查看当前分支状态,包括已提交,待提交,新添加的文件。还包括当前分支是否落后或比线上分支更先进。
git add [fileName] [fileName]...: 添加多个文件或单个文件进待提交状态。 可以直接用 git add .来添加所有文件进待提交状态
git reset [fileName] [fileName]...: 将多个文件或单个文件取消待提交状态。 可以直接用 git reset .来取消所有待提交状态
git commit -m '': git commit是提交的命令,但极其不推荐在多人协作开发中直接提交代码。
加上-m '',即可在''中输入对当前提交的描述,可以包括做了哪些功能,或者修改了什么问题。
tip:如果在git commit -m '之后就直接回车,可以换行输入描述。
只需要在最后再次输入'进行关闭,即可直接提交。
git push: 将当前分支的所有commits,推送到线上版本库。
分支处理相关命令
git branch: 查看当前所有本地分支。
git branch -a: 查看版本库上所有分支。
git branch -b [branchName]: 在本地创建新分支。
git merge ([remoteStream]) [branchName]: 从其他分支合并进当前分支。
git branch -d [branchName]: 删除本地当前分支。
git branch -D [branchName]: 删除本地及远程该分支。
其他命令
git remote: 查看当前本地仓库绑定的远程仓库名。
git remote -v: 查看当前本地仓库绑定的远程仓库名及其仓库地址。
git add remote [remoteStreamName] [remoteStreamURL]: 新增远程仓库。
禁用命令
git reset HEAD^ / git checkout [commit]: 返回上级/返回历史版本。
tip:本身返回上级或返回历史版本是可以允许的,但是由于返回后还涉及到历史版本及当前版本的合并和提交,为了保险起见。一般来说禁止使用此方法。
并且如果想看历史版本,可以使用网页端中的历史commit来查看。
git push --force: 强制推送。一般用了上面命令去回退版本后,git默认是不允许。
绝对不允许你直接推送的,因为你回退了版本后,当前的文件就和线上的文件不一样了。
一般来说,当本地和版本库中的版本不一样以后,是需要再pull一下才能推送的。
所以强制推送就可以在这时候忽略git pull提示,强制推送。
所以,此语法是禁止使用的。
另外,gitlab是可以开启分支保护,禁用git push --force。
可以将权限放开给指定部分成员。