t-bruce-yu

SVN确实是一个很不错的版本控制工具。我也觉得用起来十分的方便~但是不一定每个人都有svn服务器可以拿来使用~所以我就来学了学大名鼎鼎的git(傻瓜内容跟踪器)它是一款分布式的版本管理控制工具。它不需要专门的服务器即可进行大型项目的合作开发。现在的好多大型项目都改用了git作为版本控制工具。比如android,Linux内核。我也是今天才开始真正的使用这个强大的工具。不过我主要是用来自己跟踪自己的版本的~呵呵。速度极其的快.下面结合SVN来进行git的使用说明
首先创建代码仓库这里我建立了一个temp目录来做实验
mkdir temp
cd temp
现在执行
git init命令创建代码仓库可以发现,git创建了一个.git的目录。这个目录就是仓库啦~
这里我建立了2个实验用的文件来进行操作
echo "1" > 1.c
echo"2" > 2.c
然后

git add 1.c 2.c

 这个操作跟SVN的svn add一样的功能。要commit上去之前,必须要先add
现在我们

git commit -m "The First version"

 现在git log 一下,是不是就看到了提交成功,创建了node的字样??
好了,现在我们

git log

 一下,明显的看到这个版本创建好了~在GIT里面,版本号全部都是以md5的HASH码标识的。我的如下所示

yutao@yutao-ThinkPad:/mytemp/test$ git log
commit 11eb1fb71cfa2d6ac82a4541d78e7e8ead623fa7
Author: yutao <YUTAO@YUTAO-THINKPAD.(NONE)>
Date: Sun Nov 6 16:43:02 2011 +0800

The First version

 要查看当前所在的版本,可以使用git show命令。
好了~这里开始进一步说怎么控制了~
我把我的2.c里面写了一些东西进去我这样写了一点东西

#include 
int main(int argc, char *argv[])
{
printf("%s", __FILE__);

return 0;
}

 好了。保存
现在我们使用git diff 命令查看修改。一目了然吧~呵呵
然后提交我们的代码
git commit -m "The second vesion" -a
这里我们加了一个-a参数,是因为我们修改了一次2.c文件,这里跟SVN有点不同~每一个修改都要git add 一下~最后才能直接commit。但是如果我们加上了一个-a,GIT就默认了所有文件都直接commit啦~~
好了~第二个节点创建好咯git log一下~呵呵如果我们git show一下,还能看到这个版本跟以前版本的修改~~
这里我们示范下怎么控制的。比如我不小心执行了rm 2.c这个命令。这个文件就被删除了~在SVN里面,我们可以直接svn update把这个文件修复回来~
git有点不同~要git checkout 2.c才能恢复回来。但是如果我们删除的文件特别多咋办呢?别担心。
git ls-files --deleted可以显示出被删除的文件名。所以我构造了一个命令,恢复所有被删除的文件

git ls-files --deleted | xargs git checkout

 对Linux熟悉的人应该明白xargs是把前面的流作为后面命令的参数的意思~
SVN都可以检出一个特定版本的项目文件。git也是可以不然版本控制个P啊??

git checkout md5number

 后面的md5number是我们那么版本的号码。当我们输入这个命令,git会出现一些警告信息。大致意思是说我们现在是在无分支的情况下的。git最经典的地方就是它的分支这个概念。稍后继续会说道
反正现在我们的2.c又是2了~效果是看到了撒~~但是要注意一下,我们现在git log会发现我们现在只有第一个version。第二个不见了。。那就是因为git新创建了一个分支。。。分支这个概念可以理解为一个用户吧~
好了~继续讲
基本这样,我们的基本使用是可以OK了~接着刚才的问题讲。
我们现在要回到刚才的那个最高的版本。
git checkout master
为什么是master呢?是因为git是一个分布式的代码管理器,强大的就是可以把所有的分支拿来merge(组合)。对于每一个用户,都是一个分支,所以。创建项目仓库的第一个分支就是一个叫master的用户(分支)。可以执行
git branch命令来看到这个项目中的所有分支。前面有个"*"的就是当前我们项目处在的分支位置。我们继续说。刚才我们checkout 到了那个指定的md5number版本。在那个时候,如果我们git branch一下,就是下面这个样子
* (no branch)
master
基本有点明白了吧?呵呵。每一个分支,我们完全可以看成不同的用户。
另外。再讲一个命令。就是reset和revert。
git reset这个操作可以让自己的操作回滚。(不可修复的)
reset操作有3种模式。
--mixed  仅是重置索引的位置,而不改变你的工作树中的任何东西(即,文件中的所有变化都会被保留,也不标记他们为待提交状态),并且提示什么内容还没有被更新了。这个是默认的选项。   
--soft  既不触动索引的位置,也不改变工作树中的任何内容,我们只是要求这些内容成为一份好的内容(之后才成为真正的提交内容)。这个选项使你可以将已经提交的东西重新逆转至“已更新但未提交(Updated but not Check in)”的状态。就像已经执行过 git update-index 命令,但是还没有执行 git commit 命令一样。   
--hard  将工作树中的内容和头索引都切换至指定的版本位置中,也就是说自 之后的所有的跟踪内容和工作树中的内容都会全部丢失。因此,这个选项要慎用,除非你已经非常确定你的确不想再看到那些东西了。
具体怎么用。你懂的……但是linus本人给的文档是建议少用reset,除非你确定你要回滚。前面的是传错误了的。。。
所以我们一般用revert是最好的,revert会重新commit一个最新的版本。但是会把指定版本的那些文件全部回复成为那个文件的版本的样子。可能没怎么说清楚,看下面操作。
为了实验我们的操作。
我这里首先确定我现在的版本是第二个,也就是The Second vesion这个日志那里

假设我们的第二个版本的MD5值是 b44b94bf1253fe593e963e2e3e72b331f7b4e327(我机器上确实也是这个值)
好了。我先创建了一个3.c这个文件。
然后git commit -m " the third version" -a
好了。第三个版本库创建成功
现在,我们要让当前的工程回复到第二个版本
直接 git revert b44b94b(只要你给的这个hash值能够唯一对应一个版本的md5值的头几位,就OK了~所以这里我没有给全,另外就是要保证当前的修改是commit了的。不然要报错) ,然后它会自动commit成为一个新的节点(版本)然后就发现我们现在的项目就已经成为了第二个项目的样子了,3.c也不见了2.c也变成了2
但是,如果我们想保留3.c,让其他文件变成指定版本的。可以加一个-n参数~这个参数是不commit的意思~~所以就把自己在里面的那些文件都给保留下来了~今天先就写这么点~回去吃饭了~以后再讲merge操作了~这个才是git真正的精髓~当然,我们自己用的话,就只用前面的那些就足够了~~呵呵

分类:

技术点:

相关文章:

  • 2021-08-27
  • 2021-11-04
  • 2021-09-03
  • 2021-11-04
  • 2021-10-31
  • 2021-11-04
  • 2021-11-04
  • 2021-11-04
猜你喜欢
  • 2017-12-10
  • 2021-11-04
  • 2021-11-04
  • 2021-11-02
  • 2021-08-12
  • 2021-07-19
  • 2018-07-10
相关资源
相似解决方案