三个区域
下面三个区域,是Git虚拟的区域,看不到,摸不着。
- 工作区
- 工作区,指的是使用Git管理后的文件,这些文件显示在磁盘上,供我们使用或修改的区域。所以,粗略的说,项目文件夹就是工作区。
- 暂存区域
- 执行
git add .
之后,文件由工作区,添加到了暂存区。 暂存区保存了下次将提交的文件列表信息。
- 执行
- Git 仓库区、本地仓库
- 执行
git commit -m '提交说明'
之后,代码会被提交到仓库区。仓库区是 Git 中最重要的部分,代码只有提交到仓库,才会形成一次历史记录,即才会形成一个版本。
- 执行
工作区新建的文件和Git没有任何关系;文件被添加到暂存区,才叫做被Git管理过
记录每次更新到仓库
添加文件到暂存区
新文件,只有添加到暂存区,才叫做被Git管理。否则和Git没什么关系,即使文件在项目文件夹。
# 添加指定文件到暂存区
$ git add 文件名# 以空格隔开可以一次 add 多个文件
$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录
$ git add [dir] [file] [dir] [file] [file] ...# 添加当前目录的所有文件到暂存区,包括子目录
$ git add .
提交文件到仓库
提交到仓库的文件,是暂存区中的文件。
# 提交暂存区到仓库区
$ git commit -m [message]# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]# 提交工作区和暂存区自上次commit之后的变化,直接到仓库区。
# 新文件,从未被Git管理过,是不能直接提交到仓库区的
$ git commit -a -m "提交日志"
撤销操作
撤销操作,只能恢复暂存区或工作区,与最近一次提交的代码一致。
# 恢复暂存区的指定文件到工作区
$ git checkout [file]# 恢复暂存区的所有文件到工作区
$ git checkout .# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit版本号] [file]# 重置暂存区的指定文件,与上一次 commit 保持一致,但工作区不变
$ git reset [file]# 重置暂存区与工作区,与上一次commit保持一致。该命令后不能加文件或文件夹
$ git reset --hard
前文中,
git checkout 版本号
能够将代码退回到历史的任何版本,但不算是严格意义的回退,因为它叫做版本穿梭。具体见后文的分支管理。
分支管理
什么是分支
随着git提交的次数越来越多,就会形成由各个版本连接而成的一条提交线。如下图:
由Git提交而形成的提交线,称为分支。默认的分支是主分支,叫做 master
,前面的学习,一直是在 master
分支上提交。
我们也可以创建其他分支,新创建的分支,相当于是原分支的一个拷贝。
实际开发中
- 为了保证代码的安全性,不允许在主分支上进行开发
- 需要创建其他分支,在其他分支上进行开发,这样不会影响主分支上的代码
- 其他分支开发完成后,可以选择将其他分支代码合并到主分支上
创建其他分支
# 创建分支
git branch 分支名
# 比如
git branch dev# 切换分支到dev
git checkout dev# 也可以创建并直接切换分支
git checkout -b dev
切换分支之前,需要把当前分支的工作全部提交,否则不允许切换到其他分支。
实际开发中,鼓励多使用分支。
快进模式合并两个分支
快进模式合并
- 两个分支A和B
- B分支包含A分支的最新版本,在合并的时候,叫做快进模式合并。
- 快进模式合并,相当于使用B分支的代码覆盖A分支的代码;同时版本也会更新到A分支
两个分支合并,比如把 B 分支 合并到A分支上
- 需要先切换到A分支
- 然后执行
git merge B
,表示把B分支的代码合并到A分支上。
# 切换到A分支
git checkout A# 把B分支的代码合并到A分支
git merge B
合并模式合并两个分支
合并模式
- 两个分支A和B
- A分支有独立的提交,B分支也有独立的提交,在合并的时候,叫做合并模式的合并。
- 合并模式,有可能会产生冲突;如果出现冲突,需要解决冲突,然后需要
添加
、提交
一次,从而完成合并。
两个分支合并,比如把 B 分支 合并到A分支上
- 需要先切换到A分支
- 然后执行
git merge B
,表示把B分支的代码合并到A分支上。 - 如果看到
CONFLICT
,则表示有冲突,需要打开有冲突的文件,手动解决冲突
,然后添加、提交即可。
# 切换到A分支
git checkout A# 把B分支的代码合并到A分支
git merge B
如果有冲突,会显示如下提示:
手动打开有冲突的文件,解决冲突,保存文件。(手动解决)
再次添加(add操作)提交(commit),即可完成合并。
其他相关命令
# 查看所有分支(本地分支)
git branch# 查看所有分支(包括远程分支)
git branch -a# 删除分支(需要先切换到其他分支,然后在执行删除)
git branch -d 分支名# 创建并直接切换分支
git checkout -b dev
如果要切换分支,必须把当前分支的代码全部提交到本地仓库。
穿梭到历史后,如何使用历史版本中的代码
- 穿梭到历史的一个版本后,
根据该版本
创建一个分支,比如 B 分支 - 在分支B中,修改需要使用的文件,然后提交(提交之后,后面的合并就会有冲突)
- 回到之前的分支的最后一次提交的位置(切换回原来的分支)
- 合并刚刚创建的新分支(B)即可
实际上就是为了练习分支。
远程仓库
说明
目前,我们的操作都是一个人开发,如果涉及到多人开发呢?大家的代码如何合并到一起呢?这个时候就需要公网上的一台服务器了,大家可以把代码提交到这台服务器上,也可以从服务器上拉取所有的代码。这个公网上的服务器就叫做远程仓库。
完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫 GitHub 的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
实际上,除了GitHib,还有很多第三方远程仓库托管服务:
- GitHub(这个网站有时很难打开)
- 码云(gitee)(打开速度快)
- coding
- Gitlab
创建远程账号
略
配置SSH
在本地命令行,执行下面的命令,可以生成SSH秘钥(包含一个公钥一个私钥)
ssh-keygen -t rsa -C "你的邮箱地址"
# 执行完这个命令之后,后面有一些询问,我们直接一路回车即可
最后生成的秘钥在:
Windows:
C:\Users\用户名\.ssh // Users--用户 GaoWei--我的计算机用户名mac:
你的用户名那个文件夹中。 按shift+Commend+. 可以显示隐藏文件,然后就可以看到 .ssh文件夹了
找到 .ssh/id_rsa.pub
,用vscode打开,复制里面全部的内容,配置到远程仓库
- GitHub右上角的三角号
- Settings
- 左侧有 SSH and GPG keys
- 在显示的界面中,点击右上角的 New SSH key,然后完成添加公钥操作
新建远程仓库
将本地仓库中的代码推送到远程仓库
推送的是本地仓库的代码。工作区和暂存区的代码不会被推送到远程仓库
- 复制远程仓库的 ssh 地址
-
本地仓库中,执行
# 添加远程仓库地址,让我们的本地仓库和远程仓库建立关联 # origin 可以自定义 git remote add origin 远程仓库的ssh地址
-
首次推送之前,需要先拉取远程仓库的代码(README.md)到本地
git pull origin master --rebase
-
完成首次推送
# 如果远程没有本地的 分支,第一次推送,需要加 -u git push -u origin master
-
后续继续开发
# 改动了代码,先添加到暂存区 git add . # 提交到本地仓库 git commit -m 'xxxx'# 推送到远程仓库 git push
注意事项
- 什么时候需要先拉取,然后在推送
- 远程仓库的提交比本地仓库的要新,或者不一样,都需要先拉取,然后在推送
- 如果提示 “Are you sure you want to continue connecting (yes/no/[fi…])”
- 输入yes,回车
克隆远程仓库到本地
-
实际开发中,有些时候,我们需要把别人仓库的代码克隆到本地
- 下载别人的代码的时候,可以选择克隆
- 多人合作开发的时候,需要克隆合作伙伴的代码到本地
-
克隆命令
git clone 远程仓库的ssh地址
-
克隆别人的仓库到你的电脑中
- 克隆,相当于下载。可以克隆下来,但是不能向别人的仓库推送
-
克隆的是自己的仓库
- 克隆下来,也可以推送
多人协作
- 可以先创建远程仓库
- 【可选】我先把基础的代码推送到远程仓库
- 合作者,需要把远程仓库的代码,克隆到你的计算机中
- 管理员邀请合作者共同来开发
- 合作者,需要同意
- 然后,管理员和合作者,都可以向远程仓库推送代码
- 推送之前,必须先拉取。拉取之后,如果有冲突,解决冲突。然后推送。
如果遇到:
点击 “i” ,按上下左右键,调整光标的位置,然后删除里面所有的内容,随便写一点也可以,但是不能太多。按esc,退出编辑模式,继续按 “:wq” ,表示保存,并退出的意思。
后续,可以push。