git的安装

官网下载地址:https://git-scm.com/downloads

安装完成后,还需要最后一步设置,在命令行输入:

  1. $ git config --global user.name "Your Name"
  2. $ git config --global user.email "email@example.com"

创建版本库

创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

  1. $ mkdir learngit
  2. $ cd learngit
  3. $ pwd
  4. /Users/michael/learngit

第二步,通过git init命令把这个目录变成Git可以管理的仓库:

  1. $ git init
  2. Initialized empty Git repository in /Users/michael/learngit/.git/

现在我们编写一个readme.txt文件,内容如下:

  1. Git is a version control system.
  2. Git is free software.

把一个文件放到Git仓库只需要两步。

第一步,用命令git add告诉Git,把文件添加到仓库:

  1. $ git add readme.txt

第二步,用命令git commit告诉Git,把文件提交到仓库:

  1. $ git commit -m "wrote a readme file"
  2. [master (root-commit) eaadf4e] wrote a readme file
  3. file changed, insertions(+)
  4. create mode readme.txt

为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

  1. $ git add file1.txt
  2. $ git add file2.txt file3.txt
  3. $ git commit -m "add 3 files."

提交修改过后的文件

现在,运行git status命令看看结果:

  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. (use "git add <file>..." to update what will be committed)
  5. (use "git checkout -- <file>..." to discard changes in working directory)
  6.  
  7. modified: readme.txt
  8.  
  9. no changes added to commit (use "git add" and/or "git commit -a")

已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

  1. $ git diff readme.txt
  2. diff --git a/readme.txt b/readme.txt
  3. index 46d49bf..9247db6
  4. --- a/readme.txt
  5. +++ b/readme.txt
  6. @@ -, +, @@
  7. -Git is a version control system.
  8. +Git is a distributed version control system.
  9. Git is free software.

提交修改和提交新文件是一样的两步,第一步是git add

  1. $ git add readme.txt

同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:

  1. $ git status
  2. On branch master
  3. Changes to be committed:
  4. (use "git reset HEAD <file>..." to unstage)
  5.  
  6. modified: readme.txt

git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

  1. $ git commit -m "add distributed"
  2. [master e475afc] add distributed
  3. file changed, insertion(+), deletion(-)

提交后,我们再用git status命令看看仓库的当前状态:

  1. $ git status
  2. On branch master
  3. nothing to commit, working tree clean

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

版本回退

当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

  1. $ git log
  2. commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
  3. Author: Michael Liao <askxuefeng@gmail.com>
  4. Date: Fri May :: +
  5.  
  6. append GPL
  7.  
  8. commit e475afc93c209a690c39c13a46716e8fa000c366
  9. Author: Michael Liao <askxuefeng@gmail.com>
  10. Date: Fri May :: +
  11.  
  12. add distributed
  13.  
  14. commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
  15. Author: Michael Liao <askxuefeng@gmail.com>
  16. Date: Fri May :: +
  17.  
  18. wrote a readme file

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

  1. $ git log --pretty=oneline
  2. 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
  3. e475afc93c209a690c39c13a46716e8fa000c366 add distributed
  4. eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset命令:

  1. $ git reset --hard HEAD^
  2. HEAD is now at e475afc add distributed

Git提供了一个命令git reflog用来记录你的每一次命令:

  1. $ git reflog
  2. e475afc HEAD@{}: reset: moving to HEAD^
  3. 1094adb (HEAD -> master) HEAD@{}: commit: append GPL
  4. e475afc HEAD@{}: commit: add distributed
  5. eaadf4e HEAD@{}: commit (initial): wrote a readme file

找到那个append GPLcommit id1094adb...,于是就可以指定回到未来的某个版本:

  1. $ git reset --hard 1094a
  2. HEAD is now at 83b0afe append GPL

现在总结一下:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区和暂存区

