Git-版本控制系统
Git
1、 Git介绍
- Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目
- Git采用了分布式版本库的方式,不必服务器端软件支持。
2、 Git配置
Git提供了一个叫做
git config的命令,用于配置或读取相应的工作环境变量。这些环境变量,决定了Git在各个环节的具体工作方式和行为。
这些变量可以存放在以下三个不同的地方:
/etc/gitconfig文件:系统中对所有用户都普遍适用的配置。使用git config 时用--system选项,读写的就是这个文件。~/.gitconfig文件:用户目录下的配置文件只适用于该用户。使用git config 时用--gloabl选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config里的配置会覆盖/etc/gitconfig中的同名变量。
2.1 用户信息
配置个人的用户名和电子邮件地址,这是为了在每次提交代码时记录提交者的信息:
git config --global user.name "runoob"
git config --global user.email test@runoob.com
2.2 文本编辑器
设置Git默认使用的文本编辑器,一般可能会使用Vi或者Vim,如果有其他偏好,可以重新设置:
git config --global core.editer "code --wait"
2.3 差异分析工具
在解决合并冲突时使用哪种差异分析工具。比如要改用vimdiff的话:
git config --global merge.tool vimdiff
2.4 查看配置信息
要检查已有的配置信息,可以使用
git config --list命令:
$ git config --list
http.postbuffer=2M
user.namer=runoob
user.email=test@runoob.com
2.5 生成SSH秘钥
如何你需要通过SSH进行Git操作,可以生成SSH密钥并添加到你的Git托管服务(如GitHub,GitLab等)上
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
按提示完成生成过程,然后将生成的公钥添加到相应的平台。
2.6 验证安装
在终端或命令行中运行以下命令,确保Git已安转并配置
git --version
git config --list
3、 Git工作流程
3.1 克隆仓库
如果你要参与一个已有的项目,首先需要将远程仓库克隆到本地
git clone https://github.com/username/repo.git
cd repo
3.2 创建新分支
为了避免直接在main或master分支上进行开发,通常会创建一个新的分支:
git checkout -b new-feature
3.3 工作目录
在工作目录中进行代码编辑、添加新文件或删除不需要的文件。
3.4 暂存文件
将修改过的文件添加到暂存区,以便进行下一步的提交操作:
git add filename
# 或者添加所有修改的文件
git add .
3.5 提交更改
将暂存区的更改提交到本地仓库,并添加提交信息
git commit -m "Add new feature"
3.6 拉取最新更改
在推送本地更改之前,最后从远程仓库拉取最新更改,以避免冲突:
git pull origin main
# 或者如何在新的分支上工作
git pull origin new-feature
3.7 推送更改
将本地的提交推送至远程仓库:
git push origin new-feature
3.8 创建Pull Request(PR)
在GitHub或其他托管平台上创建Pull Request,邀请团队成员进行代码审查。PR合并后,你的更改就会合并到主分支。
3.9 合并更改
在PR审核通过并合并后,可以将远程仓库的主分支合并到本地分支:
git checkout main
git pull origin main
git merge new-feature
3.10 删除分支
如果不在需要新功能分支,可以将其删除:
git branch -d new-feature
# 或者从远程仓库删除分支:
git push origin --delete new-feature
4、工作区,暂存区和版本库
4.1 工作区
工作区是你在本地计算机上的项目目录,你在这里进行文件的创建、修改和删除操作。工作区包含了当前项目的所有文件和子目录。
特点:
- 显示项目的当前状态。
- 文件的修改在工作区中进行,但这些修改还没有被记录到版本控制中。
4.2 暂存区
暂存区是一个临时存储区域,它包含了即将被提交到版本库中的文件快照,在提交之前,你可以选择性地将工作区中的修改添加到暂存区。
特点:
- 暂存区保存了将被包括在下一个提交中的更改。
- 你可以多次使用
git add命令来将文件添加到暂存区,直到你准备好提交所有更改。
常用命令:
git add filename # 将单个文件添加到暂存区
git add . # 将工作区中的所有修改添加到暂存区
git status # 查看哪些文件在暂存区中
4.3 版本库
版本库包含项目的所有版本历史记录。
每次提交都会在版本库中创建一个新的快照,这些快照是不可变的,确保了项目的完整历史记录。
特点:
- 版本库分为本地版本库和远程版本库。这里主要指本地版本库。
- 本地版本库存储在
.git目录中,它包含了所有提交的对象和引用。
常用命令:
git commit -m "Commit message" # 将暂存区的更改提交到本地版本库
git log # 查看提交历史
git diff # 查看工作区和暂存区之间的差异
git diff --cached # 查看暂存区和最后一次提交之间的差异
4.4 三者之间的关系
1、工作区 -> 暂存区
使用 git add 命令将工作区中的修改添加到暂存区。
git add filename
2、暂存区 -> 版本库
使用 git commit 命令将暂存区中的修改提交到版本库。
git commit -m "Commit message"
3、版本库 -> 远程仓库
使用 git push 命令将本地版本库的提交推送到远程仓库。
git push origin branch-name
4、远程仓库 -> 本地版本库
使用 git pull 或 git fetch 命令从远程仓库获取更新。
git pull origin branch-name
# 或者
git fetch origin branch-name
git merge origin/branch-name
5、创建仓库
5.1 git init
GIt使用
git init命令初始化一个Git仓库,Git的很多命令都需要在Git的仓库中运行,在执行完成git init命令后,Git仓库会生成一个.git目录,该目录包含了资源的所以元数据,其他的项目目录保持不变。
使用方法
进入你想要创建仓库的目录,或者先创建一个新的目录:
mkdir my-project
cd my-project
使用当前目录作为Git仓库,我们只需要使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
使用我们指定目录作为Git仓库
git init newrepo
初始化后,会在newrepo目录下会出现名为.git的目录,所有Git需要的数据和资源都存放在这个目录中。
如何当前目录下有几个文件想要纳入版本控制,需要先用
git add命令告诉Git开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m "初始化项目版本"
2. git clone
使用
git clone从现有Git仓库中拷贝项目克隆仓库的命令格式为:
git clone <repo>
如果我们需要克隆到指定的目录,可以使用以下命令格式:
git clone <repo> <directory>
# 例如
git clone git://github.com/schacon/grit.git mygrit
参数说明
repo:Git仓库directory:本地目录
6、Git基本操作
Git的工作就是创建和保持逆项目的快照及与之后的快照进行对比。
Git常用的是一下6个命令:git clone、git push、 git add、 git commit、 git checkout、 git pull。
说明:
- workspace:工作区
- stageing area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
6.1 创建仓库命令
下表列出了 git 创建仓库的命令:
| 命令 | 说明 |
|---|---|
git init |
初始化仓库 |
git clone |
拷贝一份远程仓库,也就是下载一个项目。 |
6.2 提交与修改
Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。
下表列出了有关创建与提交你的项目的快照的命令:
| 命令 | 说明 |
|---|---|
git add |
添加文件到暂存区 |
git status |
查看仓库当前的状态,显示有变更的文件。 |
git diff |
比较文件的不同,即暂存区和工作区的差异。 |
git difftool |
使用外部差异工具查看和比较文件的更改。 |
git range-diff |
比较两个提交范围之间的差异。 |
git commit |
提交暂存区到本地仓库。 |
git reset |
回退版本。 |
git rm |
将文件从暂存区和工作区中删除。 |
git mv |
移动或重命名工作区文件。 |
git notes |
添加注释。 |
git checkout |
分支切换。 |
git switch (Git 2.23 版本引入) |
更清晰地切换分支。 |
git restore (Git 2.23 版本引入) |
恢复或撤销文件的更改。 |
git show |
显示 Git 对象的详细信息。 |
6.3 提交日志
| 命令 | 说明 |
|---|---|
git log |
查看历史提交记录 |
git blame <file> |
以列表形式查看指定文件的历史修改记录 |
git shortlog |
生成简洁的提交日志摘要 |
git describe |
生成一个可读的字符串,该字符串基于 Git 的标签系统来描述当前的提交 |
6.4 远程操作
| 命令 | 说明 |
|---|---|
git remote |
远程仓库操作 |
git fetch |
从远程获取代码库 |
git pull |
下载远程代码并合并 |
git push |
上传远程代码并合并 |
git submodule |
管理包含其他 Git 仓库的项目 |
7、Git 分支管理
Git分支管理是Git强大功能之一,能够让多个开发人员并行工作,开发新功能、修复bug或进行实验,而不会影响主代码库。
几乎每一个版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。
使用分支意味着你可以从开发主线上分离来,然后在不影响主线的同时继续工作。
Git分支实际上是指向更改快照的指针。
有人把Git的分支模型称为必杀技特性,而正是因为它,将Git从版本控制系统家族里区分出来。
- 创建分支
创建新分支并切换到该分支
git checkout -b <branchname>
# 切换分支命令:
git checkout (branchname)
- 查看分支
# 查看所有分支:
git branch
# 查看远程分支:
git branch -r
# 查看所有本地和远程分支:
git branch -a
- 合并分支
# 将其他分支合并到当前分支:
git merge <branchname>
# 例子:切换到main分支并合并feature-xyz分支:
git checkout main
git merge feature-xyz
- 解决合并冲突
当合并过程中出现冲突时,Git会标记冲突文件,你需要手动解决冲突。
打开冲突文件,按照标记解决冲突。
# 标记冲突解决完成:
git add <conflict-file>
# 提交合并结果:
git commit
- 删除分支
# 删除本地分支:
git branch -d <branchname>
# 强制删除未合并的分支:
git branch -D <branchname>
# 删除远程分支:
git push origin --delete <branchname>
命令手册
| 命令 | 说明 | 用法示例 |
|---|---|---|
git branch |
列出、创建或删除分支。它不切换分支,只是用于管理分支的存在。 | git branch:列出所有分支 git branch new-branch:创建新分支 git branch -d old-branch:删除分支 |
git checkout |
切换到指定的分支或恢复工作目录中的文件。也可以用来检出特定的提交。 | git checkout branch-name:切换分支 git checkout file.txt:恢复文件到工作区 git checkout <commit-hash>:检出特定提交 |
git switch |
专门用于切换分支,相比 git checkout 更加简洁和直观,主要用于分支操作。 |
git switch branch-name:切换到指定分支 git switch -c new-branch:创建并切换到新分支 |
git merge |
合并指定分支的更改到当前分支。 | git merge branch-name:将指定分支的更改合并到当前分支 |
git mergetool |
启动合并工具,以解决合并冲突。 | git mergetool:使用默认合并工具解决冲突 git mergetool --tool=<tool-name>:指定合并工具 |
git log |
显示提交历史记录。 | git log:显示提交历史 git log --oneline:以简洁模式显示提交历史 |
git stash |
保存当前工作目录中的未提交更改,并将其恢复到干净的工作区。 | git stash:保存当前更改 git stash pop:恢复最近保存的更改 git stash list:列出所有保存的更改 |
git tag |
创建、列出或删除标签。标签用于标记特定的提交。 | git tag:列出所有标签 git tag v1.0:创建一个新标签 git tag -d v1.0:删除标签 |
git worktree |
允许在一个仓库中检查多个工作区,适用于同时处理多个分支。 | git worktree add <path> branch-name:在指定路径添加新的工作区并切换到指定分支 git worktree remove <path>:删除工作区 |
8、Git查看提交历史
查看Git提交历史可以帮助了解代码的变更情况和开发进度。
Git 提交历史一般常用两个命令:
git long- 查看历史提交记录。git blame <file>- 以列表形式查看指定文件的历史修改记录。
8.1 git long
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。
git log 命令用于查看 Git 仓库中提交历史记录。
git log 显示了从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。
git log 命令的基本语法:
git log [选项] [分支名/提交哈希]
常用的选项包括:
-p:显示提交的补丁(具体更改内容)。--oneline:以简洁的一行格式显示提交信息。--graph:以图形化方式显示分支和合并历史。--decorate:显示分支和标签指向的提交。--author=<作者>:只显示特定作者的提交。--since=<时间>:只显示指定时间之后的提交。--until=<时间>:只显示指定时间之前的提交。--grep=<模式>:只显示包含指定模式的提交消息。--no-merges:不显示合并提交。--stat:显示简略统计信息,包括修改的文件和行数。--abbrev-commit:使用短提交哈希值。--pretty=<格式>:使用自定义的提交信息显示格式。
常用选项
限制显示的提交数:
git log -n <number>
例如,显示最近的 5 次提交:
git log -n 5
显示自指定日期之后的提交:
git log --since="2024-01-01"
显示指定日期之前的提交:
git log --until="2024-07-01"
只显示某个作者的提交:
git log --author="Author Name"
8.2 git blame
git blame 命令用于逐行显示指定文件的每一行代码是由谁在什么时候引入或修改的。
git blame 可以追踪文件中每一行的变更历史,包括作者、提交哈希、提交日期和提交消息等信息。
如果要查看指定文件的修改记录可以使用 git blame 命令,格式如下:
git blame [选项] <文件路径>
常用的选项包括:
-L <起始行号>,<结束行号>:只显示指定行号范围内的代码注释。-C:对于重命名或拷贝的代码行,也进行代码行溯源。-M:对于移动的代码行,也进行代码行溯源。-C -C或-M -M:对于较多改动的代码行,进行更进一步的溯源。--show-stats:显示包含每个作者的行数统计信息。
显示文件每一行的代码注释和相关信息:
git blame <文件路径>
只显示指定行号范围内的代码注释:
git blame -L <起始行号>,<结束行号> <文件路径>
对于重命名或拷贝的代码行进行溯源:
git blame -C <文件路径>
对于移动的代码行进行溯源:
git blame -M <文件路径>
显示行数统计信息:
git blame --show-stats <文件路径>
9、Git标签
如果你达到一个重要的阶段,并希望永远记住提交的快照,你可以使用 git tag 给它打上标签。
Git 标签(Tag)用于给仓库中的特定提交点加上标记,通常用于发布版本(如 v1.0, v2.0)。
比如说,我们想为我们的 runoob 项目发布一个 "1.0" 版本,我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD) "v1.0" 的标签。
*-a* 选项意为"创建一个带注解的标签",不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解,我们推荐一直创建带注解的标签。
标签语法格式:
git tag <tagname>
例如:
git tag v1.0
-a 选项可以添加注解:
$ git tag -a v1.0
当你执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
9.1 推送标签到远程仓库
默认情况下,git push 不会推送标签,你需要显式地推送标签。
git push origin <tagname>
推送所有标签:
git push origin --tags
9.2 删除轻量标签
本地删除:
git tag -d <tagname>
远程删除:
git push origin --delete <tagname>
9.3 附注标签
附注标签存储了创建者的名字、电子邮件、日期,并且可以包含标签信息。附注标签更为正式,适用于需要额外元数据的场景。
创建附注标签语法:
git tag -a <tagname> -m "message"
例如:
git tag -a <tagname> -m "runoob.com标签"
PGP 签名标签命令:
git tag -s <tagname> -m "runoob.com标签"
查看标签信息:
git show <tagname>
9、Git 进阶操作
在掌握了 Git 的基础操作之后,进阶操作可以帮助你更高效地管理和优化你的代码库。
以下是一些常见的进阶操作及其详细说明:
- 交互式暂存:逐块选择要暂存的更改,精细控制提交内容。
- Git Stash:临时保存工作进度,方便切换任务。
- Git Rebase:将一个分支上的更改移到另一个分支之上,保持提交历史线性。
- Git Cherry-Pick:选择特定提交并应用到当前分支。
9.1 交互式暂存(Interactive Staging)
git add 命令可以选择性地将文件或文件的一部分添加到暂存区,这在处理复杂更改时非常有用。
- 使用
git add -p:逐块选择要暂存的更改。
git add -p
执行此命令后,Git 会逐块显示文件的更改,你可以选择是否暂存每个块。常用选项包括:
y:暂存当前块n:跳过当前块s:拆分当前块e:手动编辑当前块q:退出暂存
9.2 Git Stash:临时保存工作进度
git stash 命令允许你临时保存当前工作目录的更改,以便你可以切换到其他分支或处理其他任务。
保存当前工作进度:
git stash
查看存储的进度:
git stash list
应用最近一次存储的进度:
git stash apply
应用并删除最近一次存储的进度:
git stash pop
删除特定存储:
git stash drop stash@{n}
清空所有存储:
git stash clear
3. Git Rebase:变基
git rebase 命令用于将一个分支上的更改移到另一个分支之上。它可以帮助保持提交历史的线性,减少合并时的冲突。
变基当前分支到指定分支:
git rebase <branchname>
例如,将当前分支变基到 main 分支:
git rebase main
- 交互式变基:
git rebase -i <commit>
交互式变基允许你在变基过程中编辑、删除或合并提交。常用选项包括:
pick:保留提交reword:修改提交信息edit:编辑提交squash:将当前提交与前一个提交合并fixup:将当前提交与前一个提交合并,不保留提交信息drop:删除提交
4. Git Cherry-Pick:拣选提交
git cherry-pick 命令允许你选择特定的提交并将其应用到当前分支。它在需要从一个分支移植特定更改到另一个分支时非常有用。
拣选提交:
git cherry-pick <commit>
例如,将 abc123 提交应用到当前分支:
git cherry-pick abc123
处理拣选冲突:如果拣选过程中出现冲突,解决冲突后使用 git cherry-pick --continue 继续拣选。
示例操作
以下是一个综合示例,展示了如何使用这些进阶操作:
交互式暂存:
git add -p
保存工作进度:
git stash
查看存储的进度:
git stash list
应用存储的进度:
git stash apply
变基当前分支到 main 分支:
git rebase main
交互式变基,编辑提交历史:
git rebase -i HEAD~3
编辑提交历史,如合并和重命名提交。
拣选 feature 分支上的特定提交到 main 分支:
git checkout main
git cherry-pick abc123

浙公网安备 33010602011771号