文中红色的文字为学习过程中遇到的问题.
一, 创建版本库
版本库又名仓库, 英文名 repository, 可简单的理解一个目录, 这个目录里面的所有文件都可以被 Git 管理起来, 每个文件的修改, 删除, Git 都能跟踪, 以便任何时刻都可以追踪历史, 或者在将来某个时刻还可以将文件 "还原".
== 两种方式:
1. 用 Git 之前已经有的项目代码
$ cd 项目所在的文件夹
$ Git init
2. 用 Git 之前还没有项目代码
$ cd 某个文件夹
- $ Git init your_project #会在当前路径下创建和项目名称相同的文件及
- $ cd your_project
方法 2 的演示:
如下我是 F 盘 -> www 下 目录下新建一个 testgit 版本库.
pwd 命令是用于显示当前的目录.
1)通过命令 Git init 把这个目录变成 Git 可以管理的仓库, 如下:
插曲: Git init 后没有生成. Git 文件夹
2)把文件添加到版本库中
首先要明确下, 所有的版本控制系统, 只能跟踪文本文件的改动, 比如 txt 文件, 网页, 所有程序的代码等, Git 也不列外, 版本控制系统可以告诉你每次的改动, 但是图片, 视频这些二进制文件, 虽能也能由版本控制系统管理, 但没法跟踪文件的变化.
demo 如下演示:
在版本库 testgit 目录下新建一个记事本文件 readme.txt 文件:
第一步: 使用命令 Git add readme.txt 添加到暂存区里面去.
插曲: 可能会出现这样的提示:
fatal: pathspec 'readme.txt' did not match any files
这说明在文件夹里并没有 readme.txt 这个文件
解决办法
手动创建 readme.txt
通过 Git 命令创建 touch readme.txt
第二步: 用命令 Git commit 告诉 Git, 把文件提交到仓库.
现在我们已经提交了一个 readme.txt 文件了, 可以通过命令 Git status 来查看是否还有文件未提交, 如下:
当我们在 readme.txt 文件中添加内容, 再执行 Git status 来查看时, 会出现如下结果:
上面的命令告诉我们 readme.txt 文件已被修改, 但是未被提交的修改.
readme.txt 文件到底改了什么内容, 如何查看呢? 可以使用如下命令:
Git diff readme.txt :
知道了对 readme.txt 文件做了什么修改后, 我们可以放心的提交到仓库了, 提交修改和提交文件是一样的 2 步
(第一步是 Git add 第二步是: Git commit). 如下:
二: 版本回退:
现在我已经对 readme.txt 文件做了三次修改了, 那么我现在想查看下历史记录, 如何查呢?
可以使用命令 Git log 演示如下所示:
Git log 命令显示从最近到最远的显示日志, 还可以使用命令 Git log -pretty=oneline 演示如下:
现在想使用版本回退操作, 把当前的版本回退到上一个版本, 要使用什么命令呢?
可以使用如下 2 种命令, 第一种是: Git reset --hard HEAD^ 那么如果要回退到上上个版本只需把 HEAD^ 改成 HEAD^^ 以此类推.
那如果要回退到前 100 个版本的话, 命令操作: Git reset --hard HEAD~100 即可. 未回退之前的 readme.txt 内容如下:
插曲: 可能出现如下提示
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
问题解决:
用 Git log 看看你是不是有且只有一个 commit
通过命令 cat readme.txt 查看
获取到版本号: Git reflog 演示如下:
通过上面的显示我们可以知道, 增加内容 333333333333333 的版本号是 3752a62. 我们现在可以命令
Git reset --hard 3752a62 来恢复了. 演示如下:
三, 理解工作区与暂存区的区别?
工作区: 就是你在电脑上看到的目录, 比如目录下 testgit 里的文件(.Git 隐藏目录版本库除外). 或者以后需要再新建的目录文件等等都属于工作区范畴.
版本库(Repository): 工作区有一个隐藏目录. Git, 这个不属于工作区, 这是版本库. 其中版本库里面存了很多东西, 其中最重要的就是 stage(暂存区), 还有 Git 为我们自动创建了第一个分支 master, 以及指向 master 的一个指针 HEAD.
我们前面说过使用 Git 提交文件到版本库有两步:
第一步: 是使用 Git add 把文件添加进去, 实际上就是把文件添加到暂存区.
第二步: 使用 Git commit 提交更改, 实际上就是把暂存区的所有内容提交到当前分支上.
我们继续使用 demo 来演示下:
我们在 readme.txt 再添加一行内容为 7777, 接着在目录下新建一个文件为 test.txt 内容为 test, 我们先用命令 Git status 来查看下状态, 如下:
现在我们先使用 Git add 命令把 2 个文件都添加到暂存区中, 再使用 Git status 来查看下状态, 如下:
接着我们可以使用 Git commit 一次性提交到分支上, 如下:
四, Git 撤销修改和删除文件操作
1. 撤销修改:
比如我现在在 readme.txt 文件里面增加一行 内容为 11111, 我们先通过命令查看如下:
在未提交之前, 我发现添加 11111 内容有误, 所以要马上恢复以前的版本, 可以有如下几种方法可以做修改:
第一: 如果我知道要删掉那些内容的话, 直接手动更改去掉那些需要的文件, 然后 add 添加到暂存区, 最后 commit 掉.
第二: 可以按以前的方法直接恢复到上一个版本. 使用 Git reset --hard HEAD^
第三: 但是, 现在不想使用上面的 2 种方法, 想直接想使用撤销命令该如何操作呢?
首先在做撤销之前, 我们可以先用 Git status 查看下当前的状态. 如下所示:
可以发现, Git checkout -- file 可以丢弃工作区的修改, 如下命令:
Git checkout -- readme.txt(-- 与 readme 之间要有个空格), 如下所示:
命令 Git checkout --readme.txt 意思就是, 把 readme.txt 文件在工作区做的修改全部撤销, 这里有 2 种情况, 如下:
1.readme.txt 自动修改后, 还没有放到暂存区, 使用撤销修改就回到和版本库一模一样的状态.
2. 另外一种是 readme.txt 已经放入暂存区了, 接着又作了修改, 撤销修改就回到添加暂存区后的状态.
对于第二种情况, 做 demo 演示如下所示:
注意: 命令 Git checkout -- readme.txt 中的 -- 很重要, 如果没有 -- 的话, 那么命令变成创建分支了.
2. 删除文件
在版本库 testgit 目录添加一个文件 b.txt, 然后提交. 如下:
如上: 如果我想彻底从版本库中删掉了此文件的话, 可以再执行 commit 命令 提交掉.
== 在没有执行 commit 前, 如果我想在版本库中恢复此文件如何操作呢?
可以使用如下命令 Git checkout -- b.txt, 如下所示:
五, 远程仓库
在了解之前, 先注册 GitHub 账号, 由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过 SSH 加密的, 所以需要一点设置:
第一步: 创建 SSH Key. 在用户主目录下, 看看有没有. SSH 目录, 如果有, 再看看这个目录下有没有 id_rsa 和 id_rsa.pub 这两个文件, 如果有的话, 直接跳过此如下命令, 如果没有的话, 执行以下步骤:
插曲: 使用该工具生成. SSH 目录及公钥和私钥
1. 在 "用户目录" 下, 右击选择 "Git Bash hear", 效果见下图:
输入以下命令并执行, 然后一路按 "回车" 即可, 效果见图:
SSH-keygen
重新查看我们的用户目录, 发现是否多了一个 ".ssh" 目录, 且该目录下存在两个文件:
(1)公钥: id_rsa.pub
(2)私钥: id_rsa
打开终端, 输入以下命令行
$ SSH-keygen -t rsa -C"[email protected]"(后面的 [email protected] 改为你的邮箱.)
直接点回车, 说明会在默认文件 id_rsa 上生成 SSH key.
然后系统要求输入密码, 直接按回车表示不设密码.
重复密码时也是直接回车, 之后提示你 shh key 已经生成成功.
打开 id_rsa.pub, 复制里面的 key.
回到 GitHub 网站, 进入 Account Settings, 左边选择 SSH Keys,Add SSH Key,
title 随便填, 粘贴 key.
Add SSH key
验证是否成功, 在 Git bash 下输入
$ SSH -T [email protected]
回车就会看到: You've successfully authenticated, but GitHub does not provide shell access . 这就表示已成功连上 GitHub.
如何添加远程库?
现在的情景是: 已经在本地创建了一个 Git 仓库后, 又想在 GitHub 创建一个 Git 仓库, 并且希望这两个仓库进行远程同步, 这样 GitHub 的仓库可以作为备份, 又可以其他人通过该仓库来协作.
首先, 登录 GitHub 上, 然后在右上角找到 "create a new repo" 创建一个新的仓库. 如下:
在 Repository name 填入 testgit, 其他保持默认设置, 点击 "Create repository" 按钮, 就成功地创建了一个新的 Git 仓库:
目前, 在 GitHub 上的这个 testgit 仓库还是空的, GitHub 告诉我们, 可以从这个仓库克隆出新的仓库, 也可以把一个已有的本地仓库与之关联, 然后, 把本地仓库的内容推送到 GitHub 仓库.
现在, 我们根据 GitHub 的提示, 在本地的 testgit 仓库下运行命令:
插曲: 报错 error: src refspec master does not match any
原因分析:
1. 本地 Git 仓库目录下为空
2. 本地仓库 add 后未 commit
3.Git init 错误
解决方法:
1. 控制面板打开文件夹选项 打开隐藏文件和文件夹显示
2. 到本地仓库目录下查看是否有. Git 文件夹 -- 无 则 Git init
3. 看. Git 文件夹下是否有之前提交的文件 -- 若无 则重新 Git commit (如果之前 Git add 过的话 没有就要重新 add commit)
4. 新装的 Git 要留意是否需要配置用户名和邮箱名
把本地库的内容推送到远程, 使用 Git push 命令, 实际上是把当前分支 master 推送到远程.
由于远程库是空的, 我们第一次推送 master 分支时, 加上了 -u 参数, Git 不但会把本地的 master 分支内容推送的远程新的 master 分支, 还会把本地的 master 分支和远程的 master 分支关联起来, 在以后的推送或者拉取时就可以简化命令.
插曲: 报错! [rejected] master -> master (fetch first)
解决:
1.Git push -f 进行解决错误, 从而提交成功.
2. 如果上述解决方式不管用也可以输入: Git pull --rebase origin master 之后再进行 Git push 即可.
GitHub 上显示:
六, 获取 Git 仓库
两种取得 Git 项目仓库的方法. 第一种是在现有项目或目录下导入所有文件到 Git 中; 第二种是从一个服务器克隆一个现有的 Git 仓库.
1. 在现有目录中初始化仓库
如果你打算使用 Git 来对现有的项目进行管理, 你只需要进入该项目目录并输入:
$ Git init
该命令将创建一个名为 .Git 的子目录, 这个子目录含有你初始化的 Git 仓库中所有的必须文件, 这些文件是 Git 仓库的骨干. 但是, 在这个时候, 我们仅仅是做了一个初始化的操作, 你的项目里的文件还没有被跟踪.
如果你是在一个已经存在文件的文件夹 (而不是空文件夹) 中初始化 Git 仓库来进行版本控制的话, 你应该开始跟踪这些文件并提交. 你可通过 Git add 命令来实现对指定文件的跟踪, 然后执行 Git commit 提交:
- $ Git add *.c
- $ Git add LICENSE
- $ Git commit -m 'initial project version'
2. 克隆现有的仓库
获得一份已经存在了的 Git 仓库的拷贝, 这时就要用到 Git clone 命令.
首先, 登录 GitHub, 创建一个新的仓库, 名字叫 testgit3. 如下:
Git 克隆的是该 Git 仓库服务器上的几乎所有数据, 而不是仅仅复制完成你的工作所需要文件. 当你执行 Git clone 命令的时候, 默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来. 事实上, 如果你的服务器的磁盘坏掉了, 你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库.
其次, 克隆仓库的命令格式是 Git clone [url] .
$ Git clone https://github.com/zzbd444/testgit3
在当前目录下创建一个名为 "libgit2" 的目录, 并在这个目录下初始化一个 .Git 文件夹, 从远程仓库拉取下所有数据放入 .Git 文件夹, 然后从中读取最新版本的文件的拷贝.
如果你想在克隆远程仓库的时候, 自定义本地仓库的名字, 你可以使用如下命令:
$ Git clone https://github.com/zzbd444/testgit3 mylibgit
这将执行与上一个命令相同的操作, 不过在本地创建的仓库名字变为 mylibgit.
接着在我本地目录下 生成 testgit2 目录了, 如下所示:
Git 支持多种数据传输协议. 上面的例子使用的是 https:// 协议, 不过你也可以使用 Git:// 协议或者使用 SSH 传输协议, 比如 [email protected]:path/to/repo.Git .
注意:
因为 Git 是分布式版本控制系统, 所以需要填写用户名和邮箱作为一个标识. Git config --global 参数, 有了这个参数, 表示你这台机器上所有的 Git 仓库都会使用这个配置, 当然你也可以对某个仓库指定的不同的用户名和邮箱.
Git 学习笔记 -- 基础(三)
来源: http://www.bubuko.com/infodetail-3044456.html