git学习

对程序员来说,Git具有如下优势:

  • 分布式体系结构:可以完全断网工作,不受网络连接的限制
  • 分支与合并操作很容易

1.Git的版本控制之道

1.版本库

Repository,是版本控制系统用来存储所有历史数据的地方。大多数版本控制系统在版本库中存储各个文件的当前状态、历史修改时间、谁做的修改以及修改的原因。

集中式版本控制系统,每个程序员在本地有一个工作目录树,其内容是该版本库中最新的代码。当他们在工作目录树中完成代码修改后,就把改动提交回该版本库中。

分布式版本控制系统,每个程序员在本地有一个自己的版本库,而不是连接到服务器上的一个公共的版本库。如果要把修改上传到项目主版本库中,有两种方法:(1)通过Git的Push操作,直接把修改上传到主版本库(2)生成包含少量修改的补丁包,把补丁包提交给项目维护人员,再由项目维护人员更新主版本库。

2.版本库中存储什么

这个没有规定,如果没有某样东西,这个项目没法工作,那么它就应该纳入版本控制。

3.工作目录树

Working Tree,也就是程序员进行程序开发的地方,一些版本控制系统把工作目录树称为Working Copy。在Git中,版本库不在服务器上,而存储在本地工作目录树的“.git”目录中。

创建工作目录方法有两个:(1)用Git相关命令初始化版本库,也就是生成“.git”目录,于是“.git”目录的父目录就成了工作目录(2)Clone一个已有的版本库,也就连带创建了相应的工作目录树。

4.代码修改与文件同步

在修改了文件内容之后,须要进行单元测试以保证这次修改不会有任何负面影响,然后提交(Commit)。每次提交都使得版本库中新增一个版本(Revision)。除了记录改动内容本身外,版本库还记录改动的日志信息(Log Message)或称为Commit Message,以便将来能够很方便地查询为什么要做这个改动。

把远程版本库里的改动拿到本地版本库中,需要两步操作:(1)Fetch,把远程版本库中的版本和分支复制到本地版本库中。(2)Merge,在本地版本库中,把取来的改动与本地的改动合并。Fetch和Merge总是先后执行,因此Git中有一个等价的命令Pull。

5.跟踪项目、目录和文件

Git并不是把整个文件作为不可分的整体来记录和跟踪,而是记录和跟踪组成文件的各部分内容,也就是若干字符和代码行。

6.使用标签跟踪里程碑

标签是一个对于使用者来说易于理解及记忆的名字,用于标识版本库中一个难记忆的内部版本号,以此帮助使用者跟踪版本历史。

7.使用分支来跟踪并行演进

分支可以长期存在,也可以仅存在数个小时,分支可以合并到别的分支。分支也可以在本地创建,并留作私用,创建本地分支并留作私用是有意义的。在完成试验性的工作后,如果有价值,再让大家拿到也不迟,而如果没有价值,那就把它悄无生息的删除。

2.Git安装与设置

设置Git

git config --global设置一些全局变量的值

git config --global user.name "Travis Swicegood"

user.name用来说明版本历史上的修改是谁提交的

git config --global user.email "development@domain51.com"

user.email是邮件地址,以方便联系修改者。

使用下面命令检查上述设置是否成功:

git config --global --list

可以设置的值超过130个,其中大部分很少用得上。若想在命令行窗口中使用不同的颜色显示不同类型的内容,将“color.ui”值设置为“auto”或“always”

使用Git图形界面

git gui可以启动Git的图形界面,如果要查看历史信息等操作,使用gitk

3.创建第一个项目

1.创建版本库

在Git中创建版本库,首先要决定把项目源代码存放在哪里。本例中,要创建一简单的HTML页面,所以给这个项目取名为mysite,首先创建一个同名的目录 “mysite”,并进入到这个目录,然后输入命令git init。

 

mkdir mysite
cd mysite
git init

 

 

 

