Git 基础详解

1. 基本概念

Git是一个免费、开源的 `分布式版本控制系统`,可以高效处理小到大型的各种项目。

1.1 版本控制

版本控制:它是一种用于追踪和记录文件、目录、项目或软件的变化,以便将来查阅、比较、修订不同版本文件的系统

版本控制系统(VCS)是实现版本控制的一组工具,它们允许用户:

  1. 提交(Commit):将更改保存到版本库中,每次提交都会创建一个新的版本或快照。
  2. 分支(Branch):创建项目的一个副本,以便在不干扰主项目的情况下进行开发。
  3. 合并(Merge):将不同分支上的更改合并到一起,通常是在完成一个功能或修复一个错误后。
  4. 打标签(Tag):为特定的版本或提交点添加标签,以便将来可以轻松引用它们。
  5. 查看历史(History):查看项目的更改历史,了解谁在何时进行了哪些更改。
  6. 回滚(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 clone <git 仓库地址> 从远程服务器上克隆一个已经存在的仓库

    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~1HEAD^:代表当前分支的最新提交的前一个提交(即父提交)。
  • 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 分支允许你在主代码线(通常是 mastermain 分支)之外进行开发,而不影响主代码线的稳定性和完整性。

一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

作用:提高团队协作的效率,减少冲突和错误的影响,让团队中的每个人都能进行独立的开发和测试

注意:分支开发完后:不会影响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 fate

git add file.txt
git commit -m "master提交fate分支对file.txt的修改"

在master分支下,将xuetao分支合并到master分支

发生冲突

通过编辑器打开冲突文件file.txt来手动解决冲突 vim file.txt

提交解决冲突后的文件

git merge fate

vim 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界面来进行相关操作

初始化本地仓库

添加文件到暂存区,以及提交暂存到版本库的功能

关联远程仓库

并且下方会自动显示你的提交记录


若有错误或描述不当的地方,烦请评论或私信指正,万分感谢 😃

相关推荐
Stara05114 小时前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
lsswear4 小时前
GIT 操作
git
勋勋勋勋小勋勋4 小时前
git分支合并某一次提交
git
PandaCave6 小时前
git常用命令以及注意事项总结
git
算你狠 - ZGX10 小时前
Git使用
git
Lojarro16 小时前
【后端】版本控制
git·subversion
MengYiKeNan1 天前
Git配置与使用
git
shall_zhao1 天前
修改仓库中子模块并推送到远程仓库的指定分支
git
鱼钓猫的小鱼干1 天前
Git 安装
git
子洋1 天前
迁移 Gitlab 到 Forgejo
前端·git·后端