Git教程
简单聊聊Git,从Git是什么?能干什么?(介绍)到安装配置(安装)再到上传仓库(上传)最后是分支的创建、使用、删除(分支)
常用网站:
介绍
Git是目前世界上最先进的分布式版本控制系统,有这么几个特点:
- 分布式 :是用来保存工程源代码历史状态的命令行工具
- 保存点 :保存点可以追溯源码中的文件,并能得到某个时间点上的整个工程项目额状态;可以在该保存点将多人提交的源码合并,也可以退到某一个保存点上;
- 离线操作性 :Git可以离线进行代码提交
- 基于快照 :Git提交是将提交点指向提交时的项目快照,提交的东西包含一些元数据(作者,日期,GPG等);SVN等老式版本控制工具是将提交点保存成补丁文件
- Git的分支和合并 :分支模型是Git最显著的特点,因为这改变了开发者的开发模式,SVN等版本控制工具将每个分支都要放在不同的目录中,Git可以在同一个目录中切换不同的分支;
- 分支即时性:创建和切换分支几乎是同时进行的,用户可以上传一部分分支, 另外一部分分支可以隐藏在本地,不必将所有的分支都上传到GitHub中去;
- 分支灵活性:用户可以随时创建合并删除分支,多人实现不同的功能,可以创建多个分支进行开发,之后进行分支合并,这种方式使开发变得快速,简单,安全。
工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
下图展示了 Git 的工作流程:
基本概念
我们先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
-
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
-
图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
-
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
-
当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
-
当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
-
当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
-
当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
基本操作
Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
常见命令
创建仓库
git init | 初始化仓库 |
---|---|
git clone | 拷贝一份远程仓库,也就是下载一个项目。 |
提交与修改
git add | 添加文件到仓库 |
---|---|
git status | 查看仓库当前的状态,显示有变更的文件。 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit | 提交暂存区到本地仓库。 |
git reset | 回退版本。 |
git rm | 删除工作区文件。 |
git mv | 移动或重命名工作区文件。 |
提交日志
git log | 查看历史提交记录 |
---|---|
git blame | 以列表形式查看指定文件的历史修改记录 |
远程操作
git remote | 远程仓库操作 |
---|---|
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
安装
安装分为安装软件和码云注册新建仓库(也可以是GitHub,但经常性的进不去)
码云注册及新建仓库
邮箱注册即可,这没啥说的;然后就是新建仓库右上角加号>新建仓库
名称自定义,路由一样,你可以选择是私有还是公开,这几个是必须的,其他的选填;
点击最后的确定,会出现这个地址
安装Git软件
去这里下载https://npm.taobao.org/mirrors/git-for-windows/,官网能下到你怀疑人生,选择你需要的版本下载安装即可;
安装完后你可以直接打开利用指令进入你的项目;或者在你的项目目录里,右键选择Git Bash Here打开
打开将你的用户名,邮箱配置了,这是个全局配置,会把所有这个电脑上的仓库都写上,当然你可以针对某个仓库设不同的
git config --global user.name "名字"
git config --global user.email "邮箱"
设置SSH KEY
配置本地SSH KEY才可以使远程跟本地连接
你可以按如下命令来生成 sshkey:
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
#Generating public/private rsa key pair...
按照提示完成三次回车,即可生成 ssh key。通过查看 ~/.ssh/id_rsa.pub
文件内容,获取到你的 public key
cat ~/.ssh/id_rsa.pub
#ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
将这些内容复制,打开码云设置>安全设置>SSH公钥,将刚刚的复制进去就行;
完后输入指令ssh -T git@gitee.com
,如果出现下图的这样就代表设置成功了
上传
第一次上传
安装流程走
git init
初始化一个新本地仓库,它在工作目录下生成一个名为.git的隐藏文件夹
git add .
不要忘记空格和点,点代表将文件夹下的所有文件全部添加进本地仓库,你也可以指定某个文件比如:git add index.html
git commit -m "1.0版本"
关联远程仓库
git remote add origin 刚刚的地址
把文件提交到仓库
git push -u origin master
把本地库的所有内容推送到远程库上
第一次进行可能会弹出一个账号密码框,将远程仓库的邮箱、密码输进去,如果错了,去这个地方更改
先看一下有没有绑定邮箱,在gitee上:设置->邮箱管理里面,没有的绑定一个
后续更新上传
后面只有这三步
git add .
不要忘记空格和点,点代表将文件夹下的所有文件全部添加进本地仓库,你也可以指定某个文件比如:git add index.html
git commit -m "1.0版本"
把文件提交到仓库
git push -u origin master
把本地库的所有内容推送到远程库上
第
分支
http://www.uml.org.cn/pzgl/201805154.asp
上传一个独立的分支
(比如代码是从工程中直接DOWNLOAD ZIP文件,该文件与原MASTER分支是独立的)
1、git init
(在本地工程目录下)
2、git add .
3、git commit -m "luyang"
(”luyang“为分支名)
4、git branch luyang
(创建分支)
5、git checkout luyang
(切换分支)
6、git remote add origin http://192.168.36.10:10080/quantum_rng_testing/nist
(”quantum_rng_testing/nist“ 为工程的目录,这次不要后面的.git后缀)
7、git push origin luyang
(将分支上传)
注意:如果提示 "please tell me who you are“
在.git 目录下的config文件,在最后添加
[user]
name = xxxx
email = xxxxxxx@xx.com
这就创建了一个分支并上传了
合并
git merge luyang
会这样:
然后去码云看看合并成功没,如果没,则进行这个指令
git push --force origin master
会出现:
然后再去码云看看合并成功没
删除分支
合并过后分支就可以删除了,可以在码云的分支管理里删除;
或者git branch -d 分支名称
既关联 GitHub,又关联 Gitee
因为 git 本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。
使用多个远程库时,我们要注意,git 给远程库起的默认名称是 origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
仍然以 runoob-test 本地库为例,我们先删除已关联的名为 origin 的远程库:
git remote rm origin
然后,先关联 GitHub 的远程库:
git remote add github git@github.com:tianqixin/runoob-git-test.git
注意,远程库的名称叫 github,不叫 origin 了。
接着,再关联 Gitee 的远程库:
git remote add gitee git@gitee.com:imnoob/runoob-test.git
同样注意,远程库的名称叫 gitee,不叫 origin。
现在,我们用 git remote -v 查看远程库信息,可以看到两个远程库:
git remote -v
gitee git@gitee.com:imnoob/runoob-test.git (fetch)
gitee git@gitee.com:imnoob/runoob-test.git (push)
github git@github.com:tianqixin/runoob.git (fetch)
github git@github.com:tianqixin/runoob.git (push)
如果要推送到 GitHub,使用命令:
git push github master
如果要推送到 Gitee,使用命令:
git push gitee master
这样一来,我们的本地库就可以同时与多个远程库互相同步:
所写博客皆为自己的心得,如有错误欢迎指出,侵删,谢谢