2.代码修改

现在往里添加文件index.html,可以开始跟踪版本了,要想让Git跟踪这个文件,须分为两部:(1)使用git add命令把该文件添加到版本库的索引(index)(2)使用git commit提交

 

git add index.html
git commit -m "add index.html"


参数-m告诉Git本次提交的留言为后面的字符串。

 

运行命令git log可以看到这个提交相关的信息

3.在项目中工作

此时修改index.html后,Git可以检测到文件被修改。命令git status会显示工作目录树的状态,Git中的工作目录树与Subversion和CVS中的工作拷贝差不多一个概念。如果要接交须要暂存(stage)修改。

Git中有三个地方可以存放代码:(1)工作目录树,编辑文件时可以直接在这里操作(2)索引(index)也就是暂存区(staging area),暂存区是工作目录树和版本库之间的缓存区(3)版本库

此时运行git add index.html

它可以暂存对index.html刚刚做的修改,这次它告诉Git要跟踪的是一个新的修改而非新的文件。之后可以使用git commit -m提交。一条git commit中可以使用多个-m参数,Git可以接受任意多次提交留言的输入。

4.理解并使用分支

有两种分支比较有用:(1)支持项目的不同发布版本的分支(2)支持一个特定功能的开发的分支

git branch命令需要两个参数:新分支名称和父分支名称

 

git branch RB_1.0 master
git commit -a

主分支是Git的默认分支,-a参数是告诉Git提交全部修改过的文件,现在主分支上有最新的修改,而RB分支还是原来的代码。切换分支的命令是git checkout

 

5.处理发布

git tag 1.0 RB_1.0

这样将来就容易找到相应版本的代码,用不带参数的git tag可以查看版本库中的标签列表。现在的两个分支上有不同的提交,它们并不知道彼此所包含的代码,创建RB_1.0以后,主分支用于版本2.0的新功能开发,现在要把RB_1.0分支上所做的修改合并到主分支上来。

git rebase是把一条分支上的修改在另一条分支的末端重现。

 

git checkout master
git rebase RB_1.0
git branch -d RB_1.0


这时的删除中是删除了分支的名字,并不会删除分支上的任何内容。

 

为代码发布创建归档文件,通常情况下,将标签对应的版本内容打包成一个tar包或zip包就可以。

 

git archive --format=tar\
--prefix=mysite-1.0/ 1.0 \
|gzip>mysite-1.0.tar.gz


--format指明要产生tar格式的输出,--prefix指明包中所有东西都放到mysite-1.0/目录下,最后指明归档的标签名称1.0,最后通过管道进行gzip压缩,重定向到mysite-1.0.tar.gz文件。

 

 

git archive --format=zip \
--prefix=mysite-1.0/ 1.0 \
>mysite-1.0.zip

 

 

 

6.clone远程版本库

克隆版本库就像它听上去的那样,会在本地创建远程版本库的完整拷贝

例如:git clone git://github.com/tswicegood/mysite.git  mysite-remote

git clone有两个参数,第一个参数表示远程版本库的位置,第二个参数表示存放拷贝的本地目录(可选)。

4.Git基础

1.添加文件到暂存区

添加新文件和修改版本库中已有文件都可以用git add完成,添加-i选项会启动交互命令提示符,在这种方式下可以交互暂存新文件,暂存对已有文件的修改,甚至只暂存部分修改。如果想退出该模式,可以按下回车。不用担心该如何记住所有这些选项,输入?将会显示所有选项的帮助信息。另外补丁模式也可以通过 git add -p进入。

2.提交修改

这里所说的提交是提交到本地版本库,如果输入不带-m参数的git commit命令,Git会按照以下顺序查找编辑器:(1)环境变量GIT_EDITOR (2) Git的设置core.editor(3)环境变量VISUAL的值(4)环境变量EDITOR的值(5)如果上述值都为空,Git会尝试启动vi编辑器

