Git的概述
什么是Git?
Git是一个开源的分布式版本控制系统,用于跟踪计算机文件的变化,尤其是源码的变化。它能够帮助多个开发者协作开发,记录每一次对代码的修改,并能够回溯到之前的状态,从而有效管理代码版本。
历史背景
Git由Linus Torvalds在2005年创建,旨在取代当时使用的BitKeeper版本控制系统。它提供了高效、高度可扩展且灵活的服务,尤其适合处理大型项目。Git广泛应用于各种软件开发项目,并成为现代开发过程中的标准工具。
Git的主要特点
-
分布式架构:
每个开发者的本地库不仅包含当前的文件版本,还保存了整个项目的历史版本,这样可以在没有网络连接的情况下进行工作。 -
数据完整性:
Git使用SHA-1哈希算法对文件和提交进行唯一标识,确保数据的一致性和完整性。任何对文件的修改都会生成新的哈希值,有效防止数据损坏。 -
高效的性能:
Git的操作速度非常快,尤其是在处理分支和合并时。由于操作是在本地进行,因此常见的任务(如提交、查看历史等)都是高效的。 -
灵活的工作流程:
Git支持多种工作流,如功能分支工作流、Git Flow、集中式工作流等,开发者可以根据项目需求选择适合的工作模式。 -
强大的分支和合并机制:
Git允许轻松创建、删除和合并分支,使得并行开发成为可能。每次开发新特性或修复BUG时,都可以创建新的分支,以确保主分支的稳定性。
Git的基本操作
仓库初始化:
它用于在指定目录中初始化一个新的 Git 仓库。
git init
添加文件到暂存区:
将更改的文件添加到暂存区。
git add <filename> //指定具体文件添加在暂存区
git add . //全部文件添加到暂存区
提交更改:
将暂存区的更改提交到本地仓库,形成一个快照。
git commit -m "提交信息"
推送到远程仓库:
将本地的提交同步到远程仓库。
git push origin <branch-name>
拉取更新:
从远程仓库获取更新,并合并到当前分支。
git pull origin <branch-name>
查看状态:
查看当前工作区和暂存区的状态。 如下图1-1所示。
git status
图1-1
文件从暂存区中移除:
从Git版本库中删除文件,但保留工作目录中的文件。如下图1-2所示。
git rm --cached <filename> //清除指定具体文件的缓存
git rm -cached -r <文件夹名> //清除整个文件夹及其内容的缓存
图1-2
这个命令非常有用,尤其是在以下几种情况下:
- 当你错误地将某个文件添加到了Git的暂存区,但希望将其从版本控制中移除,同时保留在本地工作区中时。 使用
git rm --cached <filename>
命令可以从版本库中删除文件,但保留工作目录中的文件,这样你就可以在本地继续使用该文件,而不会影响版本库中的记录。 - 当你需要清除文件的缓存时。 如果你发现某个文件被错误地添加到了Git的缓存中,可以使用此命令来清除该文件的缓存,而不影响工作目录中的文件。
拉取暂存区文件:
拉取暂存区文件 并将其替换成工作区文件,如下图1-3所示。
git checkout -- <file> //此处的file可以为文件或者文件夹
图1-3
查看文件变更 :
它用于比较当前工作目录中某个文件的未暂存变化与该文件在最新提交(HEAD)中的版本之间的差异。
git diff <file>
git diff --cached <filename> //比较暂存区的文件与最新提交之间的差异,用于查看即将提交的更改
git diff HEAD <filename> //比较当前工作区的文件与最后一次提交的版本之间的差异
git diff <commit1> <commit2> <filename> //比较两个特定提交之间文件的变化
版本比较:git diff
本质上调用 Git 所维护的对象数据库,比较当前工作目录中的文件与 Git 仓库中所记录的版本(最新提交)之间的差异。
区分状态:Git 通过对文件内容的逐行比较来产生差异报告。它使用了行算法来找到两者之间的增加、删除或更改的行。
输出格式:git diff
的输出通常采用统一格式(unified format),标记行的修改情况:
- 行前有
-
符号的表示被删除的行。 - 行前有
+
符号的表示新增加的行。
查看提交历史:
它可以显示当前分支的所有提交记录,包括每个提交的 SHA-1 哈希值、提交作者、日期和提交信息。
git log
git log --oneline //如果只想看到每次提交的简要信息,可以使用
--oneline
选项git log -5 //查看最近的 5 次提交
git log --author="Author Name" //查找某个作者的提交
git log <filename> // 查看某个文件的修改历史
git log --graph --oneline --all // 使用
--graph
选项以图形方式展示分支和合并的提交
提交对象:Git 中的每次提交都是一个提交对象,包含了文件的快照、提交信息、作者信息与时间戳,以及指向父提交的指针(如果不是首次提交,则指向之前的提交)。
Git 数据库:git log
从 Git 的对象数据库中检索提交信息。它通过遍历当前分支的提交链来获取历史。
格式化展示:Git 提供了多种选项,允许用户指定输出格式,方便阅读和查找所需信息。默认情况下,git log
显示每个提交的 SHA-1 哈希、作者、日期和提交信息。
重置当前分支:
可以用于撤销提交、修改暂存区的状态或恢复工作目录中的文件。
git reset --soft HEAD~1 //仅移动 HEAD 指针,不影响暂存区和工作目录。适用于想撤销提交但保留更改的情况
git reset HEAD~1 //将 HEAD 移动到上一个提交,重置暂存区,保留工作目录中的更改
git reset --hard <commit> //将 HEAD 移动到指定的提交,重置暂存区和工作目录
git reset --soft <commit> // 直接使用一个特定的提交哈希
创建与合并分支 :
创建分支是一种常见的工作流程,能够帮助开发者并行开发不同的功能或修复问题,而不会影响主分支(通常是 main
或 master
)。
确保工作区干净:
git status
创建并切换到新分支:
git checkout -b feature/new-feature
在新分支上进行更改,添加文件并提交:
echo "New feature implementation" > feature.txt
git add feature.txt
git commit -m "提交"
切换回主分支:
git checkout main
合并新分支:
git merge feature/new-feature
删除已合并的分支(可选):
git branch -d feature/new-feature
临时保存当前工作进展:
用于临时保存当前工作进展的命令,便于在需要的时候恢复。这让开发者在需要切换分支或执行其他操作时,不必担心未完成的更改会影响当前分支。
# 暂存当前工作进展
git stash# 查看存储的更改
git stash list# 恢复最后存储的更改
git stash pop