博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

git 杂乱

Posted on 2015-08-28 17:29  bw_0927  阅读(176)  评论(0)    收藏  举报

http://www.cnblogs.com/angeldevil/p/3238470.html

 

记录版本信息的方式主要有两种:

  1. 记录文件每个版本的快照
  2. 记录文件每个版本之间的差异

  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.