三种提交方法:

(1)git add some-file

         git commit -m "message.."

(2)git commit -m "message.." -a

(3)git commit -m "message.."   some-file

提交暂存后的修改、提交工作目录树中的所有修改、提交工作目录树中指定的修改,后两种方法把修改直接提交,而第一方法是先暂存后提交。

3.查看修改内容

查看当前状态

git status,该命令的输出结果是暂存区要提交的内容、工作目录树中未纳入暂存区的改动,以及尚未纳入Git版本控制的新文件。

查看文件改动

git diff,不添加任何参数比较的是工作目录树与暂存区之间的区别,+表示新添加一行,-表示删除一行,如果添加参数--cached,比较的是暂存区与版本库之间的区别,如果添加参数HEAD,可以比较工作目录树与版本库中的区别。

4.管理文件

文件重命名与移动

git mv <原文件名称> <新文件名称>,可以移动文件,新文件保留原文件的历史修改记录,并删除原文件。

忽略文件

把要忽略的文件名加到.gitignore文件中,而且Git支持统配符,可以用通配符设置要忽略的文件名称。

如果把要忽略的文件改添到.git/info/exclude文件中,则本地的版本库会忽略这类文件,同时又不会把此设置传播出去。

如果每个人的版本库都需要这类忽略,应在.gitignore中添加规则来忽略该类文件,并把.gitignore提交到版本库中,如果仅仅是本人需要的忽略,就将它添加到.git/info/exclude文件中。

5.理解和使用分支

git branch -m master mymaster

-m参数告诉Git要执行分支移动(重命名)操作,另两上参数分别是分支原名称和新名称。

何时创建分支:(1)试验性更改(2)增加新功能(3)Bug修复……

创建分支

git branch参数中给出新分支的名称,不带任何参数可以检查branch的情况。如果使用git checkout -b 是一步完成创建分支并checkout该分支,例如:

git checkout -b alternate master

第三个参数master是告诉Git,不是从当前分支,而是从主分支上创建分支。

合并分支间的修改

直接合并(straight merge)

如果想把一条分支的全部历史提交合并到另一个分支上,可以采用这种方式。

git merge命令在参数中指定想要合并到当前分支的源分支名称。

压合合并(squashed commits)

压合指的是Git将一条分支上的所有历史提交压合成一个提交,提交到另一个分支上。如果某条分支上的所有提交都密切相关,应随后作为一个整体记录(在父分支上)时,适合作压合提交。

git merge --squash

拣选合并(cherry-picking)

有时候分支间只须要合并一个提交,而不须要合并一条分支上的全部改动,可以使用git cherry-pick命令合并单个提交。要拣选多个提交,可以使用参数-n,这就告诉Git在创建提交前须要连续进行合并操作。

冲突处理

Git不能自动合并时,称之为冲突(confict)。冲突总是发生在对不同分支上的同一个文件的同一文本块以不同的方式修改,并试图合并的时候。

<<<<<后面跟随的是当前分支中的代码,>>>>>>是分支的名称,HEAD指向当前分支末梢的那个提交。

对于简单的合并,只须要手工编辑并解决冲突即可。对于复杂的,可以使用可视化合并工具,比如Linux(和Windows)中的kdiff3和osx中的opendiff,在命令行中git mergetool会启动一个合并工具。

删除分支

git branch -d命令删除分支,但只有要删除的分支已经成功合并到当前分支时,删除才会成功。或者使用git branch -D强制删除

分支重命名

git branch -m 参数-m不会覆盖已有分支名称,如果用-M,当新的名称已经存在时,会强制进行覆盖。

6.查询Git历史版本

1.查看Git日志

在不带参数的git log命令的输出中,有四部分信息:(1)提交名称(2)提交人(3)提交日期(4)提交留言

2.指定查找范围

--since是最近时间内

--before是时间之前

例如:

git log --since="5 hours"是查看最近5个小时内的提交

