1. 基本概念
Git是一个免费、开源的 `分布式版本控制系统`,可以高效处理小到大型的各种项目。
1.1 版本控制
版本控制:它是一种用于追踪和记录文件、目录、项目或软件的变化,以便将来查阅、比较、修订不同版本文件的系统
版本控制系统(VCS)是实现版本控制的一组工具,它们允许用户:
- 提交(Commit):将更改保存到版本库中,每次提交都会创建一个新的版本或快照。
- 分支(Branch):创建项目的一个副本,以便在不干扰主项目的情况下进行开发。
- 合并(Merge):将不同分支上的更改合并到一起,通常是在完成一个功能或修复一个错误后。
- 打标签(Tag):为特定的版本或提交点添加标签,以便将来可以轻松引用它们。
- 查看历史(History):查看项目的更改历史,了解谁在何时进行了哪些更改。
- 回滚(Rollback):将项目恢复到之前的状态,如果当前状态存在问题或不符合预期。
版本控制有两种主要类型:集中式版本控制和分布式版本控制。
-
集中式版本控制:所有的更改都集中存储在一个服务器上,团队成员通过客户端连接到服务器来提交和获取更改。如 CVS和SVN
-
分布式版本控制:每个团队成员都有一个完整的代码仓库副本,包括所有的文件修订版本和历史记录。如 Git。
两者相较之下,分布式版本控制提供了更高的灵活性和安全性,因为即使中央服务器出现问题,团队成员仍然可以从自己的本地仓库中恢复数据。
总之,对于小型团队和简单项目集中式版本控制更合适,而对于大型项目或需要高度灵活性和协作的团队,分布式版本控制工具则更具优势。
1.2 Git 仓库
Git仓库是Git版本控制系统的核心,它用于存储和管理项目的代码、文件以及版本历史记录。Git仓库可分为本地仓库和远程仓库。
1. 本地仓库
Git的本地数据管理分为三个区域:工作区,暂存区,版本库(或称本地仓库)
工作区(生产):当前开发的目录,是存放项目文件的地方。(也就是你敲代码的区域)
暂存区(缓存修改,等待一次性提交):stage/ index。也称为索引区或暂存区,用于临时存放被修改但尚未提交到本地仓库的文件。
版本库(提交更新版本):保存项目的所有版本,包括提交的历史记录和分支信息。
2. 远程仓库
Git远程仓库是存储在服务器上的Git仓库副本,通常托管在代码托管平台(GitHub、Gitee等)上。它允许开发者将本地代码与远程仓库同步,从而实现协作和备份。
3. Git基本工作机制
2. 基本使用
2.1 安装Git
官方网址:Git
git 命令大全,参考:Git - Reference (git-scm.com)
文件编辑器命令,参考: 下方 “5. Git bash指令和vim编辑”
2.2 创建仓库
创建仓库一般有两种方式:
git init 使用当前目录作为 Git 仓库,
git init <目录> 使用我们指定目录作为Git仓库。git clone <git仓库地址> 克隆远程仓库到当前目录
git clone <git仓库地址> <本地目录> 克隆远程仓库到指定目录
2.3 配置仓库
git config --list 显示当前git信息(wq退出)编辑配置文件
git config -e 针对当前仓库
git config --global 针对系统上所有仓库设置代码提交的用户信息
git config --global user.name “your name”
Git config --global user.email 邮箱
2.4 暂存文件
git add 添加文件到暂存区
git status 查看仓库当前状态,显示所有变更文件
git rm --cached <file> 把文件从暂存区域移除,而工作区仍保留,即仅是从跟踪清单中删除
注意:如果没有设置-m选项,默认打开vim。(编辑器填写提交信息)
示例:
添加file.txt到暂存区
移除对file.txt的跟踪
2.5 提交版本
git commit 提交暂存区到本地仓库
git commit -m [message] 提交暂存区到本地仓库,message 可以是一些备注信息
git commit [file1] [file2] ... -m [message] 提交指定文件git log 查看历史提交记录
git log --oneline 以简洁的一行格式显示提交信息。
提交暂存区的file.txt
working directory clean说明我们在最近一次提交之后,没有做任何改动
查看提交信息
2.6 版本回退
git reset [--soft | --mixed | --hard] [HEAD]
mixed 默认参数,丢弃暂存区,保留工作区的修改内容HEAD: 指向当前版本
HEAD~1 或 HEAD^:指向上一个版本
HEAD~2: 指向上上一个版本
回退到上个版本并且不丢弃工作区和暂存区的内容
git reset --soft HEAD~3 # 回退到上上上一个版本
git reset –hard bae128 # 回退到某个版本回退点之前的所有信息。
git reset --hard origin/master # 将本地的状态回退到和远程的一样
注意:谨慎使用 –-hard 参数,它会删除回退点之前的所有信息。
2.7 比较文件
git diff 默认比较:工作区与暂存区差异
git diff --cached 或 git diff --staged 显示暂存区和上一次提交(commit)的差异
git diff [版本ID]...[版本ID] 显示某两次提交之间的差异
修改file2.txt后,比较暂存区和工作区的区别
比较上个版本和这个版本的差异:git diff HEAD~2 HEAD
HEAD
:代表当前分支的最新提交。HEAD~1
或HEAD^
:代表当前分支的最新提交的前一个提交(即父提交)。HEAD~2
:代表当前分支的最新提交的前两个提交(即祖父提交)。
2.7 删除文件
git rm <file> 将文件从暂存区和工作区中删除
git rm --cached <file> 将文件从暂存区中删除,而保留工作区
git rm –r * 进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。
强行从暂存区和工作区中删除修改后的 file2.txt 文件:
2.8 撤销文件更改
git restore <file> 将指定文件恢复到最新的提交状态,丢弃所有未提交的更改git restore --staged <file> 如果你已经使用 git add 将文件添加到暂存区,但希望撤销这些更改git restore . 还原所有未提交的更改,包括工作目录和暂存区的更改(使用这个命令要谨慎,因为它会清除所有未提交的修改)
3. 分支操作
Git 分支允许你在主代码线(通常是 master
或 main
分支)之外进行开发,而不影响主代码线的稳定性和完整性。
一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
作用:提高团队协作的效率,减少冲突和错误的影响,让团队中的每个人都能进行独立的开发和测试
注意:分支开发完后:不会影响master分支
3.1 基本指令
git branch (branchname) 创建分支
git switch -c <new-branch-name> 创建并切换到新的分支git switch <branch-name> 切换分支
git branch 列出分支
git branch -d (branchname) 删除分支
创建分支xuetao ,并切换过去
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
3.2 合并冲突
git merge <branchname> 将其他分支合并到当前分支
当多个分支修改了同一部分代码,在进行分支合并时,就会产生冲突。这个时候就需要认为来检查解决冲突。
当合并过程中出现冲突时,Git 会标记冲突文件,你需打开冲突文件,按照标记解决冲突,手动解决冲突。
在分支的工作区修改文件file.txt,(vim:在编辑模式下编辑文件)
fate分支修改文件并提交
xuetao分支修改并提交
查看master分支下,主分子看不到其他分支的提交,说明其他分支的开发不影响主分支
在master分支下,将fate分支合并到master分支
git merge fategit add file.txt
git commit -m "master提交fate分支对file.txt的修改"
在master分支下,将xuetao分支合并到master分支
发生冲突
通过编辑器打开冲突文件file.txt来手动解决冲突 vim file.txt
提交解决冲突后的文件
git merge fatevim file.txt 手动解决冲突
git add file.txt
git commit -m "master合并了xuetao分支,解决了冲突,并提交"
注意:合并分支后,要对合并后的文件进行提交。解决冲突后要提交所有暂存区内容,而不能只提提交部分文件(会报错)
3.3 终止合并
如果需要,也可以终止合并:git merge --abort
4. 远程仓库
远程仓库平台:
Gitee - 基于 Git 的代码托管和研发协作平台
GitHub: Let’s build from here · GitHub ,需要挂梯子
4.1 基本使用
本地仓库关联远程仓库
git remote add origin <远程URL> 关联
git push 推送
git pull 拉取
从创建本地仓库到关联远程仓库
git 全局配置
设置代码提交的用户信息
git config --global user.name “your name”
Git config --global user.email 邮箱
创建仓库
mkdir remote_repo
cd remote_repo
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin <远程URL>
git push -u origin "master"
已有仓库
cd existing_git_repo
git remote add origin <远程URL>
git push -u origin "master"
本地推送文件成功:
服务器上的远程仓库查看:
4.2 关于公私钥配置
在Git中,公私钥配置通常用于通过SSH(Secure Shell)协议安全地与远程仓库进行通信,而无需在每次操作时输入用户名和密码。
检查本地主机是否已经存在ssh key
cd ~/.ssh
ls
//看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key
生成密钥对:
- 打开终端或Git Bash,输入命令,
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa 表示使用RSA算法
-b 4096 表示密钥长度为4096位
-C 后跟的是你的邮箱地址,用于标识这个密钥
回车后,系统会提示你输入保存密钥的文件名和位置。通常,它会默认保存在 ~/.ssh/ 目录下,并命名为 id_rsa(私钥)和 id_rsa.pub(公钥)。
配置公钥
- 添加公钥到远程服务器或代码托管平台(公钥通常保存在 ~/.ssh/id_rsa.pub 文件中)
cd ~/.ssh
cat id_rsa.pub //获取ssh key公钥内容(id_rsa.pub)
如下图
把公钥添加到gitHub等代码托管平台
使用私钥进行认证
- 配置SSH客户端:确保你的SSH客户端(通常是Git自带的)知道要使用哪个私钥。
如果你只生成了一个密钥对,并且它保存在默认位置(~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub),则无需进行额外配置。
如果你生成了多个密钥对,或者将密钥保存在了非默认位置,你可能需要编辑 ~/.ssh/config 文件来指定每个密钥对应的远程主机或服务。
测试连接
- 使用命令 ssh -T username@hostname来测试连接
将 username 和 hostname 替换为你的远程服务器或代码托管平台的用户名和主机名。
如果一切正常,你应该能够成功连接到远程服务器而无需输入密码。
注意之后在clone仓库的时候要使用ssh的url,而不是https!
4.3 远程仓库指令
git remote add <别名> <url> 关联远程仓库
git clone <url> 克隆远程仓库git remote -v 查看关联的所有远程仓库
git remote rm <别名> 删除远程仓库
分支相关
git clone -b <分支名><url> 克隆远程仓库的指定分支git branch -r 查看远程分支
git push origin --delete <branchname> 删除远程分支git push 远程仓库别名/分支名 推送到指定分支git merge origin/master 将远程分支合并到本地分支
拉取远程分支 git fetch <远程仓库别名>
用于从远程仓库获取最新的历史记录和数据,但不会自动合并或修改你当前的工作。这个命令主要用于同步远程仓库的变化到你的本地仓库中,以便你可以查看有哪些更新,或者决定如何将这些更新合并到你的工作中。
拉取远程最新代码:git pull
默认情况下,git pull 会从当前分支的远程跟踪分支(通常是 origin/当前分支名)拉取代码,并尝试将这些更改合并到你的本地分支中。
如果你想要从特定的远程分支拉取代码,你可以指定远程仓库名和分支名,如下所示
git pull origin branch-name
origin 远程仓库的默认名称
branch-name 是你想要从中拉取代码的远程分支的名称
注意事项
冲突解决:如果拉取下来的代码与你的本地更改存在冲突,Git将暂停合并操作,并要求你解决这些冲突。
更新本地分支:有时,你可能想要将远程分支的最新更改拉取到你的本地分支,但不立即合并。在这种情况下,你可以使用 git fetch 命令来更新你的远程跟踪分支,然后手动合并或使用其他Git命令来处理这些更改。
检查远程分支:如果你不确定远程仓库上有哪些分支,可以使用 git branch -r 命令来查看远程跟踪分支。
配置上游跟踪:如果你刚开始在一个新的分支上工作,并希望该分支跟踪远程仓库中的相应分支,你可以使用 git branch --set-upstream-to=origin/branch-name 命令来设置上游跟踪。之后,你就可以直接使用 git pull 而不必指定远程分支名了。
拉取和合并分开进行:虽然 git pull 是 git fetch 和 git merge 的组合,但你也可以分开执行这两个命令以获得更多控制。首先运行 git fetch 来获取远程更改但不合并它们,然后你可以使用 git merge 或其他Git命令(如 git rebase)来合并这些更改。
注意:不存创建远程仓库分支的命令,因为远程仓库中的分支只是一个对本地分支引用历史的跟踪。所以要在远程仓库中创建一个新的分支,你应该在本地创建一个分支,然后将其推送到远程仓库。
5. Git bash指令和vim编辑
5.1 Git bash常用指令
mkdir + <文件名> 创建目录
touch 创建文件
cat 查看文件内容(一次性将内容全部显示)
less 查看文件内容(显示部分信息)--再次输入‘回车’一行一行显示,‘空格’一页一页显示 ,‘b’一次向上走一页
cp( copy )复制文件如复A文件夹下的所有子文件、目录到 B 文件夹 cp -r A/* B
echo ‘内容’ > 文件名 (输出内容到文件中,每次输入都是覆盖原来的文件)
echo ‘内容’ >>文件名(输出内容到文件中,每次输入都是追加新内容)
q 退出
pwd创建版本库显示当前目录
ls ( list ) 查看当前目录下的内容
ll 列出的内容更为详细ll 列出的内容更为详细
ls -al 包括隐藏文件和以 . 开头的文件
clear 清屏
5.2 vim打开、修改、保存文件
一、vim 有两种工作模式:
1.命令模式:接受、执行 vim操作命令的模式,打开文件后的默认模式;
2.编辑模式:对打开的文件内容进行 增、删、改 操作的模式;
3.在编辑模式下按下ESC键,回退到命令模式;在命令模式下按i,进入编辑模式
二、创建、打开文件:
1.输入 touch 文件名 ,可创建文件。
2.使用 vim 加文件路径(或文件名)的模式打开文件,如果文件存在则打开现有文件,如果文件不存在则新建文件。
3.键盘输入字母i进入插入编辑模式。
三、保存文件:
1.在编辑模式下编辑文件
2.按下ESC键,退出编辑模式,切换到命令模式。
3.在命令模式下键入"ZZ"或者":wq"保存修改并且退出 vim。
4.如果只想保存文件,则键入":w",回车后底行会提示写入操作结果,并保持停留在命令模式。
四、放弃所有文件修改:
1.放弃所有文件修改:按下ESC键进入命令模式,键入":q!"回车后放弃修改并退出vim。
2.放弃所有文件修改,但不退出 vi,即回退到文件打开后最后一次保存操作的状态,继续进行文件操作:按下ESC键进入命令模式,键入":e!",回车后回到命令模式。
6. VS code 关联远程仓库
虽然通过 bash终端,我们可以使用指令来关联远程仓库,并完成相关操作。但VS code提供了更形象,简单的UI界面来进行相关操作
初始化本地仓库
添加文件到暂存区,以及提交暂存到版本库的功能
关联远程仓库
并且下方会自动显示你的提交记录
若有错误或描述不当的地方,烦请评论或私信指正,万分感谢 😃