git 的学习以及使用
# 基本概念
什么是版本控制系统? 版本控制是用某种方法来保存某一时刻的文件版本的系统。
版本控制工具的分类? 一般分为集中式(代表为SVN)和分布式(git)。 集中式特点为只有一个远程中央仓库来存放所有版本数据,万一远程仓库挂了所有人都不能使用仓库了。 分布式特点为包括远程仓库的所有人都会保存一份所有版本的数据,在每个人的计算机上的仓库叫本地仓库,远程仓库挂了本地仓库也可以工作。(那么问题来了,怎样保证每一个仓库的同步呢?)
git是什么? git是分布式版本控制工具。 git有一个充当中央管理器的地方,客户端并不只提取中央管理器最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
git与SVN的主要区别? git使用直接记录快照方式进行代码存放,而其他的工具多数使用差异比较的方式
记录快照:对每一个版本都进行存储,并记录指向文件的指针,读取版本时寻找对应版本指针即可 差异比较:记录初始文件,之后的修改进行增量记录,读取对应版本时必须从最开始读,一条一条向后修改
# 通用 ssh 拉取代码
https://blog.csdn.net/qq_38232816/article/details/112822309
# git 的区域与状态
工作区:可以在工作区写代码,对应已修改状态 暂存区:临时存放代码的地方,对应已暂存状态 本地库:在git仓库中产生对应的历史版本,对应已提交状态 远程库:代码托管中心,基于网络服务器远程代码仓库
# 分支开发
也是之前那个问题的答案(怎样保证每一个仓库的同步)
git最大的特点是分支开发,将远程仓库中的主代码copy下来,如果要修改代码或者写代码,就切换分支或者创建分支,在该分支中进行业务开发,如果要将代码提交,可以提交到仓库的对应分支中,或者进行分支合并再提交
一般来说,先在自己的分支上开发,然后切换到主分支拉取远程代码,并且合并分支
切换分支时,IDEA当在一个分支上修改了内容没有提交,然后切换到其他分支时,这时IDEA会弹出提示,问你要选择Smart Checkout还是Force Checkout:
如果想保留你在原分支上的修改内容,那么选择Smart Checkout;而 Force Checkout不会保留你的修改,切到另一个分支内容就消失了,且切回来原来分支也找不回
而 merge into curren 的作用是将所选分支合并到当前分支
# 代码回滚
git reset 命令用于回滚代码到某次提交之前,该命令是用来回退版本的,git reset 三种模式分别为 : mixed(默认)、soft、hard
--hard : 回退版本库,暂存区,工作区到指定 commit。因此我们修改过的任何代码就没了
--mixed: 回退版本库,暂存区。--mixed为git reset的默认参数,即当任何参数都不加的时候的参数。此时工作区的代码不受影响,但是你可能观察到有些类变红了或者变蓝了,这就是工作区的代码与版本库代码不一致导致的
--soft: 只回退版本库
git 还提供了一个代码回滚命令:git revert。该命令用于反做。使用 reset 命令,Git 会把要回退版本之后提交的修改都删除掉。要从第四次修改回退到第一次修改,那么会删除第二、三、四次的修改
那如果发现第三次修改有错误,想要恢复第三次修改,却要保留第四次修改呢?这个时候就可以用 revert 命令:
git revert -n 97ea0f9
git commit -m "恢复第三次修改"
-- 回滚到8个版本之前
git revert HEAD~8..HEAD
-- m 1表示保留当前分支的更改,m2 表示保留另外一个分支的修改
git revert -n 97ea0f9 -m 1
2
3
4
5
6
7
8
git 的提交历史为
33b8b30 (HEAD -> master) Revert "恢复第三次修改"
42eae13 第四次修改
97ea0f9 第三次修改
e50b7c2 第二次修改
3a52650 第一次修改
2
3
4
5
注意,git revert 可以回滚多次提交的代码。每次使用 git revert 命令可以撤销指定的提交,如果需要撤销多次提交,则需要多次执行 git revert 命令。每次执行 git revert 命令都会生成一个新的提交,用于撤销之前的提交
在实际生产环境中,代码是基于 master 分支发布到线上的,会有多人进行提交。可能会碰到自己或团队其他成员开发的某个功能在上线之后有 Bug 需要及时做代码回滚的操作
在确认要回滚的版本之后,如果别人没有最新提交,那么就可以直接用 reset 命令进行版本回退,否则,就可以考虑使用 revert 命令进行还原修改,不能影响到别人的提交
使用 reset 还是 revert,需要考虑实际的适用场景,没有绝对化
# 常用的命令
head表示指针,使用HEAD可以代表当前分支
HEAD
代表上一个版本
HEAD~
一般开发流程
将远程仓库clone到本地,创建新分支(master不一定有权限),add、commit、push,在发布时会将dev分支合并到master分支并且发布master分支。如果提交不了可能是远程仓库有更新或者dev分支与mas分支有冲突,拉取之后用marge合并即可
2
3
4
5
6
如何开始
在当前文件夹下初始化本地库
git init
克隆一个已存在的远程仓库,git clone -b dev 加远程链接会拉取一个指定分支并关联
git clone
管理远程仓库相关操作,关联仓库使用add,获取更多帮助使用--help
git remote
拉取远程分支并创建本地同名分支
git checkout -b 本地分支名x origin/远程分支名x
2
3
4
5
6
7
8
查看本地库以及代码状态
git status
查看历史版本,只记录已经提交的版本
git log
查看历史版本,记录该分支下所有操作
git reflog
添加文件到暂存区
git add
比较文件的不同,默认比较工作区与暂存区的不同,后加cached或者staged可比较暂存区与本地仓库的不同,也可以比较不同分支的差异
git diff
提交本地库,一般使用-am,因为该命令提交已追踪的文件,比较方便
git commit -m "日志信息" 文件名
远程仓库推送,一般来说,要先进行创建分支或者分支合并操作,如果远程分支与本地分支名字相同,可省略冒号以及后面内容
git push <远程主机名> <本地分支名>:<远程分支名>
从远程仓库拉取代码相关
从远程仓库拉取代码,用该命令拉取分支会放到origin:dev中,就算已经处于dev分支也需要进行代码合并
git fetch
分支合并操作,可以后跟两个分支将两个分支合并,也可以后加一个分支将目前分支与该分支合并;merge也可以用来处理冲突
git merge
拉取代码并且合并操作,相当与执行了上面两个代码
git pull
该命令用来管理分支,默认执行查看所有分支,后加一个分支名用来新建分支,后加-d可用来删除分支
git branch
该命令用来切换分支,默认执行后跟分支名可切换分支,后加-b加分支名新建分支并且切换分支
git checkout
创建一个新分支并且切换过去,后面的origin是一个远程仓库名,/dev指的是仓库下的某个分支名,接着将新建的这个分支与远程的dev分支联系起来
git checkout -b dev origin/dev
重置代码到之前的版本,其中默认为--mixed,还有--hard以及--soft
git reset
撤销已经存在的提交
git revert
将一个分支与另一个分支线性合并
git rebase
删除暂存区文件
git rm --catched 文件名
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
如果出现了一些奇怪的提示,使用这个 git pull test master --allow-unrelated-histories