http://www.cnblogs.com/angeldevil/p/3238470.html
记录版本信息的方式主要有两种:
- 记录文件每个版本的快照
- 记录文件每个版本之间的差异
GIT采用第一种方式。像Subversion和Perforce等版本控制系统都是记录文件每个版本之间的差异,这就需要对比文件两版本之间的具体差异,但是GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
git directory(repository)就是我们的本地仓库.git目录,里面保存了所有的版本信息等内容。
checkout某一版本时,这一版本的文件就从git仓库取出来放到了我们的工作目录。
检出某一分支或某一提交是同一个命令
git checkout <branch-name> | <commit>
删除文件
我们需要将文件添加到暂存区才能提交,而移除文件后是无法添加到暂存区的,那么怎么移除一个文件让GIT不再将其纳入版本控制呢?
有时我们只是想将一些文件从版本控制中剔除出去,但仍保留这些文件在工作目录中,比如我们一不小心将编译生成的中间文件纳入了版本控制,想将其从版本控制中剔除出去但在工作目录中保留这些文件(不然再次编译可要花费更多时间了),这时只需要添加"--cached"参数。
git rm -r --cached dirToRemove
处在git管理下的文件就始终用git来管理它(删除,重命名之类的操作)
git rm $(git ls-files --deleted)
======================
git mv old_name new_name
以上命令等价于
mv old_name new_name
git rm old_name
git add new_name
git-clean - Remove untracked files from the working tree
git clean -df
$ git stash
git stash list
git stash apply
git stash show
git stash drop
般情况下apply stash后应该就可以把它从stash列表删除了,先apply再drop还是比较繁琐的,使用以下一条命令就可以同时完成这两个操作
git stash pop
如果我们执行git stash时工作目录的状态是部分文件已经加入了暂存区,部分文件没有,当我们执行git stash apply之后会发现所有文件都变成了未暂存的,如果想维持原来的样子操持原来暂存的文件仍然是暂存状态,可以加上--index参数
git stash apply --index
git stash branch <branch name>
git commit --amend
git revert <commit-id>
git reset会修改HEAD到指定的状态,用法为git reset [options] <commitid>
这条命令会使HEAD提向指定的Commit,一般会用到3个参数,这3个参数会影响到工作区与暂存区中的修改:
- --soft: 只改变HEAD的State,不更改工作区与暂存区的内容
- --mixed(默认): 撤销暂存区的修改,暂存区的修改会转移到工作区
- --hard: 撤销工作区与暂存区的修改
当与别人和作开发时,会向别人贡献代码或者接收别人贡献的代码,有时候可能不想完全Merge别人贡献的代码,只想要其中的某一个提交,这时就可以使用cherry-pick了。就一个命令
git cherry-pick <commit-id>
filter-branch
这条命令可以修改整个历史,如从所有历史中删除某个文件相关的信息,全局性地更换电子邮件地址。
GIT对象
每个对象(object) 包括三个部分:类型,大小和内容。大小就是指内容的大小,内容取决于对象的类型,有四种类型的对象:"blob"、"tree"、 "commit" 和"tag"。
- “blob”用来存储文件数据,通常是一个文件。
- “tree”有点像一个目录,它管理一些“tree”或是 “blob”(就像文件和子目录)
- 一个“commit”指向一个"tree",它用来标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如提交时间、提交说明、作者、提交者、指向上次提交(commits)的指针等等。
- 一个“tag”是来标记某一个提交(commit) 的方法。
比如说我们执行了以下代码进行了一次提交:
$ git add README test.rb LICENSE2
$ git commit -m 'initial commit of my project'
现在,Git 仓库中有五个对象:三个表示文件快照内容的 blob 对象;一个记录着目录树内容及其中各个文件对应 blob 对象索引的 tree 对象;以及一个包含指向 tree 对象(根目录)的索引和其他提交信息元数据的 commit 对象。概念上来说,仓库中的各个对象保存的数据和相互关系看起来如下图:
如果进行多次提交,仓库的历史会像这样:
有两种方法将一个分支的改动合并进另一个分支,一个就是前面所说的分支合并,另一个就是分支衍合
git tag <tag_name>
git tag -a <tag_name> -m "<tag_description>"
一、获得GIT仓库
有两种获得GIT仓库的方法,一是在需要用GIT管理的项目的根目录执行:
git init
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout:
git clone <url>
在工作目录中的文件被分为两种状态,一种是已跟踪状态(tracked),另一种是未跟踪状态(untracked)。只有处于已跟踪状态的文件才被纳入GIT的版本控制。
List files which are and are not under version control
This page was created on Sun Aug 14 2011 and last changed on Sat Nov 21 2015.
To get a list of all the files which are under version control,
git ls-files
To list the files in or under the current directory which are not under version control, which are deliberately being ignored using .gitignore
, for example object (*.o
) files, use
git ls-files --others --ignored --exclude-from=.gitignore
or
git clean -Xn
See Show ignored files in git.