Git 知识梳理
命令学习:Learn Git Branching
Git 命令大全:Git 大全
版本控制
什么是版本控制?
版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况的系统。关键时刻,可以回退版本。
除了项目源代码,你可以对任何类型的文件进行版本控制。
为什么需要版本控制?
- 版本控制可以让你将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。
- 你还可以通过提交的历史记录来比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。
三大版本控制系统
本地版本控制系统
方便个人管理项目文件。
大多都是采用某种简单的数据库来记录文件的历次更新差异。
集中化的版本控制系统
为解决开发者协同合作问题而生。
都有一个单一的集中管理的服务器,可以保存所有文件的修订版本,协同工作的开发者们都可以通过客户端连到这台服务器,取出最新的文件或者提交更新。
有两个问题:
- 单点故障: 中央服务器宕机,则其他人无法使用;如果中心数据库磁盘损坏又没有进行备份,你将丢失所有数据。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
- **必须联网才能工作:**受网络状况和网络带宽影响。
分布式版本控制系统
为解决上面的问题面世,比如:Git
有以下几个优点:
- 这类系统,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地克隆下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个克隆出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
- 可以不用联网工作,因为每个人的电脑上都是完整的版本库。
- 强大的分支管理功能。
在开发中,常用的 git 开发操作流程是怎样的?
在使用 Git 进行开发时,常用的操作流程包括:
-
创建 Git 仓库:使用
git init
命令初始化一个新的 Git 仓库。也可以使用git clone
命令克隆一个远程仓库到本地。 -
添加文件到暂存区:使用
git add
命令将修改的文件添加到 Git 的暂存区中。 -
提交修改:使用
git commit
命令提交修改。可以使用-m
参数指定提交的注释信息。 -
分支操作:使用
git branch
命令创建、删除、查看分支。使用git checkout
命令切换分支。 -
合并分支:使用
git merge
命令将一个分支合并到当前分支。 -
推送修改:使用
git push
命令将本地修改推送到远程仓库。 -
拉取修改:使用
git pull
命令从远程仓库拉取最新修改。 -
查看修改历史:使用
git log
命令查看提交历史。 -
撤销修改:使用
git reset
命令撤销某次提交。可以使用--soft
参数保留修改到暂存区,使用--mixed
参数保留修改到工作区,使用--hard
参数彻底删除修改。 -
标签操作:使用
git tag
命令创建、删除、查看标签。标签可以用于标记某个版本,便于后续查找和发布。
Git 快速入门
Git 有哪三种状态?
- 已提交(committed):数据已经安全的保存在本地数据库中。
- 已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
- 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
Git 关联 idea 文件颜色的意思?
- 红色(red),未加入版本控制
- 绿色(green),已经加入版本控制暂未提交
- 蓝色(blue),加入版本控制,已提交,有改动
- 白色(white),加入版本控制,已提交,无改动
- 灰色(grey):版本控制已忽略文件
Git 项目的三个工作区域
- 工作目录(working)
- 暂存区域(index)
- Git 仓库(HEAD)
working =add=>
index =commit=>
HEAD =push=>
远程仓库
基本的 Git 工作流程
- 准备仓库:创建或从服务端克隆一个仓库。
- 搬砖:在工作目录中添加、修改代码。
- 暂存(git add):将需要进行版本管理的文件放入暂存区域。
- 提交(git commit):将暂存区域的文件提交到Git仓库。
- 推送(git push):将本地仓库推送到远程仓库,同步版本库。
- 获取更新(fetch/pull):从服务端更新到本地,获取他人推送的更新,与他人协作、共享
-
在工作目录中修改文件。 -- 即写代码
-
暂存文件,将文件的快照放入暂存区域。 -- 即表示已修改,文件变蓝色
-
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录中。
文件的快照:就是指 文件的数据。是 Git 版本控制的核心。
查看 Git 版本号
指令:git -- version
Git的配置文件
Git有三个主要的配置文件:
三个配置文件的优先级是 ① < ② < ③
① 系统全局配置 (--system):包含了适用于系统所有用户和所有仓库(项目)的配置信息,存放在 Git 安装目录下: C:\Program Files\Git\etc\gitconfig
② 用户全局配置 (--global):当前系统用户的全局配置,存放用户目录: C:\Users\[系统用户名]\.gitconfig
。
③ 仓库/项目配置 (--local):仓库(项目)的特定配置,存放在项目目录下: .git/config
yml
#查看git配置
git config --list
git config -l
#查看系统配置
git config --system --list
#查看当前用户(global)全局配置
git config --list --global
#查看当前仓库配置信息
git config --local --list
什么是 Git Flow
Git Flow 是一种基于 Git 版本控制工具的分支管理工作流程,它定义了一套完整的分支模型,包括主分支、开发分支、功能分支、修复分支等,旨在优化团队协作、版本发布和代码质量等方面的工作流程。
常用操作
获取 Git 仓库
有两种方法:
-
在当前项目目录中初始化仓库:
右键点击
Git Bash Here
进入窗口运行git init
命令,该命令将创建一个名为.git
的子目录,代表已经加入版本控制。 -
从一个服务器(远程仓库)克隆一个现有的 Git 仓库:
进入希望项目存放的目录地址,运行
git clone [url] 自定义文件夹名称
命令。注意 ,使用
Git
命令克隆的方式可以和 原项目 随时保持更新同步。 -
克隆本地仓库
git clone /path/to/repository
添加和提交
添加、删除、改名:
yml
# 添加指定文件到暂存区,包括被修改的文件
$ git add [file1] [file2] ...
# 添加当前目录的所有文件到暂存区
$ git add .
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
提交:
git commit -m "代码提交信息"
-- 此时已提交到了本地仓库中
初始化一个 Readme文件
touch README.md
切换分支
git checkout <branch>
推送
-
查看本地 Git 仓库已经关联的远程仓库:
git remote -v
-
关联远程仓库:
git remote add origin <server>
-
推送分支:
git push origin master[分支名称]
origin
是远程仓库的名称,<server>
是远程仓库的 URL。
删除远程仓库关联
命令:git remote remove origin
IDEA 使用更新项目操作
在使用 IntelliJ IDEA 进行 Git 操作时,更新项目时会出现如下两个选项:
Update Project
使用的是普通合并(merge)的方式,它会将远程分支上的最新代码拉取到本地,然后将本地分支上的代码与远程分支上的代码合并。如果有冲突,需要手动解决冲突并提交代码。这种方式会生成一个新的合并提交,保留了本地分支和远程分支的所有提交历史。Update Project with Rebase
使用的是变基(rebase)的方式,它会将本地分支上的所有提交临时保存,然后将远程分支上的最新代码拉取到本地,并用变基的方式将本地分支上的所有提交重新基于远程分支的最新提交。如果有冲突,需要手动解决冲突并提交代码。这种方式会生成一系列新的提交,覆盖了本地分支的所有提交历史。
需要注意的是,使用变基操作会改变提交历史,可能会影响其他人的开发分支。因此,在多人协作开发中,建议使用普通合并(merge)操作,只在特定情况下使用变基操作,例如在开发分支上进行调整和整理提交历史。
在选择更新方式时,可以根据实际情况选择合适的选项。如果当前分支与远程分支的差异较小,可以使用普通合并;如果差异较大,或者需要整理提交历史,可以使用变基操作。无论选择哪种方式,都需要谨慎处理未提交的修改,以免造成代码冲突和数据丢失。
问题
代码提交到本地仓库或者推送到远程仓库的话,还能回滚吗?能回滚的话,回滚命令是什么?
如果你已经将代码提交到本地仓库或远程仓库,你仍然可以回滚代码更改。回滚操作可以还原到之前的提交状态,撤销先前的更改。
下面是一些常用的回滚命令:
-
回滚到上一次提交:
bashgit revert HEAD
-
回滚到指定提交(使用提交哈希值):
bashgit revert <commit-hash>
-
回滚到指定提交并将后续提交合并为一个新的提交:
bashgit revert <commit-hash>..HEAD
这些命令会创建一个新的提交,该提交会撤销指定的更改。请注意,这些命令会创建一个新的提交,而不是直接删除或修改历史提交记录。
如果你要回滚到之前的提交,并且希望删除回滚之后的提交记录,可以使用 git reset
命令。但是,请注意,git reset
命令会修改历史提交记录,因此在使用之前请确保你了解其影响。
如果你已经将代码推送到远程仓库,回滚后可能需要使用 git push
命令将回滚提交推送到远程仓库。
请注意,回滚操作是不可逆的,因此在执行回滚前,请确保你已经备份了重要的更改或提交。对于使用 Git 的版本控制系统,强烈建议在进行敏感操作之前,先熟悉 Git 的基本操作和相关命令,并在安全的环境中进行测试。
代码已经提交并推送到了远程仓库,此时撤销提交会发生什么?
如果你已经将代码提交并推送到远程仓库,但后来想要撤销该提交。以下是一些可能的情况:
- 提交还没有被其他人拉取(fetch/pull):
- 如果你提交的代码还没有被其他人拉取到远程仓库,你可以使用
git reset
或git revert
来撤销提交。这不会影响其他人的工作。 - 使用
git reset
会将HEAD指针移动到以前的提交,将历史记录修改为不包含该提交。但是,这会删除提交的历史记录,可能会导致冲突。 - 使用
git revert
会创建一个新的提交,该提交撤销了以前的提交,保留了历史记录。这是更安全的方法,因为不会破坏历史记录。
- 如果你提交的代码还没有被其他人拉取到远程仓库,你可以使用
- 提交已经被其他人拉取:
- 如果你的提交已经被其他人拉取到远程仓库,撤销提交可能会引发问题,因为其他人可能已经构建了基于你的提交的工作。在这种情况下,最好不要直接撤销提交,而是与团队协商,找出一个解决方案。
- 其他团队成员修改代码后并推送到远程仓库:
- 在这种情况下,如果你强行撤销自己的提交并强制推送到远程仓库,会导致其他人的工作受到影响,可能会引发冲突和一致性问题。
- 如果一定要撤销已推送的提交,最好与团队一起协商解决,以避免引发问题。
已经推送到远程仓库,但还没被人拉取的情况
如果你的提交已经被推送到远程仓库,但尚未被其他人拉取,你可以使用以下步骤来撤销该提交:
注意: 这个过程将修改你的本地历史记录,因此如果你正在与其他人协作,最好与他们协商并确保其他人知道你要执行这个操作。
-
查看提交历史: 使用以下命令查看提交历史,找到你想要撤销的提交的哈希值(SHA-1):
bashgit log
-
撤销提交: 使用以下命令来撤销提交,将
<commit-hash>
替换为你想要撤销的提交的哈希值:bashgit reset --hard <commit-hash>
这将将你的 HEAD 指针和工作目录还原到指定提交的状态,同时删除了该提交之后的所有提交。
-
强制推送到远程仓库: 由于你已经修改了历史记录,你需要使用
--force
(或-f
)选项来强制推送到远程仓库:bashgit push --force origin <branch-name>
其中,
<branch-name>
是你当前工作的分支名称。
请注意,强制推送可能会破坏其他人的工作副本,因此在执行此操作之前,请确保你已与团队协商,以确保不会引发问题。
此外,由于这个操作可能会删除历史记录,只有在你确定没有其他人在使用这个历史记录或有备份的情况下才应该执行。