git入门(3.文件操作)

简介:

三、GIT文件操作

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

文件状态

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

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

  image2015-8-18%2010%3A6%3A7.png?version=

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

git add <file>

  上图中右边3个状态都是已跟踪状态,其中的灰色箭头只表示untracked<-->tracked的转换而不是

untracked<-->unmodified的转换,新添加的文件肯定算是被修改过的。那么,staged状态又是什么呢?这就要搞清楚GIT的三个工作区域:本地数据(仓库)目录,工作目录,暂存区,如下图所示:

  image2015-8-18%2010%3A6%3A26.png?version

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

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

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

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

文件状态的查看

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

image2015-8-18%2010%3A6%3A59.png?version  

  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

  比如下图:

  image2015-8-18%2010%3A7%3A33.png?version

 

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

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

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

  image2015-8-18%2010%3A8%3A26.png?version

  /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]了,但是看图:

  image2015-8-18%2010%3A9%3A55.png?version

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

git rm <file>...

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

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

  image2015-8-18%2010%3A10%3A21.png?versio移动文件

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

  image2015-8-18%2010%3A10%3A40.png?versio  

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

git mv old_name new_name

  这个命令等效于

mv old_name new_name

git rm old_name

git add new_name

交互式暂存

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

  image2015-8-18%2010%3A11%3A20.png?versio移除所有未跟踪文件

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

stash@{0}: WIP on master: 049d078 added the index file

stash@{1}: WIP on master: c264051... Revert "added file_size"

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

git stash apply

  如果不基参数就应用最新的stash,或者可以指定stash的名字,如:stash@{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>




      本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1878594,如需转载请自行联系原作者



相关文章
|
4天前
|
缓存 Java Shell
[Git]入门及其常用命令
本文介绍了 Git 的基本概念和常用命令,包括配置、分支管理、日志查看、版本回退等。特别讲解了如何部分拉取代码、暂存代码、删除日志等特殊需求的操作。通过实例和图解,帮助读者更好地理解和使用 Git。文章强调了 Git 的细节和注意事项,适合初学者和有一定基础的开发者参考。
20 1
[Git]入门及其常用命令
|
27天前
|
Shell 开发工具 git
git学习三:git使用:删除仓库,删除仓库内文件
通过GitHub的设置页面删除仓库,以及如何使用Git命令行删除仓库中的文件或文件夹。
118 1
git学习三:git使用:删除仓库,删除仓库内文件
|
27天前
|
开发工具 git 索引
git上面中新建gitignore文件,并且去除已经在仓库版本管理中的文件夹
git上面中新建gitignore文件,并且去除已经在仓库版本管理中的文件夹
48 4
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
34 1
|
6月前
|
开发工具 git
如何使git提交的时候忽略一些特殊文件?
如何使git提交的时候忽略一些特殊文件?
|
3月前
|
缓存 开发工具 git
给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件
本文介绍了如何为Git仓库添加`.gitignore`文件来排除不需要跟踪的临时文件,并展示了如何删除已经被提交的临时文件缓存,以清理Git仓库中的不必要文件。
240 0
给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件
|
3月前
|
开发工具 git iOS开发
服务器配置Huggingface并git clone模型和文件
该博客提供了在服务器上配置Huggingface、安装必要的工具(如git-lfs和huggingface_hub库)、登录Huggingface以及使用git clone命令克隆模型和文件的详细步骤。
264 1
|
3月前
|
存储 Shell 开发工具
Git 入门:从零开始掌握版本控制的艺术
【8月更文第16天】 在软件开发中,版本控制是一项至关重要的技能。它帮助开发者追踪文件的变化历史,并且可以在多个开发者之间协同工作。Git 是目前最流行的分布式版本控制系统之一。本文将带你从零开始学习 Git 的基本使用方法。
61 0
|
4月前
|
开发工具 git
git如何不上传指定的文件或文件夹
【7月更文挑战第9天】平时写代码的时候有很多测试文件或者静态文件,没必要上传到git上,不仅占资源更新还麻烦,以下介绍如何忽略不需要上传的文件或文件夹。
374 8
|
4月前
|
存储 安全 开发工具
Git学习笔记 三个区域、文件状态、分支、常用命令
理解并掌握这些概念和命令,对于有效地使用Git来管理项目源代码是至关重要的。Git的强大功能支持了复杂的开发工作流程,而良好的Git实践能够极大地提高团队的协作效率。随着实践的增多,对于Git更深层次的功能和最佳实践的理解也会随之增长,进一步加强你作为一个软件开发者的能力。
68 0