git:分布式版本控制,最流行的版本控制工具。
文前了解: 仓库是用来存储代码的地方,也可以称之为版本库。仓库包括两种类型:本地仓库和远程仓库。本地仓库指的是在本地计算机上存储的仓库,可以使用git init命令创建,也可以通过克隆远程仓库得到。远程仓库指的是存储在远程服务器上的仓库,可以使用git clone命令从远程服务器上克隆得到。
1.1 git的安装
1.2Git的工作流程
一般工作流程
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
1.3Git的基础原理
git的原理-git的四个区域
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
1.4 git构建仓库
1.4.1 创建裸仓库
命令:git init --bare
初始化裸仓库,用于做为git服务端共享仓库。
什么是裸仓库?
- 裸仓库可以理解为理解为轻量级的仓库,只包含.git文件夹的仓库。(就算黑客攻击了服务器也无法从中拿到代码)
- git分为三个工作区:工作区、暂存区域、Git 仓库,裸仓库实质上就是没有工作目录的Git仓库。它只包含Git版本库中的对象,没有其他的文件或目录。它提供了一种轻量级的方式来共享代码库,因为它占用的空间更小,传输速度更快。
裸仓库的clone命令
- 命令:git clone --bare xxx.git
*裸仓库的限制
在裸仓库中,只能进行push和fetch操作,不能进行直接的commit或merge操作。这是因为裸仓库没有工作目录,无法进行文件编辑和合并。通常情况下,裸仓库是用来实现 Git服务器的。开发者可以使用它来共享代码库,管理代码版本,保持团队协作等。
1.4.2 创建普通仓库
命令:git init
普通仓库里面是有代码的,我们可以看见
普通仓库的clone命令
- 命令:git clone xxx.git
- 如果想要clone别人电脑上的代码也可以通过ssh连接对方电脑并输入用户名密码进行clone,如果不想输入密码则可以通过生成ssh的公钥和私钥 ,将公钥拷贝到对方机器中。
- 生成密钥的命令:ssh-keygen -t 加密算法
1.4.3 Git配置
- git 的设置使用 git config 命令。
- 编辑 git 配置文件:git config -e # 针对当前仓库
- git config -e --global # 针对系统上所有仓库
1.5Git的基本命令
-
提交与修改
命令 说明
git add : 添加文件到暂存区
git restore: 将暂存区的文件取下来
git status : 查看仓库当前的状态,显示有变更的文件。
git diff : 比较文件的不同,即暂存区和工作区的差异。
git commit: 提交暂存区到本地仓库。
git reset: 回退版本。
git reset --mixed head~1: 退回到工作区
git reset --soft head~1 退回到暂存区
git reset --hard head~1 直接抹掉上一次的提交
git rebase --continue 合并冲突,结合"git add 文件"命令一起用与修复冲突,提示开发者,一步一步地有没有解决冲突。
git rebase --abort 会放弃合并,回到rebase操作之前的状态,之前的提交的不会丢弃
git rebase --skip 将引起冲突的commits丢弃掉(慎用!!)
git rm: 将文件从暂存区和工作区中删除。
git mv: 移动或重命名工作区文件。
git checkout: 分支切换。
git switch: 更清晰地切换分支。
git restore : 恢复或撤销文件的更改。 -
提交日志
命令 说明
git log: 查看历史提交记录
git blame : 以列表形式查看指定文件的历史修改记录 -
远程操作
命令 说明
git remote: 远程仓库操作
git fetch: 从远程获取代码库
git pull: 下载远程代码并合并
git push: 上传远程代码并合并 -
整理操作
命令 说明
git rebase -i 整理很久以前的提交
git commit --amend 整理上一次的提交
1.6 Git分支管理
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线,使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作,Git 分支实际上是指向更改快照的指针。
-
git branch (branchname) 创建分支命令
-
git checkout (branchname) 切换分支命令
-
git merge 合并分支命令
-
git branch 列出分支命令,没有参数时,git branch 会列出你在本地的分支。
-
git branch -d (branchname) 删除分支命令
-
git branch --merged 显示所有已合并到当前分支的分支
-
git branch --no-merged 显示所有未合并到当前分支的分支
-
git branch -m master master_copy 本地分支改名
-
git checkout -b master_copy 从当前分支创建新分支master_copy并检出
-
git checkout features/performance 检出已存在的features/performance分支
-
git checkout --track hotfixes/BJVEP933 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
-
git checkout v2.0 检出版本v2.0
-
git checkout -b devel origin/develop 从远程分支develop创建新本地分支devel并检出
-
git checkout – README 检出head版本的README文件(可用于修改错误回退)
-
git merge origin/master 合并远程master分支至当前分支
-
git cherry-pick ff44785404a8e 合并提交ff44785404a8e的修改
-
git push origin master 将当前分支push到远程master分支
-
git push origin :hotfixes/BJVEP933 删除远程仓库的hotfixes/BJVEP933分支
1.7Git查看提交历史
Git 提交历史一般常用两个命令:
- git log - 查看历史提交记录。
- git blame - 以列表形式查看指定文件的历史修改记录。
git log 显示了从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。
- git log 命令的基本语法:git log [选项] [分支名/提交哈希]
常用的选项包括:
- p:显示提交的补丁(具体更改内容)。
- oneline:以简洁的一行格式显示提交信息。
- graph:以图形化方式显示分支和合并历史。
- decorate:显示分支和标签指向的提交。
- author=<作者>:只显示特定作者的提交。
- since=<时间>:只显示指定时间之后的提交。
- until=<时间>:只显示指定时间之前的提交。
- grep=<模式>:只显示包含指定模式的提交消息。
- no-merges:不显示合并提交。
- stat:显示简略统计信息,包括修改的文件和行数。
- abbrev-commit:使用短提交哈希值。
- pretty=<格式>:使用自定义的提交信息显示格式。
1.8添加远程仓库(Github)
可以看看这个
GitHub
1.9Git可视化工具
Git 可视化工具可以帮助开发者更直观地查看和管理代码版本控制历史,以下是几个常用的 Git 可视化工具:
- GitKraken:提供了强大的图形界面,包括代码历史记录、分支管理、合并冲突解决等功能。
- Sourcetree:提供了友好的用户界面,可以轻松地进行代码提交、分支管理和冲突解决等操作。
- GitHub Desktop:提供了清晰明了的界面,可视化显示代码历史记录、分支管理、拉取请求(pull request)等功能,以及与 GitHub 网站的集成支持。
- Git GUI:对于习惯命令行操作的开发者来说,Git GUI 可以提供便捷的图形化界面。