git入门(3.文件操作)

三、GIT文件操作

  版本控制就是对文件的版本控制,对于Linux来说,设备,目录等全是文件,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

文件状态

  GIT仓库所在的目录称为工作目录,这个很好理解,我们的工程就在这里,工作时也是在这里做修改。

  在工作目录中的文件被分为两种状态,一种是已跟踪状态(tracked),另一种是未跟踪状态(untracked)。只有处于已跟踪状态的文件才被纳入GIT的版本控制。如下图:

  

  当我们往工作目录添加一个文件的时候,这个文件默认是未跟踪状态的,我们肯定不希望编译生成的一大堆临时文件默认被跟踪还要我们每次手动将这些文件清除出去。用以下命令可以跟踪文件:

git add <file>

  上图中右边3个状态都是已跟踪状态,其中的灰色箭头只表示untracked<-->tracked的转换而不是untracked<-->unmodified的转换,新添加的文件肯定算是被修改过的。那么,staged状态又是什么呢?这就要搞清楚GIT的三个工作区域:本地数据(仓库)目录,工作目录,暂存区,如下图所示:

  

  git directory就是我们的本地仓库.git目录,里面保存了所有的版本信息等内容。

  working driectory,工作目录,就是我们的工作目录,其中包括未跟踪文件及已跟踪文件,而已跟踪文件都是从git directory取出来的文件的某一个版本或新跟踪的文件。

  staging area,暂存区,不对应一个具体目录,其时只是git directory中的一个特殊文件。

  当我们修改了一些文件后,要将其放入暂存区然后才能提交,每次提交时其实都是提交暂存区的文件到git仓库,然后清除暂存区。而checkout某一版本时,这一版本的文件就从git仓库取出来放到了我们的工作目录。

文件状态的查看

  那么,我们怎么知道当前工作目录的状态呢?哪些文件已被暂存?有哪些未跟踪的文件?哪些文件被修改了?所有这些只需要一个命令,git status,如下图所示:

  

  GIT在这一点做得很好,在输出每个文件状态的同时还说明了怎么操作,像上图就有怎么暂存、怎么跟踪文件、怎么取消暂存的说明。

文件暂存

  在上图中我们可以很清楚地看到,filea未跟踪,fileb已被暂存(changes to be committed),但是怎么还有一个fileb是modified但unstaged呢?这是因为当我们暂存一从此文件时,暂存的是那一文件当时的版本,当暂存后再次修改了这个文件后就会提示这个文件暂存后的修改是未被暂存的。

  接下来我们就看怎么暂存文件,其实也很简单,从上图中可以看到GIT已经提示我们了:use "git add <file>..." to update what will be committed,通过

git add <file>...

  就可以暂存文件,跟踪文件同样是这一个命令。在这个命令中可以使用glob模式匹配,比如"file[ab]",也可以使用"git add ."添加当前目录下的所有文件。

  取消暂存文件是

git reset HEAD <file>...

  若修改了一个文件想还原修改可用

git checkout -- <file>...

查看文件修改后的差异

  当我们修改过一些文件之后,我们可能想查看我们都修改了什么东西,用"git status"只能查看对哪些文件做了改动,如果要看改动了什么,可以用:

git diff

  比如下图:

  

  ---a表示修改之前的文件,+++b表示修改后的文件,上图表示在fileb的第一行后添加了一行"bb",原来文件的第一行扩展为了修改后的1、2行。

  但是,前面我们明明用"git status"看到filesb做了一些修改后暂存了,然后又修改了fileb,理应有两次修改的,怎么只有一个?

  因为"git diff"显示的是文件修改后还没有暂存起来的内容,那如果要比较暂存区的文件与之前已经提交过的文件呢,毕竟实际提交的是暂存区的内容,可以用以下命令:

  

  /dev/null表示之前没有提交过这一个文件,这是将是第一次提交,用:

git diff --staged

  是等效的,但GIT的版本要大于1.6.1。

  再次执行"git add"将覆盖暂存区的内容。

