git原理浅析及命令介绍

状态描述

请记住,工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。

在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。

如果此时新添加一个文件,那么它并不在git监管之下,属于未追踪的。使用add可以将文件纳入到暂存之下。这时候使用git commit会将暂存之下的修改提交,这个时候即使有修改,但是没有git add过,那么commit之后,git也不会存在它的快照。所以,要想将文件修改添加到本地仓库中,需要先add,然后再commit。当然,这样有点繁琐,可以直接使用git commit -a命令将工作目录中的修改保存到本地仓库中。

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为
.gitignore 的文件,列出要忽略的文件模式。

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用
git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。)

请注意,单单 git diff 不过是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异。所以有时候你一下子暂存了所有更新过的文件后,运行
git diff 后却什么也没有,就是这个原因。

文件提交

git commit -m "Story 182: Fix benchmarks for speed"

可以提交暂存的修改。

git commit -a -m ‘added new benchmarks‘

上面的命令加了a参数,可以将工作目录中的修改直接提交,等同于跳过了add过程。

移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit” 部分(也就是未暂存清单)看到。

然后再运行 git rm 记录此次移除文件的操作 git rm filename

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆
.a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用
--cached
选项即可

git rm --cached readme.txt

移动文件

要在 Git 中对文件改名,可以这么做:

git mv file_from file_to

其实,运行 git mv 就相当于运行了下面三条命令:

mv README.txt README
git rm README.txt
git add README

查看提交历史

git log

git log 有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。

git log -p -2

我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新.

某些时候,单词层面的对比,比行层面的对比,更加容易观察。Git 提供了 --word-diff 选项。我们可以将其添加到
git log -p
命令的后面,从而获取单词层面上的对比。在程序代码中进行单词层面的对比常常是没什么用的。不过当你需要在书籍、论文这种很大的文本文件上进行对比的时候,这个功能就显出用武之地了。

新增加的单词被 {+ +} 括起来,被删除的单词被 [- -] 括起来。在进行单词层面的对比的时候,你可能希望上下文( context )行数从默认的 3 行,减为 1 行,那么可以使用
-U1 选项。

还有个常用的 --pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用 oneline 将每个提交放在一行显示,这在提交数很大时非常有用。

以上只是简单介绍了一些 git log 命令支持的选项。表 2-2 还列出了一些其他常用的选项及其释义。

时间: 2024-12-16 03:43:11

git原理浅析及命令介绍的相关文章

GIT原理和常用命令速成

[原创,2018-03-16,15:33:49] 刚开始学习GIT的时候,以为只要掌握几个基本的操作指令就万事大吉了.但是随着GIT使用的深入,如果不了解些原理就会遇到各种各样让人一脸懵逼的问题,所以还是要对GIT原理有一些基本了解,这里默认已经掌握常用的基本指令了.(随便搜教程看下就行,例如clone pull push add commit log reset status branch checkout差不多吧,文末也会记录一些常用命令) ps. 文中列举了许多英文单词,因为在外文手册和h

【Spark Core】TaskScheduler源码与任务提交原理浅析2

引言 上一节<TaskScheduler源码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源码浅析>中的submitMissingTasks函数继续介绍task的创建和分发工作. DAGScheduler中的submitMissingTasks函数 如果一个Stage的所有的parent stage都已经计算完成或者存在于cache中,那么他会调用submitMissingTasks来提交该Stage所包含的Tas

【Spark Core】TaskScheduler源代码与任务提交原理浅析2

引言 上一节<TaskScheduler源代码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源代码浅析>中的submitMissingTasks函数继续介绍task的创建和分发工作. DAGScheduler中的submitMissingTasks函数 假设一个Stage的全部的parent stage都已经计算完毕或者存在于cache中.那么他会调用submitMissingTasks来提交该Stage所包括的T

Git常用命令介绍

Git分布式版本控制系统,非常流弊的一个版本管理系统,此博文介绍下git常用的命令,适用于不会Git版本控制的菜鸟,对于维护Git服务器的大牛来说,跪求指教,其实我也是菜鸟. Git是被压迫出来的产物,因为BitMover公司收回了版本控制系统BitKeeper对linux社区免费使用的权限,而linux的开发迫切需要一个好的分布式版本控制系统,我们心高气傲的linux之父linus不愿意向BitMover低头付费,一生气就花了不到一个月的时间用自己的C写出了现在最流行的分布式版本控制系统git

git各种命令介绍以及碰到的各种坑

一.各种命令介绍: git pull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'git pull origin master'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update git add:是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如'git add app/model/user.rb'就会增加app/model/user.rb文件到

Git基础(常用命令)介绍

版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统. 关于版本控制分为三种:本地版本控制系统,如rcs:集中化的版本控制系统,如CVS.SVN:分布式版本控制系统,如Git. Git基础要点 Git和其它版本控制系统的主要差别在于:Git只关心文件数据的整体是否发生变化,而大多数其它系统则只关心文件内容的具体差异. 对于任何一个文件,在Git内都只有三种状态:已提交(committed).已修改(modified)和已暂存(staged).已提交表示该文件已经被安全地保存在本

git plumbing 更加底层命令解析-深入理解GIT

原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目repo有一个深入的理解. 除非你想通读Git源代码,你可能永远没有必要使用下面的命令.但是通过手工的操作一个repo将会让你对于GIT如何保存数据的概念细节有个深入理解,你也将对于git是如何工作的有更好的理解. 我们首先来检阅Git的object database,然后我们使用git的低级命令手工

Handler原理浅析

    理解Handler的原理首先要搞清楚什么是Looper,在我的上一篇博文中对此有专门的介绍.Looper的作用是开启一个消息循环,从MessageQueue(Message队列,是Looper的成员变量)中循环取出消息处理.一个线程要使用Handler来处理来自其它线程的消息,这个线程必须有且仅有一个Looper对象与之绑定,也可以说一个Looper对象是是与一个线程一一对应的. Hander有一个Looper类型的成员,在Handler的构造函数(new Handler()或者new

git常用的一些命令总结

git常用的一些命令总结 git init 创建一个版本库 git add file 将文件从工作区提交到暂存区 git commit -m "blabla--" 将文件中暂存区提交到仓库 git status 查看仓库当前的状态 git diff 可以查看具体修改了哪些内容 git log 查看我们提交的历史记录 git log –pretty=oneline #输出少量版本信息和提交的内容 git reset –hard HEAD^ #返回上一个版本 cat filename #查