git log --before="5 hours" -1查看5小时之前的最后一个提交

用“老版本..新版本”这种格式可以处为查找范围,例如:

git log 18f822e..HEAD,但是不包括起点,只包括终点。

git log --pretty=format:"%h %s" 1.0..HEAD中,format:"%h %s"表示显示提交名称的缩写,以及提交留言的第一行,即标题。另一种常见的格式是--pretty=online。

^:一个脱字 号作用相当于回溯一个版本。在Windows系统下,如果版本中带有脱字号,则版本须添加双引号。如18f822e^表示18f822e之前的那个版本。

*~N:波浪字符加数字的操作符是指回溯N个版本。

3.查看版本之间的差异

在命令git diff里,指定版本范围的方法和git log一样,差别是git diff输出的是最老版本与最新版本的差异。在git diff命令中使用标签作为参数,是一种获取发布版本之间代码量统计的好方法,可以利用它计算出修改和删除的代码行数。

4.查明该向谁问责

git blame,可以查看特定代码块的历史信息。通过参数-L能够缩小范围。示例:

git blame -L 12,13 hello.html,显示文件hello.html第12行和第13行日志。

git blame -L 12,+2 hello.html显示hello.html的第12行~14行,(+N、-N可用)

git blame -L "/<\/body>/",+2 hello.html,使用正则表达式

6.撤销修改

在Git中,所有的修改都是在本地进行的,只有推入到公共版本库才能共享。一旦推入了变更,就不能随意修改相应的历史,除非不怕团队里所有人的抱怨。

增补提交

git commit -C HEAD -a --amend

-C,即告诉Git复用指定提交的提交留言,在这里指定的是HEAD,如果是小写的-c,就会打开编辑器,以便在此基础上进行修改。--amend表示增补提交,只能针对最后一个提交。

反转提交

反转已经提交的改动,是简单的方法是使用git revert命令。此命令通过在版本库中创建一个“反向的”新提交来抵消原来的提交的改动。也可以通过-n参数告诉Git先不要提交,Git会暂存变更,然后做一次性提交。

复位

git reset可以在复位版本库后,暂存工作目录树中因复位产生的与版本的库的差异,通过--soft,Git会暂存因复位带来的差异,之后,用户可以修改这些内容再提交,或者干脆扔掉这些内容,--hard会从版本库和工作目录树中同进删除提交。

7.重新改写历史记录

重新排序提交

重新排序,让它们看起来更合理

git rebase -i的人机交互模式改写历史记录,交互模式启动的时候会调用事件设置好的编辑器,使用变基模式的交互模式,须提供重排提交的起始点作为参数。

将多个提交压合到一个提交

……

将一个提交分解成多个提交

……

7.与远程版本库协作

1.网络协议

Git提供3种与远程版本库通信的协议:(1)SSH(2)git(3)HTTP/HTTPS

SSH协议

git@github.com/tswicegood/mysite-chp6.git

git是用户名,github.com是服务器名,tswicegood/mysite-chp6.git是版本库路径,与直接通过文件系统访问非常类似,唯一不同的是,在指定远程版本库路径前,还必须为它指定域名服务器和用户。指定用户名不是必须的,如果使用本机登陆名作为用户名,在URL中就可以不用指定用户名。

git协议

git://github.com/tswicegood/mysite-chp6.git

git://指定是git协议,使用9418端口,这个端口通信一般会受到防火墙的限制,git协议与SSH协议之间的主要区别是,git协议无须加密,且是匿名的。当只希望开放远程版本库的只读权限时,git协议是个不错的选择。一种常见的方式是,开发人员使用git协议将远程版本库中的更新pull到本地版本库,而使用SSH协议将本地版本库中的更新push到远程版本库中。

HTTP/HTTPS协议

http://github.com/tswicegood/mysite-chp6.git

