前言:
分布式相比于集中式的最大区别在于开发者可以将代码提交到本地, 每个开发者通过克隆, 在本地机器上拷贝一个完整的 Git 仓库.
下图是经典的 Git 开发过程:
Git 的功能特性如下:
从服务器上克隆完整的 Git 仓库 (包括代码和版本信息) 到单机上;
在自己的机器上根据不同的开发目的, 创建分支, 修改代码;
在单机上自己创建的分支上提交代码;
在单机上合并分支;
把服务器上最新版的代码 fetch 下来, 然后跟自己的主分支合并;
生成补丁, 把补丁发送给主开发者;
关于 Git 就介绍至此了, 接下来将演示 Git 的基本操作.
博文大纲:
一, 安装 Git
二, Git 库的创建及介绍
三, Git 库的基本操作
四, 撤销修改的操作
五, 将本地 Git 库关联到 GitHub
六, 从 GitHub 下载到本地 Git 版本库
Git 可以安装在 Windows,Mac,Linux 等操作系统之上, 这里将写下如何安装在 Linux 系统之上, 及其基本操作.
一, 安装 Git
非常简单, 就一条命令, 如下:
[[email protected] ~]# yum -y install Git
二, Git 库的创建及介绍
- # 最好使用一个空的目录作为 Git 库
- [[email protected] ~]# mkdir Git
- [[email protected] ~]# cd Git
- [[email protected] Git]# Git init #在空目录下初始化为 Git 库
初始化空的 Git 版本库于 /root/Git/.Git/
[[email protected] Git]# ls -a #初始化成功后, 会生成一个. Git 的隐藏目录
. .. .Git
- # 生成的隐藏目录是用来跟踪管理版本库的, 不建议随便修改其目录中的文件,
- # 如果改乱了, 就把 Git 库给破坏了.
在 Git 版本库中, 有三个重要的概念: 工作区, 暂存区, 版本库.
工作区: 就是你的系统中可以看到的目录;
暂存区: 一般存放在. Git 目录下的 index 文件中, 所以也会将暂存区叫做索引;
版本库: 工作区中的有一个. Git 隐藏目录, 这个不算工作区, 而是 Git 的版本库.
下面这个图展示了工作区, 版本库中的暂存区和版本库之间的关系:
上图中, 左侧为工作区, 右侧为版本库, 在版本库中标记为 "index" 的区域就是暂存区, 标记为 "master" 的是 master 分支代表的目录树.
当对工作区修改 (或新增) 的文件执行 "git add" 命令时, 暂存区的目录树被更新, 同时工作区修改 (或新增) 的文件内容被写入到对象库中的一个新的对象中, 而该对象的 ID 被记录在暂存区的文件索引中.
当执行提交操作 (Git commit) 时, 暂存区的目录树写到版本库 (对象库) 中, master 分支会做相应的更新. 即 master 指向的目录树就是提交时暂存区的目录树.
当执行 "git reset HEAD" 命令时, 暂存区的目录树会被重写, 被 master 分支指向的目录树所替换, 但是工作区不受影响.
当执行 "git rm --cached <file>" 命令时, 会直接从暂存区删除文件, 工作区则不做出改变.
当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时, 会用暂存区全部或指定的文件替换工作区的文件. 这个操作很危险, 会清除工作区中未添加到暂存区的改动.
当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时, 会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件. 这个命令也是极具危险性的, 因为不但会清除工作区中未提交的改动, 也会清除暂存区中未提交的改动.
三, Git 库的基本操作
- # 需要先自报家门, 声明姓名及邮箱
- [[email protected] Git]# Git config --global user.name "ljz"
- [[email protected] Git]# Git config --global user.email "[email protected]"
- [[email protected] Git]# echo "aaaa"> Git.txt #创建一个文件用于测试
- [[email protected] Git]# Git add Git.txt #将测试文件添加到暂存区
- [[email protected] Git]# Git commit -m "第一次提交"
- # 将暂存区的文件提交到版本库, 并且一定要使用 "-m" 选项注明提交说明
[master(根提交) eecbb4d] 第一次提交
- 1 file changed, 1 insertion(+)
- create mode 100644 Git.txt
- [[email protected] Git]# echo "bbbb">> Git.txt #修改测试文件内容
- [[email protected] Git]# Git add Git.txt #添加到暂存区
- [[email protected] Git]# Git status #查看 Git 的状态
- # 位于分支 master
- # 要提交的变更:
- # (使用 "git reset HEAD <file>..." 撤出暂存区)
- #
- # 修改: Git.txt #可以看到提示 Git.txt 已被修改
- # 新建几个测试文件
- [[email protected] Git]# echo "第二个测试文件"> git2.txt
- [[email protected] Git]# echo "第三个测试文件"> git3.txt
- [[email protected] Git]# ls #确认新建的测试文件
- git2.txt git3.txt Git.txt
- [[email protected] Git]# Git add git2.txt git3.txt #一次提交多个文件
- [[email protected] Git]# Git status #查看 Git 的状态
- # 位于分支 master
- # 要提交的变更:
- # (使用 "git reset HEAD <file>..." 撤出暂存区)
- #
- # 修改: Git.txt
- # 新文件: git2.txt
- # 新文件: git3.txt
- # 上面是提示 Git 被修改, 并且添加了两个新的文件
- [[email protected] Git]# Git commit -m "提交多个版本" #将暂存区的多个版本进行提交
[master 86c5044] 提交多个版本
- 3 files changed, 3 insertions(+)
- create mode 100644 git2.txt
- create mode 100644 git3.txt
- [[email protected] Git]# Git log --pretty=oneline #查看提交记录, 一行对应一次提价记录
86c50445d84591741812e0bd9088a1c67bf5e9ec 提交多个版本
eecbb4d9ff025681b4abe4ec2bdd90eeb0b66fd6 第一次提交
- # 至此, Git 库下的所有文件都被提交了, 那么, 我现在将本地的所有文件都删除, 查看下 Git 的状态是什么
- [[email protected] Git]# rm Git* #删除当前目录下所有的测试文件
- [[email protected] Git]# Git status #查看 Git 的状态
- # 位于分支 master
- # 尚未暂存以备提交的变更:
- # (使用 "git add/rm <file>..." 更新要提交的内容)
- # (使用 "git checkout -- <file>..." 丢弃工作区的改动)
- #
- # 删除: Git.txt
- # 删除: git2.txt
- # 删除: git3.txt
- # 上述提示了删除了三个文件, 下面说的是修改了但是尚未提交
修改尚未加入提交(使用 "git add" 和 / 或 "git commit -a")
- # 那么, 我现在若想恢复删除的文件呢? 只需进行以下操作:
- [[email protected] Git]# Git reflog --pretty=oneline #查看提交记录
86c5044 [email protected]{0}: commit: 提交多个版本
eecbb4d [email protected]{1}: commit (initial): 第一次提交
- [[email protected] Git]# ls #确定当前目录下没有任何测试文件
- [[email protected] Git]# Git reset --hard 86c5044 #版本回滚到指定提交的文职
HEAD 现在位于 86c5044 提交多个版本
- [[email protected] Git]# ls #再次查看, 被删除的文件又回来了
- git2.txt git3.txt Git.txt
- # 那么, 现在我想要恢复到第一次提交的时候呢?
- [[email protected] Git]# Git reflog --pretty=oneline #同样需要查看其日志记录
86c5044 [email protected]{0}: commit: 提交多个版本
eecbb4d [email protected]{1}: commit (initial): 第一次提交
[[email protected] Git]# Git reset --hard [email protected]{1} #对, 在版本回滚时, 不但可以指定第一列的 ID 号, 也可以指定其 HEAD 字段
HEAD 现在位于 eecbb4d 第一次提交
- [[email protected] Git]# ls #再次查看当前工作目录下, 恢复到了最初只有一个测试文件的状态
- Git.txt
- [[email protected] Git]# Git reset --hard 86c5044 #再次恢复到测试文件最多的时候
HEAD 现在位于 86c5044 提交多个版本
- [[email protected] Git]# ls
- git2.txt git3.txt Git.txt
四, 撤销修改的操作
关于撤销修改, 其实在上面已经展示出来如何从版本库中撤销修改了, 那么下面将介绍如何从暂存区, 工作台进行撤销修改
1, 从工作台撤销修改
- [[email protected] Git]# cat Git.txt #确定当前文件内容
- aaaa
- bbbb
- [[email protected] Git]# echo "cccc">> Git.txt #修改文件内容
- [[email protected] Git]# cat Git.txt #查看修改后的文件
- aaaa
- bbbb
- cccc
- [[email protected] Git]# Git checkout -- Git.txt #对工作台执行撤销操作
- [[email protected] Git]# cat Git.txt #确认新添加的内容被撤销
- aaaa
- bbbb
2, 从暂存区撤销修改
- [[email protected] Git]# echo "abcd"> ljz.txt #创建新的测试文件
- [[email protected] Git]# Git add ljz.txt #添加至暂存区
- [[email protected] Git]# Git status #查看 Git 状态
- # 位于分支 master
- # 要提交的变更:
- # (使用 "git reset HEAD <file>..." 撤出暂存区)
- #
- # 新文件: ljz.txt #提示有新添加的文件
- [[email protected] Git]# Git reset HEAD ljz.txt #执行撤销操作
- [[email protected] Git]# Git status #再次查看 Git 的状态, 提示提交为空, 还提示使用 Git add 建立提交
- # 位于分支 master
- # 未跟踪的文件:
- # (使用 "git add <file>..." 以包含要提交的内容)
- #
- # ljz.txt
提交为空, 但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
3, 从版本库中删除指定版本
- [[email protected] Git]# rm Git.txt #删除本地文件
- [[email protected] Git]# Git rm Git.txt #使用 Git 执行 rm 命令
- [[email protected] Git]# Git commit -m "删除文件" #提交到版本库,
至此, 都只是 Git 版本库的基本操作, 那么? 我们如何将我们的 Git
库关联到 GitHub 上呢? 下面是两种情况下的关联方法.
五, 将本地 Git 库关联到 GitHub
情况一: 本地有 Git 库, GitHub 库是空的:
1, 首先需要先创建一个空的 GitHub 库.
自行注册 GitHub 账号并登陆, 比较简单, 这里就不写了.
在主机上生成秘钥对, 并上传至 GitHub 上:
- [[email protected] Git]# SSH-keygen -t rsa -C "[email protected]" #执行此命令后, 一路按回车即可,"-C" 后面是自己的邮箱地址
- [[email protected] Git]# cat ~/.SSH/id_rsa.pub #查看生成的公钥, 并复制其内容
- SSH-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5ubfu4/UxpX/1aW3bPLUBihphbC0sUkmM0NusofTEW2rQ6Fy4+tRb2qvDLm6XXXBIzDNcr16qFGE95OFmhGF+M+TjjjvVyMFQu+qLjyfRceiYlLZ6II0ZY5+agQJSYlFYYyvHhJHFo69S07jx5A7Q2doLpW+O0i2MLdY0CyKvlRgE9Onoj+8TM9ZBfJdtoAGQdkH353NeiFJOJi71+KQgvvzpRiRiRjTv4mLGuWdeAAhxG1+rGnyotQktiobHGHKPLpm9w/PT95tuKQ/d8zH4BqsDkWuzIMy5E0vhELpEHFBilx6YuPL2h1N8YSFARxyz4zRPAQoCeATdgA+nD68z [email protected]
在 GitHub 上操作如下, 以便添加公钥:
输入 GitHub 账号的密码进行验证:
确定添加成功:
2,
回到新创建的库:
- [[email protected] Git]# ls -a #当前的工作目录必须是一个 Git 库
- . .. .Git git2.txt git3.txt Git.txt ljz.txt
- [[email protected] Git]# Git remote add origin [email protected]:lvjianzhao/test01.Git #执行提示的第一条命令
- [[email protected] Git]# Git push -u origin master #进行提交, 由于是第一次上传, 所以需要使用 "-u" 选项
- # 如果执行上述命令后, 提示需要输入 "yes", 输入即可
- Counting objects: 8, done.
- Compressing objects: 100% (3/3), done.
- Writing objects: 100% (8/8), 563 bytes | 0 bytes/s, done.
- Total 8 (delta 0), reused 0 (delta 0)
- To [email protected]:lvjianzhao/test01.Git
- * [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master.
# 提示已经提交成功了.
至此, F5 刷新我们 GitHub 上刚刚创建的库的页面, 就可以看到我们工作台目录下的那些文件了, 如下:
六, 从 GitHub 下载到本地 Git 版本库
上述已经演示了如何将本地的 Git 版本库关联到远端的 GitHub 的空库.
那么这里将展示如何将 GitHub 已存在的库 (库中有内容) 下载到本地.
由于在第五步操作时, 已经设置好了邮箱及 SSH 秘钥等操作, 所以这里就可以省略这两部操作了, 如果没有配置邮箱及 SSH 秘钥, 可参考第五个段落进行配置.
这里就将第五步创建的 GitHub 库下载到本地.
找到 GitHub 创建的库, 如下:
- [[email protected] /]# Git clone [email protected]:lvjianzhao/test01.Git
- # 执行命令 "git clone", 后面的路径就是我们复制的 GitHub 上的 SSH 路径
正克隆到'test01'...
- Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts.
- remote: Enumerating objects: 8, done.
- remote: Counting objects: 100% (8/8), done.
- remote: Compressing objects: 100% (3/3), done.
- remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0
接收对象中: 100% (8/8), done.
- [[email protected] /]# cd test01/ #克隆成功后, 就会在当前目录下生成 test01 这个库
- [[email protected] test01]# ls #并且内容就是我们 GitHub 上的内容
- git2.txt git3.txt Git.txt
- [[email protected] test01]# echo "clone success..."> succed #创建新的测试文件
- [[email protected] test01]# ls #如下:
- git2.txt git3.txt Git.txt succed
- [[email protected] test01]# Git add succed #将新创建的文件添加到暂存区
- [[email protected] test01]# Git commit -m "clone succes" #提交到版本库
- [master e62bdba] clone succes
- 1 file changed, 1 insertion(+)
- create mode 100644 succed
- [[email protected] test01]# Git push origin master #将本地文件推送到 GitHub
- Counting objects: 4, done.
- Compressing objects: 100% (2/2), done.
- Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done.
- Total 3 (delta 1), reused 0 (delta 0)
- remote: Resolving deltas: 100% (1/1), completed with 1 local object.
- To [email protected]:lvjianzhao/test01.Git
- 86c5044..e62bdba master -> master
- [[email protected] test01]# Git remote #查看远端版本库的信息
- origin
回到 GitHub 上, 刷新库的页面, 即可看到新提交的文件, 如下:
来源: http://www.bubuko.com/infodetail-3286786.html