学习 · 2021年9月23日 1

Git基础知识整理

版本控制系统区别

RCS(Revision Control System)本地版本控制
原理:在硬盘上保存补丁
缺陷:无法让多人协同工作

CVCS(Centralized Version Control System)集中化版本控制
原理:集中管理服务器
缺陷:有服务器故障风险

DVCS(Distributed Version Control System)分布式版本控制
原理:完全镜像代码仓库,每一次的克隆操作都是对代码仓库的完整备份

Git(DVCS)

原理:计算校验和机制-SHA-1散列(Hash)

直接记录快照,而非差异比较(快照流)
提交时,会对全部文件创建一个快照并保存其索引
如果文件没有修改,则不再重新存储,而是保留指向之前存储的文件链接
近乎所有操作都是本地执行

优点:浏览项目历史,保证完整性,不可能在Git不知情时更改任何文件内容或目录内容

三种状态:已提交-commited 、已修改-modified 、已暂存-staged
三个阶段:工作区 、暂存区 、Git目录

工作流程:

  • 在工作区中修改文件
  • 将想要下次提交的更改选择性暂存,这样只需将更改部分添加至暂存区
  • 提交更新,找到暂存区的文件,将快照永久性存储到Git目录

基础命令:

git init(创建一个.git子目录):将尚未进行版本控制的本地目录转换为Git仓库:
git add:追踪文件
git commit:进行初始提交
git clone:从其他服务器克隆一个已存在的Git仓库(克隆的是该Git仓库服务器上几乎所有数据)

文件管理

git status:检查当前文件状态
git add:跟踪新文件
git add:暂存已修改文件
.gitignore:忽略文件

  • 所有空行或者以#开头的行都会被Git忽略;
  • 可以使用标准的glob模式匹配,它会递归地应用在整个工作区中;
  • 匹配模式可以以(/)开头防止递归;
  • 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

git diff:查看已暂存和未暂存的修改(当前做的哪些更新尚未暂存,有哪些更新已暂存并准备好下次提交)
git diff –staged:查看已暂存的将要添加到下次提交里的内容
git commit:提交更新
git commit -a:跳过使用暂存区域(会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤)
git rm:移除文件(从暂存区域移除)
git rm -f:强制删除(之前修改过或已经放到暂存区的文件)
git rm –cached:从Git仓库删除,但仍然希望保留在当前工作目录
git mv:移动文件(只能更改版本控制下的文件)

  • 相当于运行了三条命令
  • mv from_file file_to
  • git rm from_file
  • git add file_to

 

查看提交历史

git log:按时间先后顺序列出所有的提交,最近的更新排在最上面
git log –stat:提交的简略统计信息
git log –pretty=oneline/format:可以使用不同于默认格式的方式展示提交历史(限制输出长度)
git log -n(整数):只显示n条提交

git log –since/–until:撤消操作

git commit –amend:重新提交,从效果上来说,就像是旧有的提交从未存在过
git restore –staged <file>:取消暂存的文件
git restore <file>:撤消对文件的修改

远程仓库管理

git remote:查看已经配置的远程仓库服务器
git remote -v:显示需要读写远程仓库使用的Git保存的简写与其对应的URL
git remote add <shortname> <url>:添加远程仓库
git fetch <remote>:从远程仓库中抓取与拉取

  • 会抓取克隆(或上一次抓取)后新推送的所有工作
  • 只会将数据下载到本地仓库,并不会自动合并或修改当前工作,需手动将其合并
  • 如果当前分支设置了跟踪远程分支,可用git pull

git push <remote> <branch>:推送到远程分支,先抓取他人工作再将其合并进工作后才能推送
git remote show <remote>:查看某个远程仓库
git remote rename/git remote remove/git remote rm:远程仓库的重命名与移除

 

打标签

git tag/git tag -l:列出已有的标签
git tag xx:创建标签,轻量标签
git tag -a v.11 -m “my version 1.1″:附注标签,存储在Git数据库中的一个完整对象,可被校验
git show v1.1 :显示指定标签及打标签者信息
git tag -a v1.2 9fceb02 :补标签,需要在命令的末尾指定提交的校验和(或部分校验和)
git push origin v1.1/git push origin –tags:共享标签
默认情况下,git push命令并不会传送标签到远程仓库服务器上,在创建完后需要推送一下
git tag -d <tagname>:删除标签,git push origin :refs/tags/v1.1同样需要显示推送一下
git checkout:检出标签,可查看某个标签所指向的文件版本(会使仓库处于“分离头指针”状态
在“分离头指针”状态下,如果做了某些更改然后提交,标签不会发生变化,新提交将不属于任何分支)

Git别名

通过git config 文件来轻松地为每一个命令设置一个别名
eg.git config –global alias.co checkout
git config –global alias.br branch
git config –global alias.unstage ‘reset HEAD –‘

Git分支

本质上仅仅是指向提交对象的可变指针
默认分支是master
每次提交时自动向前移动

git branch:分支创建(HEAD特殊指针,指向当前所在的本地分支)
git checkout xx:切换分支,HEAD指向xx
git checkout -b xx:新建并切换分支,切换分支前,暂存和修补提交
git merge:合并

如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git就没法干净的合并它们
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来,冲突内容包含一些特殊区段
使用图形化工具解决冲突:git mergetool

 

分支管理

git branch *:分支列表 (*字符代表现在检出的那一个分支)
git branch -v:每一个分支的最后一次提交
git branch –no-merged:查看所有包含未合并工作的分支

远程分支

对远程仓库的引用(指针),可将其看做书签,以提醒该分支在远程仓库中的位置是最后一次连接到它们的位置

git ls-remote:获得远程引用的完整列表
git fetch origin:与给定的远程仓库同步数据
git remote add:添加新的远程仓库

变基(rebase)

git rebase master:提取在当前分支中引入的补丁和修改,然后在目标基底分支的基础上应用一次
同于合并,但提交历史更加整洁,是直线没有分叉

风险:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基,如果你遵循这条金科玉律,就不会出差错。 否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你
遇到此问题,则用变基解决变基