如果你只是想知道如何用Git上传代码至托管平台,请看:创建码云仓库并完成第一次上传(https) 及 使用ssh协议上传代码
如果你想了解Git本地仓库的工作原理,欢迎阅读本文。
文章目录
- 一、分区及工作流程
- 1. Git分区
- 2. 工作流程
- 二、本地仓库初始化
- 1. git init
- 2. .git/目录简单介绍
- 三、用户信息配置
- 1. 用户名和邮箱配置介绍
- 2.使用git config配置用户信息
- 四、管理暂存区文件
- 1. Git文件状态
- 2. 添加文件到暂存区
- 3. 删除暂存区的文件
- 4. 文件修改管理
- 五、提交文件到本地仓库
- 六、推送到远程仓库
- 1. 创建远程仓库
- 2. 添加远程仓库地址
- 3. 查看远程仓库地址
- 4. 删除远程仓库地址
- 5. 推送到远程仓库
- https上传
- ssh上传
- 七、从远程仓库clone、fetch或pull
- 1. 克隆远程仓库到本地
- 2. 获取远程仓库(fetch)
- 3. 拉取远程仓库(pull)
一、分区及工作流程
1. Git分区
Git的分区包括工作区、暂存区、本地仓库(本地版本库)、远程仓库(远程版本库)。
-
工作区
工作区(Workspace)即本地代码所在的目录,同时也是存放 .git/ (本地仓库)的目录。 -
暂存区
暂存区(Index/Stage)是工作区和本地仓库的缓存空间,里面记录着即将提交给本地仓库(版本库)的文件修改信息,.git/ 目录里的index文件就是暂存区。 -
本地仓库
本地仓库(Repository)也称本地库或版本库,存放了本地的所有版本(commit提交记录),本地仓库的文件都在 .git/ 目录中。 -
远程仓库
远程仓库(Remote)在网络上,GitHub、Gitee和GitLab都能创建远程仓库,和本地仓库一样,远程仓库存放的也是不同的代码版本,只是这些版本可以来自多个本地仓库。
2. 工作流程
------------------------------------------------------下图来源网络---------------------------------------------------------
上图生动地描述了Git不同分区之间的操作命令。
- 假如要实现上传代码功能,工作区使用add添加文件到暂存区,暂存区再通过commit提交版本给本地仓库,最后本地仓库使用push将版本推送到远程仓库;
- 工作区修改的文件可以通过checkout命令从本地仓库或暂存区恢复;如果要将工作区某分支的代码更新为远程仓库最新版本,可以使用pull命令;
- 对远程仓库使用clone可以将远程仓库主分支拷贝到本地仓库,fetch命令与pull类似,只是pull会合并本地代码,而fetch只会把最新版本抓取到本地版本库,不考虑本地仓库是否有新增。
二、本地仓库初始化
1. git init
本地仓库(版本库)需要使用 git init 命令来创建(也可以直接从远程仓库克隆,后面介绍)。
进入工作区(代码存放目录),输入git init,git会在工作区新建一个.git/目录:
2. .git/目录简单介绍
在一个新建的.git/目录中,有3个文本文件:
- config存放了本地仓库的配置信息;
- description用来描述仓库的名字;
- HEAD为本地仓库当前分支,默认为master,指向了refs/heads/master,可见refs/目录主要存放一些分支信息;
后面在对本地仓库进行操作时,还会产生其他文件,比如logs/——保存提交的记录,index——暂存区。
【注意】 千万不要手动更改.git/里的文件,可能会破坏本地仓库的结构,造成不良后果。
三、用户信息配置
1. 用户名和邮箱配置介绍
初始化本地仓库后的第一件事情就是给本地仓库添加用户配置信息,包括用户名和邮箱地址,这里的用户名和邮箱地址和托管平台(如gitee)的账户没有直接关系,它唯一的作用就是让别的用户或托管平台知道代码的上传者信息,邮箱乱填也不会导致不能上传代码。
比如下面我用“张三”和“李四”上传了代码,邮箱地址不是真实存在的,同样可以上传成功:(commit信息出了点意外)
李四的邮箱地址显然不是真实的。
由于“张三”和“李四”的邮箱没有在gitee绑定账户,所以点击它们头像时,不会显示用户信息,如果用户配置里填写了gitee账号的提交邮箱,则可以在gitee上查看上传者账号信息。
gitee用户的提交邮箱,可以在gitee->个人主页->个人设置->邮箱管理中设置和查看:
2.使用git config配置用户信息
讲了那么多用户名和邮箱的注意事项,其实用户信息配置十分简单:
git config --global user.name "your name"
git config --global user.email "your email"
user.name 后接用户名,任意填写。
user.email 后接用户邮箱,任意填写。
–global 为配置全局属性
提交代码到本地仓库时,git会先检索本地仓库的.git/config文件,如果没有user的信息,则使用全局的配置文件(符合就近原则)。
全局配置文件存放位置为 系统用户目录/用户名/.gitconfig,里面只有user属性。
不加–global时,仅设置本地仓库的用户配置,本地仓库用户配置信息存放位置:.git/config
上图我仅设置了本地配置的用户名,此时如果提交修改到本地仓库,提交记录(下图)中用户名使用本地配置,因为本地没有配置用户邮箱,所以邮箱依然使用全局配置中指定的邮箱。
四、管理暂存区文件
配置完用户信息后,我们就可以开始考虑提交代码了,但是有时候,我们并不想把整个工作区的文件都提交到本地仓库(版本库)。暂存区(index/stage)的存在,替我们解决了这个困扰,我们可以先把代码文件添加到暂存区,如果觉得还需要改动,可以将文件从暂存区删除,直到我们觉得文件选择得差不多了,再进行下一步(提交到本地仓库)。
1. Git文件状态
在管理暂存区之前,我们还需要了解工作区文件的几种状态:
- Untracked 未跟踪,工作区中没有加入过暂存区的文件,不参与版本控制;
- Unmodified 未修改,加入版本控制,但和版本库中文件快照相同;
- Modified 已修改,加入版本控制,而且和上次加入版本库时的快照不同;
- Staged 已暂存,下一步可以提交到本地仓库(版本库)。
------------------------------------------------------下图来源网络---------------------------------------------------------
git status命令可以用来查看工作区文件当前的状态:
#查看特定文件的状态
git status [filename]
#查看所有文件状态
git status
#精简的方式显示文件状态
git status -s
2. 添加文件到暂存区
先查看工作区所有文件的状态,发现还没有任何文件:
现在创建3个文件,再次使用git status(-s表示精简显示),3个文件的状态为Untracked,??为精简显示下Untracked的标志,意思是新创的文件没有被本地仓库(版本库)跟踪。
git add [文件…] 可以添加一个或多个文件到暂存区,使文件状态变为Staged,A表示该文件被add到暂存区。
也可以使用 git add . 或 git add -A 将工作区所有文件添加到暂存库(除了.gitignore里声明的文件,本文暂不介绍)。
3. 删除暂存区的文件
既然可以向暂存区添加文件,那么反向操作必然也不能少,git rm --cached [文件…] 命令可以将暂存区的文件移除,使其恢复到Untracked状态。
4. 文件修改管理
如果已经存入暂存区,但在文件提交到本地仓库前,我们对其进行了修改,那么它的状态将变为Modified。
对于Modified状态的文件,我们可以使用git add将修改后的版本加入到暂存区,也可以使用git checkout – [file…] 将工作区的该文件恢复到暂存区的版本。
git add a.c重新添加a.c到暂存区:
下图为使用git checkout – a.c 从暂存区恢复a.c文件,下图中我没有加“- -”,它的作用是让checkout不检测任何其他选项参数,目的是防止该命令把a.c当做一个分支(checkout 还有一个作用是切换分支)。
对Modified状态下的文件使用 git diff 可以得出文件修改的详细记录,git diff和diff命令虽然作用都是对比文件,但git diff的作用是对比不同的状态下的同一文件,而diff用来对比两个不同的文件。
五、提交文件到本地仓库
文件添加到暂存区的目的就是将其提交到本地仓库(版本库),提交命令为git commit -m “message”
我们可以在commit 后面添加文件,这样能指定提交的文件:
通过git log 可以查看提交记录,HEAD为本地仓库当前分支,指向主分支master:
直接使用 git commit -m “message” 可以将整个暂存区都提交到本地仓库:
#以一行的形式显示所有提交版本:
git log --pretty=oneline
#一行显示,只显示哈希值的前7位:
git log --oneline
#显示历史提交版本与当前版本的间隔数:
git reflog
六、推送到远程仓库
代码文件提交到本地仓库后,还需要推送到远程仓库进行托管。
1. 创建远程仓库
我以码云为例,远程仓库的创建可以通过以下三步实现:
2. 添加远程仓库地址
git remote add <name> <url> 命令可以添加远程仓库,name为远程仓库地址的别名,自定义,url为仓库网络地址。
如果要用https的方式上传代码,需要添加远程仓库https地址;用ssh上传代码,则url填远程仓库ssh地址。
先从码云仓库主页将仓库地址复制下来:
我将远程仓库的本地别名命名为origin:
远程仓库可以设置多个,只要本地别名不冲突即可。
3. 查看远程仓库地址
git remote -v 命令可以查看远程仓库地址,也可以通过git config -l查看
4. 删除远程仓库地址
git remote remove <name> 可以删除本地别字为name的远程地址:
5. 推送到远程仓库
首先确认远程仓库的别名,我当前设置的远程仓库https协议地址对应的别名为https,ssh协议地址对应的别名为ssh,这两个地址其实是一个仓库,只是协议不同。
https上传
git push name可以实现本地仓库的上传,name为远程仓库在配置文件中的别名,使用https上传,需要输入账号和密码才能完成上传,Window系统会自动保存账号和密码,如果想修改Window已经保存的用户名和密码,可以参考修改Gitee登录凭据。
有时第一次上传会出现不成功的情况,可以尝试使用git push -u name master,该命令的作用是将 name 仓库的主分支作为上流分支,-u和–set-upstream作用相同。
ssh上传
如果要使用ssh上传,需要先生成SSH密匙,并将公匙保存到gitee个人设置的SSH公匙设置中,具体过程可以参考:生成SSH密匙,实现代码上传
有时第一次上传会出现不成功的情况,可以尝试使用git push -u name master,该命令的作用是将 name 仓库的主分支作为上流分支,-u和–set-upstream作用相同。
七、从远程仓库clone、fetch或pull
1. 克隆远程仓库到本地
git的克隆可以将远程仓库拷贝到本地,同时自动进行本地仓库的初始化。
在任意目录下打开Git bash,输入 git clone <repo> [<dir>],repo为远程仓库网址,dir为克隆仓库的存放路径(可以不用提前创建),如果不填,则默认为远程仓库名(不是本地别名)。
[注意]:clone和push一样需要密码。
克隆成功,进入该仓库目录,和上传时的工作区一模一样,提交日志也相同。
2. 获取远程仓库(fetch)
git fetch的作用是将远程仓库的分支拷贝到本地仓库,并把最新版本保存在FETCH_HEAD分支,获取远程仓库分支后,还需手动将其合并到当前分支。
命令格式: git fetch [<repository>] ,repository为远程仓库的网络地址。
git merge <分支名>用来合并分支
3. 拉取远程仓库(pull)
git pull和git fetch类似,但git pull会自动将远程仓库的分支合并到本地的当前分支。
由于本文旨在介绍Git的基本工作原理,所以一些复杂的情况就不在这里讨论了,特别是最后一章内容。