【深入学习linux】git的使用的更多相关文章

  1. 20155228 基于VirtualBox安装Ubuntu和学习linux命令的学习经历和心得

    一.虚拟机VirtualBox的下载安装 基于VirtualBox虚拟机安装Ubuntu图文教程 虽然娄老师的教程对于VirtualBox的下载安装讲的很简单,可以说是一笔带过,但是我在下载安装的过程 ...

  2. 学习使用Git 版本控制 代码管理

    title: 学习使用Git 版本控制 代码管理 notebook: 经验累积 tags:Git --- Git 版本控制 学习教程 Git版本控制器,可以作为程序员.计算机科学和软件工程的研究人员在 ...

  3. 在Windows环境中学习Linux

    如何在Windows环境下学习Linux?方法如下: 方法一: 下载Cygwin,Cygwin是一个在windows平台上运行的类UNIX模拟环境,网上有很多安装教程,这里不多说. 方法二: 下载一个 ...

  4. 是时候学习Linux了

    前言: Linux是一个开源.免费的操作系统.其稳定性.安全性.处理多并发已经得到业界的认可,目前很多企业级的项目都会部署到Linux/unix系统上.如果你还不太了解Linux,希望本篇文章能够带你 ...

  5. 学习Linux须知1.2之Linux命令的实战

    (一)学习Linux 的准备工作 1.在线学习linux 学习网站推荐:Linux 基础入门_Linux - 蓝桥云课 (lanqiao.cn) 2.连接远程服务器学习[下文的案例就是使用xshell ...

  6. Linux系统的理解及学习Linux内核的心得

    作业列表      (点击作业跳转) linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作 linux内核分析作业:操作系统是如何工作的进行:完成一个简单的时间片轮转多道程序内核 ...

  7. 忠告初学者学习Linux系统的8点建议

    导读 新手或者说即将要入坑的小伙伴们,常常在QQ群或者在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的.例如:如何给添加的用户归属用户组,复制整个文件到另一个目录下面,磁盘合理划分,甚至 ...

  8. 总结4点对学习Linux有帮助的建议(纯干货)

    学习需要足够的毅力和耐心 有些人把Linux运维看作一项冗长而枯燥的工作:有些人把linux运维看作一项得力的工具.如果是前者建议还是改变一下认识,不然不建议入门这行.毕竟linux运维工作是对人的毅 ...

  9. 总结四条对学习Linux系统有帮助的方法

    网络是一个很神奇的东西,现代人的生活离不开网络,网络已深入人们的工作,生活,娱乐等方方面面.网络之所以无处不在,是因为它提供了诸多的网络服务,所以网络服务是网络的灵魂. 互联网上的各种网络服务是架构在 ...

  10. 学习linux/unix编程方法的建议(转)

    假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高从安装使用=>linux常用命令=>linux ...

随机推荐

  1. Linux配置swap

    根据自己的物理内存分配合适的swap大小 下面是合适的配置 物理内存 交换分区(swap) <=4G 至少2G 4-16G 至少4G 16G-64 至少8G 下面是操作步骤 1.首先查看我们的内 ...

  2. git commit 之后,撤销commit操作

    撤销.修改commit 写代码过程中,如果已经git add [files] git -m commit [files],没有push代码到远程仓库,想撤销commit,可以根据实际情况,使用以下参数 ...

  3. spark遇到的问题及解决方法

    1. 表中数据过亿,加载速度过慢,而我只需要加载增量数据 如:加载昨天一整天的数据,添加predicates分区,方法如下: //predicates相当于是把昨天的数据分成一个区,其它的数据不加载 ...

  4. ARTS-week8

    Algorithm 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的 ...

  5. php怎么实现多态?

    在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值.字符串.对象.资源等.我们无法说PHP5中多态的是变量. 我们只能说在PHP5中,多态应用在方法参数的类型提示位置. 一个类的任何子 ...

  6. pandas IO

    pd.read_csv("../data/user_info.csv", index_col="name") #假设csv里包含这几列: name, age, ...

  7. new的模拟实现

    new 一句话介绍 new: new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一 也许有点难懂,我们在模拟 new 之前,先看看 new 实现了哪些功能. 举个例子: // ...

  8. $.extend(obj1,obj2...,objN)小结 扩展obj1属性,有返回值,返回第一个被扩展后的对象

    <script> var obj1 = {     name:'liu',     age:'24' } var obj2 = {     name:'jinyu',     sex:'m ...

  9. js spread object

    What’s is the benefit / drawback of these two alternatives? Using object spread options = {...option ...

  10. React于React native的渲染机制

    面向virtual DOM编程 vs 面向native componet编程: 状态编程引起的UI变化会全部提交到native compnent然后走平台原来的渲染流程. The DOM is jus ...