git的深入理解与使用

来源:互联网 发布:mac imovie不见了 编辑:程序博客网 时间:2024/04/30 22:56

一、git的深入了解:

用git有一段时间了, 总是感觉自己对它的认识是少之又少。现在趁此机会总结一下,以使加深自己对git的理解。
我们都知道,git是一款免费开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目版本的管理。且Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
他的特点:
分布式相对于集中式的最大区别在于开发中可以提交代码到本地,而开发中也可以通过clone在本地机器上拷贝一个完整的git仓库。
且从开发者的角度来看,git通常有以下功能:

  • 从服务器上clone完整的Git仓库(包括代码和版本信息)到本地上。
  • 在自己的机器上根据不同的开发目的,创建分支、修改代码。
  • 在自己的机器上自己创建的分支上提交代码。
  • 在本机上合并分支
  • 把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
  • 生成补丁(patch),把补丁发送给主开发者。
  • 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
  • 一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
    且从主开发者的角度来看,git的功能:
  • 查看邮件或者通过其它方式查看一般开发者的提交状态。
  • 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
  • 向公共服务器提交结果,然后通知所有开发人员。

二、git是以指针为基础

我们通常在一个通过git进行版本控制的项目文件夹根目录中发现一个.git文件夹,或许我们都不止一次注意过它的存在,但是却很少去了解它到底是干什么的。下面我就整理一下它到底是何许人也:
存储在git的中的所有文件都保存在一个文件夹中,也就是.git文件夹。当你进行提交的时候,git会创建一个包含提交消息和相关数据的文件(名称、邮件、日期/时间、上一次提交等等),并将其链接到一个树形文件。树形文件包含一个对象列表或者其他树。对象或二进制大数据对象(BLOB)是提交的真正内容(一个文件,如果你愿意,虽然文件名没有存储在对象中,但会存储在树中)。所有这些文件都以对象的 SHA-1 哈希为文件名进行存储。分支和标签只是一些文件,这些文件包含(基本上)一个指向提交的 SHA-1 哈希值。使用这些引用在灵活性和速度上均有大幅提升,创建一个新的分支就和创建一个文件一样简单,只是这个文件带有分支名称和一个包含指向提交(你从这个提交建立分支)的SHA-1哈希值。当然,当你使用 Git 命令行工具(或一个图形用户界面)时,你永远也不会这么做,但它就是这么简单。

你可能已经听说过对 HEAD 的引用。它只是一个包含 SHA-1 引用的文件,这个引用指向你当前的提交。如果你正在解决一个合并冲突问题,查看一下 HEAD,你会发现,它与一个特定的分支或分支上的特定点无关,只和你现在的位置有关。
所有的分支指针保存在 .git/refs/heads 目录下,HEAD 在 .git/HEAD 目录下,标签在 .git/refs/tags 目录下 。

三、git的操作提示

针对于git的安装与配置网上已经有很多的教程了,我就不在多做陈述了。
下面我主要总结一些关于git的操作提示:

1.git init:
初始化git,只有初始化了git之后才可以使用git相关命令。
2.git clone
获取远程项目,下载到本地。远程库的地址在github项目中会有提供。
3.git branch
git branch命令用于创建分支,查看分支。查看分支可以使用参数-a,-v,-r等,a代表所有,v代表版本信息,r 代表显示远程分支。
4.git checkout
git checkout 命令用于创建分支和切换分支。*代表当前分支,”checkout”在英文中的意思是检出,但是也不难理解,GIT 中分支其实就是一个指向,速度很快;现在我的本地有两个分支,但是只有一份代码,当使用 checkout 命令切换分支并且两个分支的内容不同时,你会发现磁盘上的文件内容即刻发生了变化。checkout 命令还可以用来创建分支并切换到这个分支,使用 checkout -b 参数即可,下面的例子使用此命令创建了 newFeature 分支并切换到了这个分支。
5.git status
git status命令用来查看当前状态。
6.git pull
git pull命令用来更新代码,该命令相当于git fetch 和 git merge的组合。需要注意的是,如果来源是远程分支 develop,则必须这样写“origin develop”,origin 后面有个空格。如果远程分支存在有和当前分支一样的名字,则可以不指定分支。

7.git add
git add命令用来增加更新的内容,后面的参数为目录名或者文件名,一般在git commit命令之前使用。通过git diff可以查看哪些不同之处,只有被增加的更新才被提交到版本库。

8.git commit
git commit 命令用来提交更新。更新时需要提交注释,使用 -m 参数。GITHUB 提供的 GIT 客户端做的非常好,如果您忘记添加注释,它会弹出文本框让你填写。

9.git push
git push 命令用来推送更新到远程库,此命令一般在 commit 命令之后使用。如果远程没有对应的分支名,则需要通过设置参数“–set-upstream”指定提交到哪个分支。