它的通信效率是最低的,但它能通过严格的防火墙,且易于架设。然而GitHub服务器并不支持HTTP协议。

2.克隆远程版本库

加入一个正在开发的项目,克隆是一个常见的方法,但不是唯一的方式。如果是自己开始开发一个项目,然后再与他人分享,则可在必要时再设置远程版本库。

git clone git://github.com/tswicegood/mysite-chap6.git

这个命令把服务器上的版本库下载到本地mystite-chap6目录下。                               

3.版本库同步

克隆远程版本库之后,项目里其他开发人员仍不断在此远程版本库中添加新的内容,这就须要不断fetch远程版本库的改动到本地版本库,使用git fetch命令来完成这样的操作。

git fetch更新远程分支,但它不会把远程分支上的修改合并到本地分支上,使用命令git push可以顺序完成两件事情:取来,然后合并。需要两个参数:(1)远程版本库名称(2)须要拖入的远程分支名(无须加前缀orgin/)

orgin/表示远程版本库上的分支名称,用于区别本地分支名称。orgin是默认的远程版本库别名,

4.推入改动

调用不带参数的git push命令,Git会推入到默认版本库origin中,并把本地版本库中当前所在分支的变更推入到远程版本库对应的分支上。与git pull一样,git push命令也可以指定霜推入的版本库。git push <repository> <refspec>

5.添加新的远程版本库

可以使用git remote add <name> <repo-url>给远程版本库添加别名。如果在本地先用git init命令创建版本库,后来又须要把改动送到一个远程版本库里,就可以用这个方法。

git remote show <name>可以查看某个远程版本库的详细信息,也可以使用git remote rm 命令删除别名

8.管理本地版本库

1.使用标签标记里程碑

标签最常用于给项目代码的发布版本做标识,你也可以使用标签返回标签标记的版本库状态,虽然不能改变标签所对应的代码 ,但是可以检出标签,就像检出会支一样。

2.发布分支

发布分支是指当一个项目的所有功能都已开发完成,但尚未达到开发布的质量标准时创建的分支,通常只须呼许改动,往往侧重于Bug或逻辑修正,很少会添加新功能。发布分支通过以RB_作为前缀并包含版本号,发布分支持续时间不长,通常只用于发布代码的最终测试期间,一旦该版本发布,应该使用标签标记项目,然后就可以删除该分支了。

4.记录和跟踪多个项目

有两种方法:(1)多个项目共享一个版本库,当每一个小项目,或组件,总是作为整个大项目的一部分来发布时,使用同一个版本库共享历史应该是不错的选择(2)多项目多版本库,如果各小项目是单独发布的,它们就应该有自己独立的版本库

5.使用Git子模块跟踪外部版本库

Git子模块允许在某一个版本库中再存储另一个版本库,并且能够保持两个版本库之间的完全独立。

添加新子模块

git submodule add命令,有两个必须的参数,第一个是源版本库,第二个是要存储该版本库的路径。

9.高阶功能

10.迁移到Git

1.与SVN的通信

subversion常用命令对应的Git命令

svnadmin create -> git init

svn checkout -> git clone

svn update -> git pull

svn add -> git add

svn commit -> git add ;git commit

svn status -> git status

svn switch<branch> -> git checkout <branch>

svn merge <branch> -> git merge <branch>

svn revert <file> -> git checkout <file>

从Subversion迁移到Git有两种方法:(1)从Subversion中导入所有历史记录到Git,然后使用Git作为主要的版本控制工具(2)保持Subversion仍为“官方”方法(而项目中少数人开始使用git)。

2.确保git-svn是可用的

Git中有一个叫做git-svn的工具,用于与Subversion版本库通信。

11.使用Gitosis管理Git服务器

Gitosis是一个远程管理Git服务器及其上的各个版本库的工具,它的实现机制,使用一个特别的Git版本库来存储服务器上各版本库的配置信息。

 

最后欢迎大家访问我的个人网站: 1024s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值