Git 学习札记(二)

Linux上的Git基本操作

安装和使用 Git

在linux安装git的命令:

sudo apt-get install git

结果如图:(为了截这个图特意卸载了又装了一遍 /手动捂脸)

好了已经安装上了,然后我们先创建一个目录,然后把它做成一个git仓库:

sudo mkdir mygit
cd mygit
sudo git init

结果如下:

chia@edogawachia-sphinx:~/mygit$ sudo git init
[sudo] chia 的密码:
初始化空的 Git 仓库于 /home/chia/mygit/.git/

很好,说明已经初始化的新的Git仓库,可以看到这个 ” .git ” 目录。

chia@edogawachia-sphinx:~/mygit$ ls -ah
.  ..  .git

是隐藏的,因此要用 -a 把它显示出来。

下面写一个简单的readme.txt文件,然后将它添加到Git仓库,操作如下:

其中readme中的内容为:

this is a readme file
created by E.Chia 2018/02/06

git status 查看当前git状态,git add 将文件推进暂存区域,git commit 用来提交到仓库。

chia@edogawachia-sphinx:~/mygit$ sudo su
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master初始提交未跟踪的文件:(使用 "git add <文件>..." 以包含要提交的内容)readme.txt提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
root@edogawachia-sphinx:/home/chia/mygit# git add readme.txt
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master初始提交要提交的变更:(使用 "git rm --cached <文件>..." 以取消暂存)新文件:   readme.txtroot@edogawachia-sphinx:/home/chia/mygit# git commit -m "readme 1.0 version"*** Please tell me who you are.Rungit config --global user.email "you@example.com"git config --global user.name "Your Name"to set your account's default identity.
Omit --global to set the identity only in this repository.fatal: unable to auto-detect email address (got 'root@edogawachia-sphinx.(none)')
root@edogawachia-sphinx:/home/chia/mygit#

结果出现了问题。是没有进行设置。按照提示设置再提交,如下:

root@edogawachia-sphinx:/home/chia/mygit# git config --global user.email "jzsherlock@163.com"
root@edogawachia-sphinx:/home/chia/mygit# git config --global user.name "E.Chia"
root@edogawachia-sphinx:/home/chia/mygit# git commit -m "readme 1.0 version"
[master (根提交) 1e3633e] readme 1.0 version1 file changed, 3 insertions(+)create mode 100644 readme.txt
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
无文件要提交,干净的工作区

这个无文件要提交,说明已经从暂存区提交到了仓库,因此没有新的需要提交的文件。干净的工作区表示没有工作区新的更改。假如改动一下工作区:

root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     readme.txt修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

就会提示已经修改,但是还没有add进暂存区域。

root@edogawachia-sphinx:/home/chia/mygit# git diff "readme.txt"
diff --git a/readme.txt b/readme.txt
index 148f75a..d995350 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,3 @@This is a readme filecreated by E.Chia 2018/02/06-+modified by E.Chia 1st time

用 git diff 可以查看修改前后的不同,然后提交上去:

root@edogawachia-sphinx:/home/chia/mygit# git add "readme.txt"
root@edogawachia-sphinx:/home/chia/mygit# git commit -m 'added some sentence'
[master 7b2ff8d] added some sentence1 file changed, 1 insertion(+), 1 deletion(-)

用 git log 可以看历史记录:

root@edogawachia-sphinx:/home/chia/mygit# git log
commit 7b2ff8d11bcf98a1ed551f1ab1265d78307492cc
Author: E.Chia <jzsherlock@163.com>
Date:   Tue Feb 6 23:50:03 2018 +0800added some sentencecommit 1e3633e565e6fd7d30991a47f98a118aca2946bc
Author: E.Chia <jzsherlock@163.com>
Date:   Tue Feb 6 23:43:34 2018 +0800readme 1.0 version
root@edogawachia-sphinx:/home/chia/mygit# git log --pretty=oneline
7b2ff8d11bcf98a1ed551f1ab1265d78307492cc added some sentence
1e3633e565e6fd7d30991a47f98a118aca2946bc readme 1.0 version

可以看到修改的历史,并且展示了commit id都是哈希值。

语句的基本原理


上面这个图示表示了在进行以上操作的时候实际发生的事情。Index就是暂存区域的内容,HEAD是指向当前版本的Git仓库的指针。进行一次git add,相当于把working directory里面的内容推进了stage中的index,然后git commit 将index中的即将被提交的内容提交到branch,然后HEAD指向最新的版本。

当我们新建一个git仓库时,用了 git init,实际就是建立了一个带着HEAD节点的Git仓库,其中这时HEAD节点指向nothing。

其他操作

如果需要回退到之前的版本,可以用 git reset:

git reset 有以下几种用法,分别对应不同的参数,分别是 –soft,–mixed,–hard。soft是指只移动HEAD指针到某个版本;mixed指的是先移动HEAD指针,然后改变Index,也就是暂存区域的内容;hard是将HEAD和Index改完过后,把工作目录也改了。图示如下:



可以看出,三个过程是连贯的,如果指定soft,就只做到第一步骤,指定mixed或者不指定,也就是默认mixed,那就做到第二步骤,如果指定hard,则三个步骤完全。

测试:

先做三个版本,结果如下:

root@edogawachia-sphinx:/home/chia/mygit# vim readme.txt
root@edogawachia-sphinx:/home/chia/mygit# git add
没有指定文件,也没有文件被添加。
也许您想要执行 'git add .'?
root@edogawachia-sphinx:/home/chia/mygit# git add 'readme.txt'
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)修改:     readme.txtroot@edogawachia-sphinx:/home/chia/mygit# git commit -m 'another modification'
[master 440fc53] another modification1 file changed, 1 insertion(+)
root@edogawachia-sphinx:/home/chia/mygit# git log
commit 440fc536423d55513b47e85df97a40440bc8f04d
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:16:24 2018 +0800another modificationcommit 1d5928d4a36a32c6fa17f60943848e378cc47774
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:15:13 2018 +0800revisioncommit 1e3633e565e6fd7d30991a47f98a118aca2946bc
Author: E.Chia <jzsherlock@163.com>
Date:   Tue Feb 6 23:43:34 2018 +0800readme 1.0 version

可以看到三次commit的id和信息。

然后我们用reset还原到之前的版本:

root@edogawachia-sphinx:/home/chia/mygit# git reset --soft HEAD~
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
要提交的变更:(使用 "git reset HEAD <文件>..." 以取消暂存)修改:     readme.txtroot@edogawachia-sphinx:/home/chia/mygit# git log
commit 1d5928d4a36a32c6fa17f60943848e378cc47774
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:15:13 2018 +0800revisioncommit 1e3633e565e6fd7d30991a47f98a118aca2946bc
Author: E.Chia <jzsherlock@163.com>
Date:   Tue Feb 6 23:43:34 2018 +0800readme 1.0 version

说明soft使得HEAD所指的和暂存区域的Index的内容不一样了。而且log里面少了最新的版本。我们先还原到最新版本,然后实验hard。

root@edogawachia-sphinx:/home/chia/mygit# git reset 440fc
root@edogawachia-sphinx:/home/chia/mygit# git log
commit 440fc536423d55513b47e85df97a40440bc8f04d
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:16:24 2018 +0800another modificationcommit 1d5928d4a36a32c6fa17f60943848e378cc47774
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:15:13 2018 +0800revisioncommit 1e3633e565e6fd7d30991a47f98a118aca2946bc
Author: E.Chia <jzsherlock@163.com>
Date:   Tue Feb 6 23:43:34 2018 +0800readme 1.0 version
root@edogawachia-sphinx:/home/chia/mygit# git reset --hard HEAD~
HEAD 现在位于 1d5928d revision
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
无文件要提交,干净的工作区

hard之后三个区域都一样了,因此无文件提交,而且工作区干净。

root@edogawachia-sphinx:/home/chia/mygit# git log
commit 3d8d645e009decc8563085da87761294ced234e9
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:24:27 2018 +0800another revisioncommit 440fc536423d55513b47e85df97a40440bc8f04d
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:16:24 2018 +0800another modificationcommit 1d5928d4a36a32c6fa17f60943848e378cc47774
Author: E.Chia <jzsherlock@163.com>
Date:   Wed Feb 7 15:15:13 2018 +0800revisioncommit 1e3633e565e6fd7d30991a47f98a118aca2946bc
Author: E.Chia <jzsherlock@163.com>
Date:   Tue Feb 6 23:43:34 2018 +0800readme 1.0 version
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
无文件要提交,干净的工作区
root@edogawachia-sphinx:/home/chia/mygit# git reset --mixed HEAD~
重置后取消暂存的变更:
M   readme.txt
root@edogawachia-sphinx:/home/chia/mygit# git status
位于分支 master
尚未暂存以备提交的变更:(使用 "git add <文件>..." 更新要提交的内容)(使用 "git checkout -- <文件>..." 丢弃工作区的改动)修改:     readme.txt修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

可以看出,hard之后的status是无文件提交工作区干净,说明三个区域保持一致;mixed之后是尚未暂存以备提交,说明暂存区和工作区不一样,soft之后status是要提交的变更,说明Git仓库和暂存区不一样。

HEAD~指的是HEAD的parent,就是上一个版本,HEAD~~是上两个,HEAD~10相当于HEAD后面有10个小波浪线。

git reset 版本号前几位

直接退到某个commit id的版本。

