git 介绍和使用

git 是什么?

git 是目前世界上最先进的分布式版本控制系统。

git 介绍和使用_第1张图片
git

git与SVN的主要区别

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。    
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

协议

  • SSH协议

Git 使用的传输协议中最常见的可能就是 SSH 了。我们在使用git时经常看到这个协议名字,但我们还是不知道它是什么?因此增加这段内容简单介绍下。

这是因为大多数环境已经支持通过 SSH 对服务器的访问 — 即便还没有,架设起来也很容易。SSH 也是唯一一个同时支持读写操作的网络协议。另外两个网络协议(HTTP 和 Git)通常都是只读的,所以虽然二者对大多数人都可用,但执行写操作时还是需要 SSH。SSH 同时也是一个验证授权的网络协议;而因为其普遍性,一般架设和使用都很容易。

  • 优点
    使用 SSH 的好处有很多。首先,如果你想拥有对网络仓库的写权限,基本上不可能不使用 SSH。其次,SSH 架设相对比较简单—SSH 守护进程很常见,很多网络管理员都有一些使用经验,而且很多操作系统都自带了它或者相关的管理工具。再次,通过 SSH 进行访问是安全的 — 所有数据传输都是加密和授权的。最后,和 Git 及本地协议一样,SSH 也很高效,会在传输之前尽可能压缩数据。
  • 缺点

SSH 的限制在于你不能通过它实现仓库的匿名访问。即使仅为读取数据,人们也必须在能通过 SSH 访问主机的前提下才能访问仓库,这使得 SSH 不利于开源的项目。如果你仅仅在公司网络里使用,SSH 可能是你唯一需要使用的协议。如果想允许对项目的匿名只读访问,那么除了为自己推送而架设 SSH 协议之外,还需要支持其他协议以便他人访问读取。

  • Git 协议

接下来是 Git 协议。这是一个包含在 Git 软件包中的特殊守护进程; 它会监听一个提供类似于 SSH 服务的特定端口(9418),而无需任何授权。打算支持 Git 协议的仓库,需要先创建git-export-daemon-ok文件—它是协议进程提供仓库服务的必要条件—但除此之外该服务没有什么安全措施。要么所有人都能克隆 Git 仓库,要么谁也不能。这也意味着该协议通常不能用来进行推送。你可以允许推送操作;然而由于没有授权机制,一旦允许该操作,网络上任何一个知道项目 URL 的人将都有推送权限。不用说,这是十分罕见的情况。

  • 优点

Git 协议是现存最快的传输协议。如果你在提供一个有很大访问量的公共项目,或者一个不需要对读操作进行授权的庞大项目,架设一个 Git 守护进程来供应仓库是个不错的选择。它使用与 SSH 协议相同的数据传输机制,但省去了加密和授权的开销。

  • 缺点
    Git 协议消极的一面是缺少授权机制。用 Git 协议作为访问项目的唯一方法通常是不可取的。一般的做法是,同时提供 SSH 接口,让几个开发者拥有推送(写)权限,其他人通过git://拥有只读权限。Git 协议可能也是最难架设的协议。它要求有单独的守护进程,需要定制。

GitLab简单介绍

GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用。

git使用

使用git前,我们先了解下git的文件的三种状态,这会帮助我们每个操作的意义。

git文件状态
对于任何一个文件,在 git内都只有三种状态:

committed已提交表示该文件已经被安全地保存在本地数据库中了。
modified已修改表示修改了某个文件,但还没有提交保存。
taged已暂存表示把已修改的文件放在下次提交时要保存的清单中。

基本的 Git 工作流程如下:
在工作目录中修改某些文件。
对修改后的文件进行快照,然后保存到暂存区域。
提交更新,将保存在暂存区域的文件快照永久转储到git目录中。

  • 1.创建工程

