Git学习(1)

        part1-->

        什么是版本控制,在这里我就不多说了。GIT是属于分布式版本控制系统,分布式版本控制系统( Distributed Version Control System,简称 DVCS ),在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份

        GIT和其他版本控制系统的差别在于,GIT直接记录的是文件的快照,而非差异比较。GIT关心的是文件数据整体是否发生变化,而大多数系统则关心的是文件内容的具体差异。GIT把变化的文件做快照后记录在一个微型的文件系统中。每次提交更新后,它会浏览一遍所有文件的指纹信息而对文件作一快照,然后保存一个指向该文件快照的一个索引。另外,若文件没有变化,GIT不会再次保存,而只对上次保存的快照做一个链接。

                        

        GIT和其他版本控制相比,可以只访问本地资源而不需要联网。在断网的情况下,可以实现代码的本地提交。在保存GIT文件前,GIT会对所有进行的内容进行校对和计算,并将此结果作为数据的唯一标志和索引。主要用到哈希算法。GIT的大多操作都是把数据添加到数据库,因为任何一种不可逆的操作(如删除),都会使回退或重现历史版本变得困难重重,在GIT里,一旦提交快照之后就不用担心丢失数据,所以要定期推送到数据仓库。

        GIT在管理项目时,主要有三个工作区域:GIT工作目录,暂存区域以及本地仓库。这对应者GIT内的三种状态:已修改,以暂存,已提交。基本的工作流程是:1.在工作目录中修改某些文件。2.对修改后的文件进行快照,保存到暂存区域。3.提交更新,将保存在暂存区域的文件快照永久转储到GIT目录中。

                        

        GIT的安装在这里就不说啦,GIT包的url在giturb上面 http://git-scm.com/download

        GIT提供了一个git config工具,用来配置环境变量。

    ●/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用--system 选项,读写的就是这个文件。

●~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用--global 选项,读写的就是这个文件。

●当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config 里的配置会覆盖/etc/gitconfig 中的同名变量。

        配置用户信息,个人的用户名称和电子邮箱。git config ..可以利用git init 建立新的项目。

        $ git config --global user.name "lgm"

    $ git config --global user.email [email protected]

    要检查已有的配置信息,可以使用 git config --list 命令。有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。

也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:


$ git config user.name AiLovcoding

如果要获取帮助,可以使用 git help || git || man git-


    part2--->git的一些命令

     在工作目录中初始化新仓库,git init  初始化后当前目录下出现一个名为.git的目录,所有git需要的数据和资源都存放在这个目录中。

        如果想将文件纳入版本控制,git add 命令可以实现文件的跟踪。

        从现有的仓库跟踪,git clone [url]  如果想重命名download下来的文件,可以git clone [url]  rename

        git支持很多的数据传输协议,git://协议。也可以用 http(s)://  || user@server :path.git表示的SSH传输协议。

        GIT工作目录下的文件不外乎两种类型:已跟踪和未跟踪。已跟踪文件是指被纳入版本控制管理的文件,在上次快照中有他们的记录,工作一段时间之后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有的其他文件都属于未跟踪的文件,他们既没有上次更新的快照,也不在当前的暂存区域,初次克隆某个仓库时,工作目录中的所有文件都属于跟踪文件,且状态为未修改。在编辑某些文件之后,git把这些文件的状态标为修改,我们逐步把这些修改的文件放到暂存区域,直到最后一次性的提交所有这些暂存起来的文件。

            

 

git status :用于检查当前文件的状态

git add: 用于提交修改的文件到暂存中

cat .gitignore *.[oa]  / *~   :忽略以.o或.a结尾的文件/以~结尾的文件。一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

这里了解下文件.gitignore的格式规范:

    ● 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。

● 可以使用标准的 glob 模式匹配。 * 匹配模式最后跟反斜杠(/)说明要忽略的是目录。 * 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。

.gitignore的例子: 

            *.a:忽略所有.a结尾的文件

            !lib.a :但lib.a除外 

             /TODO:仅仅忽略项目跟目录下的TODO文件

            build/:忽略build/目录下的所有文件

            doc /*.txt:会忽略 doc/notes.txt 但不会忽略doc/server/arth.txt

git diff:  查看尚未暂存的文件更新了哪里下此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

请注意,单单 git diff 不过是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异。git diff --cached 则是显示这次工作和上次提交之间的差异。所以有时候你一下子暂存了所有更新过的文件后,运行git diff 后却什么也没有,就是这个原因。

git commit:提交更新.  这种方式会启动文本编辑器以便输入本次提交的说明。(默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。当然也可以按照第一章介绍的方式,使用git config --global core.editor  emacs命令设定你喜欢的编辑软件。)

git commit -m 后加上提交时的附加信息。提交后会显示多少文件修改过,多少行添改过和删改过。如:1 file changed, 2 insertions(+), 1 deletion(-)....

记住,提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

git commit -a -m:尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit 加上-a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤.

git rm:要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。

git rm某个文件,提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆.a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可:git rm --cached readme.txt

git rm log/\*.log: 注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜 杠。)。此命令删除所有log/ 目录下扩展名为 .log 的文件。类似的比如:git rm \*~ :会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

        git mv from file to : 如:git mv a b  其实这个命令的运行为:mv a b ; git rm a ;git commit b;
        git log ;可以查看提交的日志,即历史

        git log有一些好用的参数,-p:显示每次提交的内容差异,-2:列出最近的2次更新 git log -p -2   .-stat:显示简要的增改行数统计.

        git log --pretty=format:"%h - %an,%ar:%s"(这里运用了强大的format) :--pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用oneline 将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 shortfull 和fuller 可以用,展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。

       解释上面命令的占位符:

选项   说明
%H  提交对象(commit)的完整哈希字串
%h  提交对象的简短哈希字串
%T  树对象(tree)的完整哈希字串
%t  树对象的简短哈希字串
%P  父对象(parent)的完整哈希字串
%p  父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 - date = 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
% cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s  提交说明

        git log的一些其他的参数:

-p 按补丁格式显示每个更新之间的差异。
--stat 显示每次更新的文件修改统计信息。
--shortstat 只显示 --stat 中最后的行数修改添加移除统计。
--name-only 仅在提交信息后显示已修改的文件清单。
--name-status 显示新增、修改、删除的文件清单。
--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative- date 使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph 显示 ASCII 图形表示的分支合并历史。

--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

-(n)    仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
-- until , --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。

--committer 仅显示指定提交者相关的提交。

     git commit  --amend:修改最后一次的提交,如:git commit -m "lgm" ;git add forgotten file;git commit--amend ;上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

    git reset HEAD filename :取消文件的暂存

    git checkout -- filename :抛弃文件的修改

    git remote -v :查看当前的远程库

    remote add [shortname] [url] :利用 shortname 指代对应的仓库地址。接着可以用  git fetch shortname .....

    git fetch [remote-name]:从远程仓库抓取数据到本地

    注:【fetch 命令只是将数据拉到本地并不自动合并,clone则是在本地创建一个分支并跟踪远程的分支,git pull则是从原始克隆的远程仓库中抓取数据后合并到工作目录的当前分支中。详细解释如下:

        此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。(我们会在第三章详细讨论关于分支的概念和操作。)

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支(参见下节及第三章的内容),可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。】

git push [remote-name] [branch-name]: git push origin master把本地的master分支推送到origin上只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那 你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。

git remote show [remote-name]:查看某个远程仓库的信息

git remote rename lgm ljm :change name lgm to ljm

git remote rm [remote-name]:删除远程仓库

你可能感兴趣的:(git,版本控制)