我们需要将文件添加到暂存区才能提交,而移除文件后是无法添加到暂存区的,那么怎么移除一个文件让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_namegit rm old_namegit 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 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丢弃这个stashstash的命令参数都可选择指定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四、提交与历史了解了文件的状态我们对文件进行了必要的修改后就要把我们所做的修改放入版本库了这样以后我们就可以在需要的时候恢复到现在的版本而要恢复到某一版一般需要查看版本的历史。提交提交很简单直接执行git commit。执行git commit后会调用默认的或我们设置的编译器要我们填写提示说明但是提交说明最好按GIT要求填写第一行填简单说明隔一行填写详细说明。因为第一行在一些情况下会被提取使用比如查看简短提交历史或向别人提交补丁所以字符数不应太多40为好。下面看一下查看提交历史。查看提交历史查看提交历史使用如下图的命令如图所示显示了作者作者邮箱提交说明与提交时间git log可以使用放多参数比如仅显示最新的1个log用-n表示。显示简单的SHA-1值与简单提交说明oneline仅显示提交说明的第一行所以第一行说明最好简单点方便在一行显示。git log --graph以图形化的方式显示提交历史的关系这就可以方便地查看提交历史的分支信息当然是控制台用字符画出来的图形。git log的更多参数可以查看命令帮助。不经过暂存的提交如果我们想跳过暂存区直接提交修改的文件可以使用-a参数但要慎重别一不小心提交了不想提交的文件git commit -a如果需要快捷地填写提交说明可使用-m参数git commit -m commit message修订提交如果我们提交过后发现有个文件改错了或者只是想修改提交说明这时可以对相应文件做出修改将修改过的文件通过git add添加到暂存区然后执行以下命令git commit --amend然后修改提交说明覆盖上次提交但只能重写最后一次提交。重排提交通过衍合(rebase)可以修改多个提交的说明并可以重排提交历史拆分、合并提交关于rebase在讲到分支时再说这里先看一下重排提交。假设我们的提交历史是这样的如果我们想重排最后两个提交的提交历史可以借助交互式rebase命令git rebase -i HEAD~2 或 git rebase -i 3366e1123010e7d67620ff86040a061ae76de0c8HEAD~2表示倒数第三个提交这条命令要指定要重排的最旧的提交的父提交此处要重排Second commit与Third commit所以要指定Initial commit的Commit ID。如图所示注释部分详细说明了每个选项的作用如果我们想交互这两个提交只需把开头的这两行交换下位置就OK了交换位置后保存然后看下提交历史可以看到提交历史已经变了而且最新的两个提交的Commit ID变了如果这些提交已经push到了远程服务器就不要用这个命令了。删除提交与修改提交说明如果要删除某个提交只需要删除相应的行就可以了而要修改某个提交的提交说明的话只需要把相应行的pick改为reward。合并提交-squashing合并提交也很简单从注释中的说明看只需要把相应的行的pick改为squash就可以把这个提交全并到它上一行的提交中。拆分提交至于拆分提交由于Git不可能知道你要做哪里把某一提交拆分开把以我们就需要让Git在需要拆分的提交处停下来由我们手动修改提交这时要把pick改为edit这样Git在处理到这个提交时会停下来此时我们就可以进行相应的修改并多次提交来拆分提交。撤销提交