10.git log
假如你不使用“git log”查看最近提交历史的话,你就不能长时间的顺利的使用git。但是,也存在一些如何更好使用它的建议。例如,可以查看每次提交改变的一个补丁:

git log -p

也可以只是查看一个哪些文件有所更改的概述:

git log status

如果你想在日志中查询一个指定的作者,可以这样进行指定:

git log --author=adamm

也可以根据提交消息中的搜索词进行:

 git log --grep="Something in the message"

还有一个功能更强大的叫 pickaxe 的命令,它可以查找条目用来添加或删除一个特定的内容(也就是,当它第一次出现或被删除的时候)。这样你就可以知道何时增加了一行(但是如果那一行中的字符随后被改变,你将无从得知):

git log -S "TODO: Check for admin status"

也可以使用 ActiveSupport 风格的日期缩小日期范围:

 git log --since=2.months.ago --until=1.day.ago

也可以使用 ActiveSupport 风格的日期缩小日期范围:

git log --since=2.months.ago --until=1.day.ago

它默认使用 OR 模式来组合查询,但是你也可以很轻松地改为 AND 模式(如果你的查询项不止一个的话)

git log --since=2.months.ago --until=1.day.ago --author=adamm-S "something" --all-match

11.时间的回退
1、重置更改
如果你还没有提交一个更改,你可以很容易的重置它:

git reset HEAD lib/foo.rb

如果你已经提交了文件,你可以做两件事情:如果是最后一次的提交,可以这样来修改:

git commit --amend

这将回滚到最后一次的提交,让你的工作副本回到变化存储在暂存区的状态,你可以编辑提交消息准备一下次提交。
如果你的提交不止一次,并且只想完全回滚它们,你可以重置分支回到之前的时间点。

git checkout feature132git reset --hard HEAD~2

如果你真的想把分支指向一个完全不同的 SHA-1(也许你把一个分支的 HEAD 指向另一个分支,或者进一步提交),你可以按照以下方式去做:

git checkout FOOgit reset --hard SHA

实际上还有一种更便捷的方式(因为它不会先将你的工作副本变回最初 FOO 状态,然后再指向SHA):

git update-ref refs/heads/FOO SHA

12.错误的修复
1、把更新提交到错误的分支
假设你提交到主分支,但应该已经创建了一个叫做 experimental 的主题分支。为了移除这些变化,你可以在当前点创建一个分支,回退 HEAD,然后检出新的分支。

$ git branch experimental   # Creates a pointer to the current master state$ git reset --hard master~3 # Moves the master branch pointer back to 3 revisions ago$ git checkout experimental

如果你已经在一个分支的一个分支的一个分支等上面做了些变更,这将会更复杂。然后你需要做的就是在这个分支上将其变更 rebase 到另一个的地方:

$ git branch newtopic STARTPOINT$ git rebase oldtopic --onto newtopic

2、交互式 rebasing
如果你已经做了3次提交,但是你想对它们进行重新排序或者编辑(或合并)

git rebase -i master~3

然后你将编辑器打开。你所要做的就是修改 “pick/squash/edit 的指令来进行如何提交,然后保存/退出。在编辑之后,你可以使用 git rebase —continue 让你的每一个指令一个一个进行。

如果你选择编辑一个文件,这会让你停留在你提交时的状态,因此你需要使用 git commit —amend 对它进行编辑。
备注:在 REBASE 过程中不要进行提交工作 - 只能添加然后使用 —continue, —skip or —abort 选项。
3、清理
如果你已经提交了一些内容到你的分支中,但是你想从历史中删除掉所有已提交内容:

git filter-branch --tree-filter 'rm -f *.class' HEAD

如果你已经向远程服务器推送过代码,但自那之后提交的都是一些垃圾,在推送之前你可以在本地系统上执行这样的操作:

 git filter-branch --tree-filter 'rm -f *.class' origin/master..HEAD

12.寻找作者
寻找谁更改了一个文件中的一行代码经常会用到。简单命令如下:

$ git blame FILE

但是呢,有时更改来自于前一个文件(如果你已经合并了两个文件,或者你已经移动了一个函数),因此你可以这样用:

$ # shows which file names the content came from$ git blame -C FILE

有时通过向前或向后点击来进行变化跟踪,这是很好的方法。有一个内置的 GUI 程序专门为此设计:

$ git gui blame FILE

13.数据库的维护
Git 通常不需要大量维护,它基本上可以自我维护。然而,你可以使用如下命令查看数据库统计信息:

git count-objects -v

如果数值很高,你可以选择使用垃圾回收你的重复内容。这不会影响推送或者其它用户,但却可以让你的命令运行更快且占用更少空间:

 git gc

上述这些,命令是我们在使用git过程中经常用到的,我们应该充分理解它的作用和意义!

0 0
原创粉丝点击