Git介绍与使用
# Git介绍
# Git
- Git是一个免费的、开源的分布式版本控制系统。
- 他可以快速高效地处理从小到大的各种项目。
- 他的特点是易使用、性能极快、廉价的本地仓库、方便的智存区域和多个工作流分支的特性。
# 版本控制介绍
版本控制系统是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制最重要的是可以记录文件修改的历史记录,从而让用户能够查看历史版本,方便版本切换。
版本控制使得个人开发过渡到团队协作开发。
# 版本控制的分类
# 集中式版本控制系统
- 集中式版本控制系统使用单一的集中管理服务器保存管理所有文件的修订版本。
- 客户端可以通过访问这台服务器来取出、提交或更新文件。且每个人可以有不同的管理权限。
- 代码放在中央服务器中,保证团队的人修改的是同一套代码。同时每一次修改就是一个新的版本,防止代码混乱。
- 但缺点是单节点问题,如果节点故障宕机,那么就会造成无法进行版本控制(提交或取出等),甚至数据丢失。
# 分布式版本控制系统
- 版本库可以存储在本地、远程仓库或者代码托管中心,但版本控制是在本地主机进行的。服务器断网的情况下,也可以进行开发,因为版本控制是在本地进行的。
- 每个客户端保存的也都是完整的版本库,且版本控制在本地,解决了集中式版本控制的单点问题。
- 通常也有一台充当"中央服务器"的服务器,但仅仅是用来方便"交换"修改,即便没有该节点也一样能工作。
# Git相关概念
# 工作区
- 存放本地文件的磁盘目录,电脑里能看到的目录。
- 相关命令:
git add
- 将工作区文件添加到暂存区
# 暂存区(index)
- 用于临时存储要提交到版本库的文件,一般存放在.git目录下的index文件中
- 相关命令:
git commit
- 将暂存区文件提交到版本库
# 版本库(本地仓库)
- 用于进行管理版本控制等,存放在工作区的隐藏目录.git,这个不算工作区,而是Git的版本库,这个目录里面的所有文件都可以被Git管理起来。
- 相关命令:
git push
- 将本地版本库的版本推送到远程仓库
# 代码托管中心
- 基于网络服务器的远程代码仓库,简称为远程仓库,比如:github、gitlab
# HEAD指针
- HEAD指针指向的分支(比如Master分支),就是当前分支。
# Git分支
- 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交。
- 再把HEAD指向dev,就表示当前分支在dev上。然后接下来对工作区的修改和提交就是针对dev分支了。
# Git合并
假如我们在dev上的工作完成了,就可以把dev合并到master上。
最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。
合并完分支后,甚至可以删除dev分支,删掉后,我们就剩下了一条master分支。
# Git命令
Git命令必须在Git仓库目录下执行 (配置命令除外),也就是要切换到有.git
目录的目录下。
# 签名配置命令
第一次执行Git命令前应当先配置签名信息,签名的作用是区分不同的操作者身份,是必须设置的,否则无法提交代码到版本库。
git config --global user.name [用户名]
- 设置用户签名中的用户名git config --global user.email [用户邮箱]
- 设置用户签名中的用户邮箱
# 工作区相关命令
# git init
- 初始化版本库,在没有
.git/
的目录下执行以进行初始化。
# git diff
git diff [文件名]
- 比较文件在暂存区和工作区的差异。git diff --cached [file]
- 显示暂存区和上一次提交(commit)的差异。
# git status
查看当前所在目录的版本库状态。
- On branch master - 表示当前在主分支
- Untracked files - 表示Git还没有追踪下列文件
# git rm
git rm [文件名]
- 将文件从暂存区和工作区中删除。
# git stash save
git stash save "记录名"
- 保存工作区和缓存区为记录,会保存当前分支的工作区和缓存区的文件。- 比如突然要切换到另一个分支修改东西,但当前分支又修改了东西,但又没写完不想提交时,就可以使用stash进行临时保存记录。
- 注意:在没有还执行add之前才能执行stash。
# git stash list
- 查看所有保存的记录列表。
# git stash apply
git stash apply "记录名"
- 从记录恢复到工作区和缓存区,不会删除用于恢复的记录。如果不指定记录名则默认恢复最新记录。
# git stash pop
git stash pop "记录名"
- 从记录恢复到工作区和缓存区,会删除用于恢复的记录。如果不指定记录名则默认恢复最新记录。
# git stash drop
git stash drop "记录名"
- 删除保存记录,如果不指定记录名则默认删除最新记录。
# 暂存区相关命令
# git add
git add [文件名]
- 添加一个或多个文件、目录到暂存区,为.
时则是添加当前目录下的所有文件到暂存区。- 工作区修改或新增的文件的内容会被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
# git rm
git rm --cached [文件名]
- 将一个或多个文件、目录从暂存区移出。- 会从暂存区删除文件,工作区则不做出改变。
# git checkout
git checkout -- [文件名]
- 将一个或多个文件、目录在工作区的修改或删除全部回退- 两种情况
- 修改后还没有被放到暂存区,回退修改就回到最近一次提交版本库的状态
- 修改后已经添加到暂存区,回退修改就回到最近一次添加到暂存区后的状态
# git reset HEAD
git reset HEAD [文件名]
- 回退暂存区的修改,重新放回工作区- 配合
checkout --
可实现回退到上次提交
# 版本库相关命令
# git commit
git commit -m "提交的版本日志信息" [文件名<可选>]
- 将暂存区的所有文件提交到版本库。- 暂存区的目录树写到版本库中,然后当前分支会指向刚刚提交的新的目录树。
# git reset --hard
git reset --hard [版本号]
- 可直接指定切换的版本号,通过reflog查看- 或者版本号也可以指定:
HEAD~n
:表示上n个版本、HEAD^
:表示上一个版本
- 或者版本号也可以指定:
将暂存区与工作区都回退到指定版本,实际就是指向当前版本的HEAD指针所指向的目录树的改变
┌────┐ │HEAD│ └────┘ │ └──> ○ version 1.0 │ ○ version 1.1 │ ○ version 1.2
1
2
3
4
5
6
7
8
9
# git reflog
- 查看分支的版本信息
# git log
- 查看详细的版本信息
# 远程仓库相关命令
# git init --bare
git init --bare [仓库名].git
- 远程仓主机中执行,创建一个空仓库
# git remote add
git remote add [远程仓库名] 远程主机用户@远程主机:远程仓库物理路径
- 添加远程仓库- "远程主机用户@远程主机:远程仓库"这一串是URL,是用于连接远程仓库的,如果远程主机SSH端口不是22端口,则应当指定SSH://开头,同时远程主机后面跟端口号
# git clone
git clone [远程仓库名] git@远程主机:远程仓库路径
- 克隆远程仓库到本地
# git push
git push [远程仓库名] [分支名]
- 将指定分支推送到远程仓库- 如果是因为远程分支比本地的更新导致推送失败,则需要先用git pull尝试合并。如果合并有冲突,则解决冲突,并在本地提交。
- 第一次推送时加上-u参数。Git就会把本地的master和远程的master关联起来,在以后推送或者拉取时就可以简化命令成git push
# git pull
git pull [远程仓库名] [分支名]
- 将远程仓库的分支拉取到本地。- 需要设置本地分支与远程分支的对应关系,
git branch --set-upstream-to [分支名] 远程仓库名/远程分支名
。
# git remote -v
git remote -v [远程仓库名]
- 查看远程仓库信息。
# git remote rm
git remote rm [远程仓库名]
- 删除远程仓库连接。
# 分支合并相关命令
# git branch
- 查看所有分支,当前分支前面会标一个*号。
# git branch [分支名]
- 创建一个分支。
# git branch -d [分支名]
- 删除一个已合并的分支。
# git branch -D [分支名]
- 强制删除一个未合并的分支。
# git switch [分支名]
- 切换到指定分支,同等于git checkout [分支名]。
# git switch -c [分支名]
- 创建分支然后切换到该分支。
# git merge [分支名]
- 合并指定分支到当前分支。
- 默认是Fast-forward合并模式,快进模式合并就是直接把master指向dev的当前提交,所以合并速度非常快。
- 加上
--no-ff
参数就可以用普通模式合并。- 合并后的历史有分支,git log能看出来曾经做过合并。
- 而fast forward合并删除分支后就看不出来曾经做过合并。
# git cherry-pick [commit id]
- 能够把另一个分支的一个或多个提交复制到当前分支。git log命令可以获取提交的commit的id。
# Git强制删除历史版本
# 删除所有提交历史记录,但将代码保持在当前状态,可以按照以下方式安全地执行此操作:
git checkout --orphan latest_branch
# 添加所有文件
git add -A
# 提交更改
git commit -am "commit message"
# 删除分支
git branch -D master
# 将当前分支重命名
git branch -m master
# 强制更新存储库
git push -f origin master
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 简写为以下:
git checkout --orphan latest_branch && \
git add -A && \
git commit -am "init" && \
git branch -D master && \
git branch -m master && \
git push -f origin master
1
2
3
4
5
6
7
2
3
4
5
6
7