root@edogawachia-sphinx:/home/chia/mygit# git reflog
06034ac HEAD@{0}: commit: last version
440fc53 HEAD@{1}: reset: moving to HEAD~
3d8d645 HEAD@{2}: commit: another revision
440fc53 HEAD@{3}: reset: moving to 440fc
1d5928d HEAD@{4}: reset: moving to HEAD~
440fc53 HEAD@{5}: reset: moving to 440fc
1d5928d HEAD@{6}: reset: moving to HEAD~
440fc53 HEAD@{7}: commit: another modification
1d5928d HEAD@{8}: commit: revision
1e3633e HEAD@{9}: reset: moving to HEAD~
7b2ff8d HEAD@{10}: commit: added some sentence
1e3633e HEAD@{11}: commit (initial): readme 1.0 version

git reflog可以看每一次命令。

reference

https://git-scm.com/blog

https://git-scm.com/book/zh/v2

https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

2018/02/07 星期三 明天回家 15:45

生命只是一连串孤立的片刻。—— 马塞尔·普鲁斯特

Git 学习札记(二)安装git以及基本操作相关推荐

  1. git学习之Linux安装Git

    linux git liunx源码编译安装git liunx源码编译安装git 获取github最新的Git安装包下载链接,进入Linux服务器,执行下载,命令为: wget https://gith ...

  2. GIT学习(二)--Git分布式的好处

    分布式VS集中式(版本管理系统) 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器down下最新的版本,然后开始干活,干完活了,再把自己的活推 ...

  3. Git学习(一)git服务器的简易搭建

    Git学习(一)git服务器的简易搭建 使用环境:docker容器模拟的3个ubuntu14.04的系统 分别模拟了3个系统: Ubuntu_gitserver:14.04  用于git服务器的安装 ...

  4. Git 学习笔记:自定义Git(完)

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

  5. linux如何查看git安装路径,Git - 如何验证Ubuntu上是否安装Git以及在何处安装Git - Ubuntu问答...

    问题描述 我是Ubuntu和Git的新手.我如何验证我在我的机器上安装了git?当我尝试apt-get时,我得到了: root@ubuntu:/home/nebojsa# apt-get instal ...

  6. Git学习笔记(二)

    本文主要讲解分支管理 Git学习笔记(一) 目录 一.概念 二.创建与合并分支 2.1 简介 2.2 配图示例 2.3 命令小结 三.解决冲突 四.分支管理策略 五.Bug分支 5.1 stash功能 ...

  7. Git学习(2)Git 安装

    Windows 平台上安装 在 Windows 平台上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行: 安装包下载地址 ...

  8. 【Git学习笔记二】时光穿梭机

    版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢! 本文网址:https://blog.csdn.net/sun8112133/article/details/103888 ...

  9. windows下Git与GitHub的安装及建仓基本操作

    目录 1 安装Git(Git for Windows) 1.1 准备安装文件 1.2 安装 1.3 查看安装结果 1.4 配置Git 2 Git的简单使用 2.1 建仓 2.2 Git指令 2.3 版 ...

最新文章

  1. SharePoint SiteCollection 和SubWeb之间的迁移
  2. 用数据告诉你王思聪到底有多少钱?
  3. mysql count 类型_MYSQL的COUNT函数
  4. 五道java小题,补更四道java小题
  5. 免安装版的mysql步骤_mysql免安装版的安装方法及步骤
  6. Ubuntu系统下Python虚拟环境构建详解
  7. 新零售:从上云到云原生 Serverless
  8. 手把手教你用Jieba做中文分词
  9. 一起学JUCE之HashMap
  10. [Java工具] 邮件发送工具
  11. 离婚前一晚是什么心情呢?
  12. 美国道富java开发面试题_从事Java开发五年,面试9家拿到7家offer,1096面试+67笔试题...
  13. 简述linux开机启动进程,Linux系统启动流程简述
  14. hl3150cdn打印不了照片_如何在美国打印证件照片 (Passport Photos)?
  15. 一些基础的MySQL数据库操作语句
  16. oracle为表空间增加数据文件_只读数据文件损坏恢复实验记录
  17. 宝塔面板网站解决跨域问题
  18. Visual Studio 2015 介绍
  19. vue导出excel加一个进度条_使用vue导出excel文件
  20. STP 问题处理方法

热门文章

  1. 一、ts学习第一课:环境配置
  2. php mongodb 手册,mongodb技术手册 - Lamp资深讲师|lamp小强|linux|php|javascript - OSCHINA - 中文开源技术交流社区...
  3. ORACLE RMAN 备份策略及设置(Windows篇)
  4. Go语言格式化输出(fmt)
  5. python闭包的条件_python闭包
  6. Java学习的第七周之简单的SQL语句
  7. 华为Matex提前上市为哪般?
  8. 节流(Throttle)和防抖(Debounce)
  9. Java实现验证码验证功能
  10. 2022 年全国职业院校技能大赛高职组云计算赛项赛题解析-“私有云 赛项” 之 《私有云运维开发》!!超详细!