忽略一些文件

  如果有一些部件我们不想纳入版本控制,也不想在每次"git status"时看到这些文件的提示,或者很多时候我们为了方便会使用"git add ."添加所有修改的文件,这时就会添加上一些我们不想添加的文件,怎么忽略这些文件呢?

  GIT当然提供了方法,只需在主目录下建立".gitignore"文件,此文件有如下规则:

  • 所有以#开头的行会被忽略
  • 可以使用glob模式匹配
  • 匹配模式后跟反斜杠(/)表示要忽略的是目录
  • 如果不要忽略某模式的文件在模式前加"!"

  比如:

# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

移除文件

  当我们要删除一个文件时,我们可能就直接用GUI删除或者直接rm [file]了,但是看图:

  

  我们需要将文件添加到暂存区才能提交,而移除文件后是无法添加到暂存区的,那么怎么移除一个文件让GIT不再将其纳入版本控制呢?上图中GIT已经给出了说明:

git rm <file>...

  执行以上命令后提交就可以了,有时我们只是想将一些文件从版本控制中剔除出去,但仍保留这些文件在工作目录中,比如我们一不小心将编译生成的中间文件纳入了版本控制,想将其从版本控制中剔除出去但在工作目录中保留这些文件(不然再次编译可要花费更多时间了),这时只需要添加"--cached"参数。

  如果我们之前不是通过"git rm"删除了很多文件呢?比如说通过patch或者通过GUI,如果这些文件命名没有规则,一个一个地执行"git rm"会搞死人的,这时可以用以下命令:

  移动文件

  和移除文件一样,移动文件不可以通过GUI直接重命令或用"mv"命令,而是要用"git mv",不然同移除文件一样你会得到如下结果:

    

如果要重命名文件可以使用

git mv old_name new_name

  这个命令等效于

mv old_name new_name

git rm old_name

git add new_name

交互式暂存

  使用git add -i可以开启交互式暂存,如图所示,系统会列出一个功能菜单让选择将要执行的操作。

  移除所有未跟踪文件

git clean [options]  一般会加上参数-df,-d表示包含目录,-f表示强制清除。

储藏-Stashing

  可能会遇到这样的情况,你正在一个分支上进行一个特性的开发,或者一个Bug的修正,但是这时突然有其他的事情急需处理,这时该怎么办?不可能就在这个工作进行到一半的分支上一起处理,先把修改的Copy出去?太麻烦了。这种情况下就要用到Stashing了。假如我们现在的工作目录是这样子的

$ git status

# On branch master

# Changes to be committed:

#

(use "git reset HEAD <file>..." to unstage)

#

#

modified:

index.html

#

# Changed but not updated:

#

(use "git add <file>..." to update what will be committed)

#

#

modified:

lib/simplegit.rb

  此时如果想切换分支就可以执行以下命令

$ git stash

Saved working directory and index state \

"WIP on master: 049d078 added the index file"

HEAD is now at 049d078 added the index file

(To restore them type "git stash apply")

  这时你会发现你的工作目录变得很干净了,就可以随意切分支进行其他事情的处理了。

  我们可能不只一次进行"git stash",通过以下命令可以查看所有stash列表

$ git stash list

[email protected]{0}: WIP on master: 049d078 added the index file

[email protected]{1}: WIP on master: c264051... Revert "added file_size"

  当紧急事情处理完了,需要重新回来这里进行原来的工作时,只需把Stash区域的内容取出来应用到当前工作目录就行,命令就是

git stash apply

  如果不基参数就应用最新的stash,或者可以指定stash的名字,如:[email protected]{1},可能通过

git stash show

  显示stash的内容具体是什么,同git stash apply一样,可以选择指定stash的名字。

  git stash apply之后再git stash list会发现,apply后的stash还在stash列表中,如果要将其从stash列表中删除可以用

git stash drop

  丢弃这个stash,stash的命令参数都可选择指定stash名字,否则就是最新的stash。

  一般情况下apply stash后应该就可以把它从stash列表删除了,先apply再drop还是比较繁琐的,使用以下一条命令就可以同时完成这两个操作

git stash pop

  如果我们执行git stash时工作目录的状态是部分文件已经加入了暂存区,部分文件没有,当我们执行git stash apply之后会发现所有文件都变成了未暂存的,如果想维持原来的样子操持原来暂存的文件仍然是暂存状态,可以加上--index参数