本文以gitlab为仓库简单讲下git的使用。
登录gitlab后,用New project配置project,并点击Create Project创建一个工程。

  • 权限等级分三种:
    Private 私有的,只有你自己或者组内的成员能访问
    Internal 所有登录的用户
    Public 公开的,所有人都可以访问
      
    git 介绍和使用_第2张图片
    gitlab中创建project
  • 2.克隆到本地仓库

创建好工程后,复制工程SSH链接,用该链接clone到本地仓库中。或者先创建本地工程再上传到远程仓库也是可以的。
  
打开终端Terminal,输入:git clone [email protected]:zhang.wenhai/test.git,如果显示以下信息,则表示Clone成功,如果提示其他信息,请另查阅资料,可能是你git配置有异常。        

Clone远程仓库

  • 3.本地创建工程文件

本人是iOS开发,因此以Xcode工程为例。创建一个工程到刚才Clone的目录下。

  • 4.git指令

4.1检查当前文件状态
git status 查看目前分支的改动,该命令还显示了当前所在的分支是 master,这是默认的分支名称,实际是可以修改的,现在先不用考虑。
改动的文件在“Untracked files:”下面,git不会自动纳入跟踪范围,一般情况下我们需要自己主动纳入范围。

git 介绍和使用_第3张图片
git status

4.2跟踪新文件
提交工程我们先把修改的文件添加到tracked files中。
git add *添加所有的改动
git add test/只添加 “test/”目录底下的改动
我们需要所有文件的修改,因此使用第一条指令。如果没有异常则Terminal中没有任何提示,此时可以用 git status指令看变化。
git 介绍和使用_第4张图片
git add *

4.3 现在可以commit了

git commit -m "init project"提交工程,注释改动,以便后续查阅或者团队人员看的时候一目了然知道改动是什么。
-m参数后跟提交说明的方式,在一行命令中提交更新。

提交后可以看到,当前的是在哪个分支(master)提交的,本次提交的SHA-1校验以及在本次提交中有多少文件修订、添加、删除。   
 
提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。

-a参数git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤。

git 介绍和使用_第5张图片
git commit -m ""

4.4抓取和推送到远程仓库

查看远程仓库信息
git remote show origin可以查看origin远程仓库的详细信息。
除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你如果是在 master 分支,就可以用 git pull命令抓取数据合并到本地。另外还列出了所有处于跟踪状态中的远端分支它会告诉你,git push时缺省推送分支是master

git 介绍和使用_第6张图片
git remote show

抓取远程仓库
git pull抓取数据合并到本地。

推送到远程仓库
本地master分支推送到origin服务器上可以运行下面命令。
git push origin master,将改动推到远程master上。

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

分支

  • 分支介绍

怎么使用分支前,我们先了解下git的分支管理。

主分支
每个git用户都需要熟悉下原始的master分支,与master分支并行的另一个分支我们称之为develop分支。

我们把原始库/master库认作为主分支,HEAD的源代码存在于此版本中,并且随时都是一个预备生产状态。

我们把origin/develop库认为是主分支,该分支HEAD源码始终体现下个发布版的最新软件变更。

develop分支的源码到达了一个稳定状态待发布,所有的代码变更需要以某种方式合并到master分支,然后标记一个版本号。

所以,每次变更都合并到了master,这就是新产品的定义。在这一点,我们倾向于严格执行这一点,从而,理论上,每当对master有一个提交操作,我们就可以使用Git钩子脚本来自动构建并且发布软件到生产服务器。

辅助分支
我们的开发模型使用了各种辅助性分支,这些分支与关键分支masterdevelop一起,用来支持团队成员们并行开发,使得易于追踪功能,协助生产发布环境准备,以及快速修复实时在线问题。与关键分支不同,这些分支总是有一个有限的生命期,因为他们最终会被移除。

我们用到的分支类型包括:
功能分支
发布分支
热修复分支

每一种分支有一个特定目的,并且受限于严格到规则,比如:可以用哪些分支作为源分支,哪些分支能作为合并目标。我们马上将进行演练。

