我不会用*官方*的语言告诉你Git 是什么,对此我表示深深得歉意~~
在我看来像CSDN、博客园、掘金等博客交流平台就是小的“GitHub”,只不过在这里更多的是一些零零散散的笔记或者文章,其实Gihub也是一样的“交流(友)社区",这里有一本正经的开源项目,你可以在上面学习别人的开源项目也可以上传属于自己的作品,也有各种沙雕的个人“作品”,比如 [The F**k](https://github.com/nvbn/thefuck)、比如:[P站logo生成器](https://github.com/bestony/logoly),以及各种奇葩的交友方式 /滑稽。咳咳,总的来说呢,Github 是一个供大家“学习”的平台,同时也是一个学习交流社区,就酱。我只想带你入坑,至于你学的怎么样,我包不负责 /抠鼻
![Emmm.......](https://img-blog.csdnimg.cn/20200326174342946.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDM1NTU5MQ==,size_16,color_FFFFFF,t_70)
## 阅读说明:

总文加起来 *20分钟*可以看完,我把总文分成了 Git`命令`实战 和 GitHub `运用` 两部分,本篇是 Git 命令实战,各位不用担心~常用的Git命令两只手就可以数过来,无非就是提交和下载,好了那么我们开始进入~~入坑~~ 学习吧。

## 简单的安装
Git的安装非常**精简**,基本一步到位:
**Windows**:[点进去选择Window,它会自动安装好](https://git-scm.com/downloads)
**MacOS**:
*方法一*:推荐直接下载Xcode,直接在App Store搜索(免费)*xcode是苹果的集成开发环境*(IDE)下载好这个软件不仅Git很多环境都给你自动配置好了
*方法二*:通过第三方homebrew安装(不推荐):
在Mac`终端`输入

```python
# 安装 homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安装Git
brew install git

```
**Linux**:
*Ubantu*:`sudo apt-get install git`
*Centos*: `yum install git`

Emm。。。。git的安装基本不会出意外,出了意外你顺着网线来打我
接下来就开始动手实操了,让我们先创建一个文件夹吧,不妨就叫Git,作为练习的主要目录,好了就开始吧
## 初始化一个Git仓库
创建一个 Git 目录,我们把这个目录变为可以用GIT管理的仓库! `git init`命令把这个目录变成Git可以管理的仓库
> mkidr Git
> cd Git
> git init

## 创建练习对象

然后就可以在仓库愉快的玩耍了,我们先搞一个txt文件练习一下

>vim demo.txt

这条命令会 **创建** 并且 **进入** demo.txt, 按下 `i` 进入 vim编辑模式,就可以在这个文件里输入内容了!
我们输入:

> this is 1 test
> ~
> ~
> ~
> ~
> ~
>
然后 按下esc退出vim编辑模式, 然后按下(冒号) `:` 并在冒号后面输入 `wq` 然后回车,我们就自动关闭并且保存这个txt文件了.
随后我们用 `git add` 命令把 txt 文件放到仓库里,随后用`git commoit`命令 把文件提交给仓库,

> git add demo.txt
> git commit -m "first commit"
>
返回:
> [master c819da4] first commit
> 2 files changed, 2 insertions(+), 3 deletions(-)
>create mode 100644 demo.txt

你可以这样理解, 就像寄快递一样, 我们把快递交给`快递小哥(add)`,随后快递小哥把快递送到达`物流仓库(commit)`。`-m "first commit"` 是提交说明,`-m` 是固定格式,引号里面是自定义内容,就好像你邮寄快递的留言一样,可以对本次“邮寄”做一个说明.

## 第二次修改

然后我们对 demo.txt 修改添加一些内容,输入 `vim demo.txt` 我们会进入demo.txt文件,然后按下 `i` 键,进入vim 编辑模式,我们写入:

> this is first test
这是第二次修改

写完后,按下 `esc` 键退出vim编辑模式,进入vim命令模式, 然后输入(冒号) `:wq` 回车,这样就写入并且退出了。
其实,我们每一次的修改git它都有记录,我们输入 `git diff demo.txt` 命令可以查看,这个文件发生了哪些不同. diff 是different的意思

> [root@StrawberryJam Git]# git diff demo.txt
>diff --git a/demo.txt b/demo.txt
>index 2fd7f63..a9b2fb1 100644
>--- a/demo.txt
>+++ b/demo.txt
>@@ -1,2 +1,2 @@
> this is first test
>
> +这是第二次修改

我们输入 `git status` 查看git仓库的状态,看看有哪些是要给“快递小哥”,有哪些将要送往“物流中心”的

> [root@StrawberryJam Git]# git status
> 位于分支 master
> 尚未暂存以备提交的变更:
> (使用 "git add <file>..." 更新要提交的内容)
> (使用 "git checkout -- <file>..." 丢弃工作区的改动)
> 修改: demo.txt
> 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

上面提示告诉我们, demo.txt 已经修改过了,我们还没有提交给仓库,接下来我们进行第二次提交,也就是我们修改过后的又一次提交,输入 `git add demo.txt` 命令, 然后输入 `git commit -m "second commit"`

>[root@StrawberryJam Git]# git add demo.txt
> [root@StrawberryJam Git]# git commit -m "second commit"
>[master 2f14c19] second commit
> 1 file changed, 1 insertion(+), 1 deletion(-)

我们就完成第二次修改的(发送)提交了, 是不是很简单!!,我们再输入`git status` 看一看

> [root@StrawberryJam Git]# git status
> 位于分支 master
>无文件要提交,干净的工作区

到这里,我们已经学会了 如何初始化一个GIT仓库和对文件的修改及提交。我们知道Git是一个版本控制系统,既然我们对文件修改了,那么就一定还可以回到上次的版本,这就好比文件备份,接下来让我们尝试一下回到“备份”的文件

## 第三次修改
输入 `vim demo.txt` 命令进入文件,按 `i` 键 进入 vim 编辑模式,输入新的内容

> this is first test
>这是第二次修改
>这是第三次修改
>~
>~
>~
>~

按下 `esc` 退出编辑模式 输入 `:wq` 回车后保存并且退出。
输入 `cat demo.txt` 命令查看一下文件是否有我们修改的内容

> [root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改

没有问题后我们就可以把第三次修改的文件进行提交了!再次输入 `git add demo.txt` 和 `git commit -m "thirt commit"`

> git add demo.txt
> [root@StrawberryJam Git]# git commit -m "third commit"
>[master 3b15c27] third commit
> 1 file changed, 1 insertion(+)

## 回到“备份”!!

到这里我们一共对文件进行了三次修改,接下来让我回到第二次修改的文件试试,输入 `git reset --hard HEAD^` , git reset --hard 是固定格式记住就好了,HEAD^ 是回到上一个版本,HEAD^^就是上上个版本

> [root@StrawberryJam Git]# git reset --hard HEAD^
>HEAD 现在位于 2f14c19 second commit

提示表明,我们在第二次修改的文件版本了,不妨输入`cat demo.txt` 预览一下

> [root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改

果然,我们退回到了第二次修改后的版本文件,如果我们又后悔了怎么办,不用担心依然可以回到第三次修改的版本文件,首先我们输入 `git reflog`可以查看git命令操作日志

> [root@StrawberryJam Git]# git reflog
>2f14c19 HEAD@{0}: reset: moving to HEAD^
>3b15c27 HEAD@{1}: commit: third commit
>2f14c19 HEAD@{2}: commit: second commit
>c819da4 HEAD@{3}: commit: first commit

最前面的 2f14c19 是我们操作对应的`ID` ,(ID都是随机分配的) 我们可以看到 第三次提交的 ID是 `3b15c27`,那么我就可以输入 `git reset --hard 3b15c27` 回到第三次提交的版本文件

> [root@StrawberryJam Git]# git reset --hard 3b15c27
>HEAD 现在位于 3b15c27 third commit
>[root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改

就这样我们又再次回到了第三次版本是不是很简单,看来想要回到指定版本只需要通过 `git reflog` 查看操作ID,然后 `git reset --hard` 就可以回到“备份”版本文件了!这个HEAD是一个箭头指针, 每当我们`git reset--hard ID` 就代表HEAD指向了这个ID,那么我们当前的版本就是这个HEAD指向的版本。

## 修改的管理~
**多次修改一次提交**:

现在我们知道了 commit 是在 add 之后,如果对文件修改一次后,我们git add 把“邮件”(文件)交给`快递小哥`,此时我们又修改了一次文件,如果这时候使用`git commit` 命令,那么Git只会记录我们第一次修改的文件,也就是说我们通过git add 把第一次修改后的文件交给快递小哥后,他就离开了准备发往`物流中心`,所以此时使用git commit 命令只会记录第一次修改的文件。一句话总结来说:每次修改都需要 git add一下,最后统一git commit 一起提交文件。

**撤销修改:**

接下来我们学习修改的撤销,我们先看一下git的 status

> [root@StrawberryJam Git]# git status
> 位于分支 master
> 无文件要提交,干净的工作区

好了我们对demo.txt 进行第四次内容的添加,`vim demo.txt` 后文件的内容

> [root@StrawberryJam Git]# vim demo.txt
>[root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改
>这是第四次添加内容

我们在看一下git 的 status

> [root@StrawberryJam Git]# git status
> 位于分支 master
> 尚未暂存以备提交的变更:
> (使用 "git add <file>..." 更新要提交的内容)
> (使用 "git checkout -- <file>..." 丢弃工作区的改动)
> 修改: demo.txt
>修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

我们可以看到 使用 *“git checkout -- <file>..." 丢弃工作区的改动* 这个提示,那我们不妨试一试输入 `git checkout demo.txt`,然后再cat 一下文件

> [root@StrawberryJam Git]# git checkout demo.txt
>[root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改

果然撤销了 ~~*我们的第四次添加的内容*~~ ,我们再看看git 的status

> [root@StrawberryJam Git]# git status
> 位于分支 master
> 无文件要提交,干净的工作区

到这里并没有什么大问题,因为我们修改文件后并没有对文件进行`add、 commit` 等操作,那么如果我们是在git add 之后想要撤销怎么办呢,我们重新写入 “这是第四次添加的内容”,并且执行了 `git add demo.txt` 命令

> [root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改
>“这是第四次添加的内容”
>[root@StrawberryJam Git]# git add demo.txt

就在add 之后,我后悔了,我不想提交我想撤销怎么办,`git status` 告诉了我们答案

> [root@StrawberryJam Git]# git status
> 位于分支 master
> 要提交的变更:
> (使用 "git reset HEAD <file>..." 撤出暂存区)
> 修改: demo.txt
>[root@StrawberryJam Git]#

提示已经很明确了, *使用 "git reset HEAD <file>..." 撤出暂存区* 那我们不妨试一试

> [root@StrawberryJam Git]# git reset HEAD demo.txt
>重置后撤出暂存区的变更:
>M demo.txt

**注意**!!这样我们的 demo.txt 文件只是回到了 `git add` 之前的状态,并没有对文件内容做出撤回处理,先通过 cat 看一下文件再status一下文件状态

> [root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改
>“这是第四次添加的内容”

>[root@StrawberryJam Git]# git status
> 位于分支 master
> 尚未暂存以备提交的变更:
> (使用 "git add <file>..." 更新要提交的内容)
> (使用 "git checkout -- <file>..." 丢弃工作区的改动)
> 修改: demo.txt
>修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

此时我们就可以再次使用 `git checkout demo.txt` 对文件内容作出撤回处理了

> [root@StrawberryJam Git]# git checkout demo.txt
>[root@StrawberryJam Git]# cat demo.txt
>this is first test
>这是第二次修改
>这是第三次修改
>[root@StrawberryJam Git]# git status
>位于分支 master
>无文件要提交,干净的工作区

Ok ~~ 那么如果我又add 了 又 commit了肿么办,那就直接 **回到“备份”** 参考上一节喽~

## 文件的删除
新建一个test.txt 文件并且写入内容,vim test.txt 创建并且打开 文件,写入

> 这是一个即将被Kill掉的文件
> ~
> ~
> ~
> ~

随后 git add 并且 commit 该文件

> [root@StrawberryJam Git]# git add test.txt
>[root@StrawberryJam Git]# git commit -m "bye bye"
>[master c2f3cdf] bye bye
> 1 file changed, 1 insertion(+)
> create mode 100644 test.txt

然后我们的删除命令 `rm test.txt`, 系统会问我们要不要删除文件,回复 y 好了

> [root@StrawberryJam Git]# rm test.txt
>rm:是否删除普通文件 "test.txt"?y

但是这里,删除的只是我们工作区的文件,也就是说 GIT 还有我们的备份的,只是我们当前的版本看不到了而已,那我们如何把这个“备份”也给Kill掉呢,`git status` 给出了答案

> [root@StrawberryJam Git]# git status
> 位于分支 master
> 尚未暂存以备提交的变更:
> (使用 "git add/rm <file>..." 更新要提交的内容)
> (使用 "git checkout -- <file>..." 丢弃工作区的改动)
> 删除: test.txt
>修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

告诉我们可以 *使用 "git add/rm <file>..." 更新要提交的内容* 那我们不妨用 rm 把test.txt从“备份”列表里删除,然后 commit 提交上去重新“备份”确认删除了

> [root@StrawberryJam Git]# git rm test.txt
>rm 'test.txt'
>[root@StrawberryJam Git]# git commit -m "It is gone"
>[master 815d827] It is gone
> 1 file changed, 1 deletion(-)
> delete mode 100644 test.txt

如果是一不下心删除错了文件怎么办呢? 上面的`git status` 还有另一个选项
*使用 "git checkout -- <file>..." 丢弃工作区的改动* 这样你就可以撤销你的`rm` 命令,当作什么都没发生 = .=

Git 命令实战入门 ,奶妈级教程的更多相关文章

  1. 30分钟Git命令“从入门到放弃”

    git 现在的火爆程度非同一般,它被广泛地用在大型开源项目中,但是初学者非常容易“从入门到放弃”,各种命令各种参数,天哪,宝宝要吓哭了.实际上新手并不需要了解所有命令的用途,学习是需要一个循序渐进的过 ...

  2. git命令实战之血泪记录

    注意: 本文章所写所有命令均在Git命令行窗口执行!非cmd窗口! 打开git命令行窗口步骤为:到项目根目录下执行bash命令行操作:右键点击Git Bash Here菜单,打开git命令窗口,不是c ...

  3. git 命令从入门到放弃

    o(︶︿︶)o  由于项目使用 git 作为版本控制工具,自己可以进行一些常用操作但是有时候还是会忘掉,导致每次遇到 git 命令的使用问题时就要再查一遍,效率就立马降下来了,所以今天就来一个从头到尾 ...

  4. nifi从入门到实战(保姆级教程)——身份认证

    上一篇我们搭建好了nifi的运行环境了 但是每次登陆那一串随机字符串的用户名和密码是不是让人很头疼,那是人类能记住的吗?当然不是!!!! 那么今天我们就来消灭这些难看又难记的字符串. windows( ...

  5. nifi从入门到实战(保姆级教程)——环境篇

    背景: 公司领导决定将各种基础数据的导入从代码中分离出来,用Apache Nifi替换.使开发者们更关注在业务上,而不用关心基础的由来. Apache Nifi对于整个团队都是一个全新的工具,之前大家 ...

  6. nifi从入门到实战(保姆级教程)——flow

    本文章首发于博客园,转载请标明出处 经过前两篇文章(环境篇,身份验证),我们已经有了nifi可以运行的基础,今天就来实现一个案例吧. 假设我们要从ftp上获取一个zip包,里面有两个csv文件,一个是 ...

  7. git命令行的操作实例教程

    Git 常用命令常用命令 创建新仓库 创建新文件夹,打开,然后执行 git init 1 以创建新的 git 仓库. 检出仓库 执行如下命令以创建一个本地仓库的克隆版本: git clone /pat ...

  8. Git命令行入门

    安装 下载与文档地址:https://git-scm.com/book/zh/v2 我使用的是linux系统,故使用命令行安装Git # apt-get install git 配置 # git co ...

  9. Git分支实战入门详细图解

    现在我们模拟一个简单的分支和合并案例,其中工作流可供真实项目借鉴. (1)在master开展工作 (2)为新的需求创建分支 (3)在新的分支上展开工作 这时,你接到一个电话,说项目有一个严重的问题需要 ...

随机推荐

  1. Python3基础语法和数据类型

    Python3基础语法 编码 默认情况下,Python3源文件以UTF-8编码,所有字符串都是unicode字符串.当然你也可以为原码文件制定不同的编码: # -*- coding: 编码 -*- 标 ...

  2. C++ 指针偏移的理解

    //题目:若有程序段int a[5] = { 1, 2, 3, 4, 5 }; int *p = (int *)(&a + 1); printf("%d,%d", *(a ...

  3. Redis(9)——史上最强【集群】入门实践教程

    一.Redis 集群概述 Redis 主从复制 到 目前 为止,我们所学习的 Redis 都是 单机版 的,这也就意味着一旦我们所依赖的 Redis 服务宕机了,我们的主流程也会受到一定的影响,这当然 ...

  4. Git&sourceTree软件安装、使用说明及遇到问题解决

    一.软件版本 1.Git版本为1.9.5 2.Source版本为1.5.2 二.软件安装步骤 1.Git安装步骤 1)双击Git安装文件进入下图界面,单击Next 2)继续Next 3)进入Selec ...

  5. (转)浅析epoll – epoll函数深入讲解

    原文地址:http://www.cppfans.org/1418.html 浅析epoll – epoll函数深入讲解 前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要 ...

  6. go源码分析(二) 使用go http包开发web时遇到的坑之重复注册Handle路由

    我们使用Handle注册http时 如果添加两行,即重复注册函数. http.HandleFunc("/",index) http.HandleFunc("/" ...

  7. Antd 表格内通过rowClassName实现隔行变色的显示方法(转载)

    ant design中 table组件很方便,在项目中遇到了需要实现奇偶行颜色不同以方便阅读的功能,主要用到了rowClassName这一api,通过判断index的奇偶来实现不同的样式分配. row ...

  8. Java多线程并发04——合理使用线程池

    在此之前,我们已经了解了关于线程的基本知识,今天将为各位带来,线程池这一技术.关注我的公众号「Java面典」了解更多 Java 相关知识点. 为什么使用线程池?线程池做的工作主要是控制运行的线程的数量 ...

  9. Flask wtforms 表单验证使用

    目录 wtforms 使用1(简单版): 使用2(复杂版): wtforms 安装:pip3 install wtforms 使用1(简单版): from flask import Flask, re ...

  10. 关于MySQL数据库事务的机制学习总结

    这几天面试多次被问到了数据库事务机制.隔离级别.乐观锁悲观锁类的问题,之前对这些只能说有所了解,有些概念还停留在记忆层面,没有理解,所以回答的不好.后面翻书学习了下,理解了一些东西,在此做一个记录. ...