git stash apply --index

  还有这么一种情况,我们把原来的修改stash了,然后修复了其他一些东西并进行了提交,但是,这些提交的文件有些在之前已经被stash了,那么git stash apply时就很可能会遇到冲突,这种情况下就可以在stash时所以提交的基础上新建一个分支,然后再apply stash,当然,这两个步骤有一人简单的完成方法

git stash branch <branch name>

时间: 2024-12-28 00:41:44

git入门(3.文件操作)的相关文章

【Git入门之四】操作项目

[Git入门之四]操作项目 - JackyStudio - 博客频道 - CSDN.NET 1.查看操作日记 <git log>用于查看操作日记详情.因为Git是分布式的,采用SHA1这样的版本号可有效的防止版本冲突. [cpp]?view plaincopy ? #查看操作日记,底下那串长长的数据就是SHA1?ID,表示当前版本号?? $Snbsp;git?log?? commit?aea0365712908805bc28540b4db9fd2f15360a8b?? Author:?Jack

小猿圈python入门之文件操作

学习知识要善于思考,思考,再思(考).我就是靠这个方法成为科学家的.——爱因斯坦 open() 方法 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. 注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法. open() 函数常用形式是接收两个参数:文件名(file)和模式(mode). 一般用法:open(file,mode="r") 完整的语法格式

Nginx基础入门之文件操作优化及请求特殊处理介绍

本节的内容主要讲到关于nginx文件操作优化以及对客户端请求特殊处理(比如限速,不合法请求处理,是否注明nginx版本号) 一.通过nginx对客户端相关请求做特殊处理 1.1 按HTTP方法名限制用户请求 语法:limit_except method ... {...} 配置块:location Nginx通过limit_except后面指定的方法名来限制用户请求.方法名可取值包括:GET.HEAD.POST.PUT.DELETE.MKCOL.COPY.MOVE.OPTIONS.PROPFIN

git入门篇-----本地操作

一 ,git的简介 1 ,git的历史 概念性的知识,大家百度一下,就会出现好多优秀的文章供参考,这里我就不多说了. 如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了. 2,集中式vs分布式 CVS及SVN--------集中式的版本控制系统 Git          -------- 分布式版本控制系统 区别: 集中式的版本控制:版本库在中央服务器上,连接服务器进行check和commit操作(前提网速必须可以,要不然提交一段代码,就得等好长时间.

git 命令删除文件操作

在github上只能删除仓库,却无法删除文件夹或文件, 所以只能通过命令来解决 1.添加文件并提交命令 2.推送到git服务器命令 3.删除文件并提交命令 4.推送到git服务器 查看下git 是否存在test.txt文件 原文地址:https://www.cnblogs.com/zoro-zero/p/10943573.html

git入门(1.历史)

git入门(1.历史) git入门(2.基础) git入门(3.文件操作) git入门(4.提交与历史) git入门(5.分支) git入门(6.repo) 版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文件,保存文件副本.有时候偷懒省事,保存副本时命名比较随意,时间长了就不知道哪个是新的,哪个是老的了,即使知道新旧,可能也不知道每个版本是什么内

git 入门操作指令

git add [commit file list] 将已经修改的代码添加索引 git commit -m [commit message] 将已经索引的代码修改提交至本地的库 git push origin [branch_name] 将分支 branch_name 的代码推送至服务器 git pull origin [branch_name] 获取分支 branch_name上的最新代码 git pull --rebase origin [branch_name] 将当前 branch 从

git 入门操作

从已有的GIT仓库获取最新代码 git clone url 建立本地仓库,并提交至git-hub 生成ssh的公钥私钥对:ssh-keygen 从pc端打开生成的公钥,id_rsa.pub,复制并黏贴至git-hub的ssh-keys cd至程序文件夹,输入 git init 然后输入git add .(.代表所有文件也可以输入具体的单个文件名) 然后输入git commit -m “任意注释” 创建一个remote git remote add origin url(ssh.https.sub

C语言入门(二十五)文件操作

文件操作  一.标准文件的读写 1.文件的打开fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char *f