从技术角度来看,这些分支绝不是特殊分支。分支的类型基于我们使用的方法来进行分类。它们理所当然是普通的Git分支。

  • 使用分支

git checkout -b zwh.mainView 创建zwh.mainView并切换到该分支上。
git checkout zwh.mainView 从其他分支切换到zwh.mainView分支上。 
   
修改完成后,我们需要提交代码。
我们先用git看看变更。

git 介绍和使用_第7张图片
git status

提交代码
git commit -a -m "deveop main view"直接提交到本地仓库中。
git commit -a -m

推送到 zwh.mainView分支远程仓库中。
git push origin zwh.mainView推送远程仓库
git 介绍和使用_第8张图片
git push origin

该分支功能开发完成后,提交到develop分支上。
创建一个develop分支,开发中的代码都合并到该分支上,开发完成打到稳定版本后再提交到master上。

因此,我们zwh.mainView需要mergedevelop分支上,

操作流程:
1.是先切换到develop分支上,在进行merge操作。
git merge zwh.mainView mergezwh.mainView分支合并到develop上。

git merge

以上操作将zwh.mainView合并到develop本地仓库中。
2.如果没有冲突,应该推送到远程develop仓库中。
运行指令:git push origin develop

git push origin develop

  • 合并分支

以上使用分支的操作是简单情况,在实际项目中团队协作,一个工程多个人在同时修改中,因此需要学会怎么合并代码。

merge
指令merge的操作跟以上操作差不多,你从你的分支返回到develop时,别人没有提交代码可以直接进行merge操作。

rebase
如果你切换到develop分支时,发现别人已经提交过代码,你需要先抓取代码,再合并,这个操作最好的方式是用rebase

rebase操作方法:
1.在分支变更的分支上进行rebase操作,将自己创建分支的节点往前走到目前develop的最后节点上。
git rebase develop 简单粗暴地讲,就是跟上develop的当前节点。

git 介绍和使用_第9张图片
git rebase develop

2. rebase之后,本地代码中已经有 develop上的最新代码了,如果有冲突手动解决,没有冲突直接可以提交到当前分支远程仓库中了,方法如上面介绍。

3.切换到develop分支,此时提示你目前的节点滞后。

git 介绍和使用_第10张图片
git checkout develop

4.抓取git pull origin,再进行mergepush操作,此时不会有冲突了。

OK,这就是rebase操作。终于快要讲完了,哈哈。

git 常用命令

  • 最近整理的git指令。

branch
git branch -a shows both remote and local branches.
git branch -r shows remote branches.
git branch shows local branches.
git branch -a| grep ’some' search ’some’ branches.
git branch -d test delete test branch

reset
git reset reset add files in untracked files
git reset —hard reset all motified .

stash
git stash stash motified
git stash drop delete the latest stash
git stash pop pop the latest stash and remove from stash list
git stash applypop the latest stash ,but not remove from stash list
git stash show show the latest stash changes

**checkout **
git checkout Dev switch to Dev Branch
git checkout -b test create branch test and switch to test branch
git checkout . revert all local uncommitted changes (should be executed in repo root)
git checkout [some_dir|file.m] revert uncommitted changes only to particular file or directory

commit
git commit -m "commit description" commit changes to current brach remote repositoty

diff
git diff show changed files diffence
git diff xx.m show “xx.m" file changed

status
git status show current branch changed status

add
git add /test/test.m add test.m to tracked files
git add * add all change files of current folder to tracked files

pull
git pull pull branch from remote repositoty

push
git push origin testpush test branch to remote repositoty

merge
git merge test merge test branch to current branch

rebase
git rebase test rebase test branch to current branch

如果耐心看完这篇文章,基本上会操作git指令来管理版本了。用的开心。

  • 如果文章对你有帮助,请点下“喜欢”吧,感谢!
  • 参考文献
    服务器上的 Git
    介绍一个成功的 Git 分支模型

你可能感兴趣的:(git 介绍和使用)