第四课 Git

版本控制系统
版本控制系统
版本控制系统是一种记录一个或若干文件内容变化轨迹,以便将来查阅特定版本修订情况的系统。
官网:
Subversion:http://subversion.apache.org/
Git:https://git-scm.com
版本库基本概念
版本库(Repository)
保存项目文件的各版本的备份中心,通过客户端可以连接到版本库,读写这些文件。
主干(trunk):
资源的主题,是从项目开始直达当前都处于活动的状态。从这里可以获得项目最新的资源以及几乎所有的变更版本
分支(branch):
从主干的某个点分离出来的资源拷贝,可以在不影响主干的前提下在这里进行资源的修改,如果在分支中修改的部分
是主干也需要修改的,可以把修改的部分合并到主干。
标签(tag):
用来标识主干或者分支的某个点的状态,以标注项目的某个状态,比如项目的关键里程碑
合并(merge):
将某一分支的修改同步到主干中
SVN的基本操作
工作空间(workspace):与位于中央的版本库相对应,是每个人的工作拷贝。它是本地机器上的一个文件目录,里
面存放着版本库中获得的资源的一个工作拷贝,完成编辑后可以把新版本的源代码和文档送回到版本库中。
检出(check out):从版本库中获得要修改的文档或源代码等文件的一个工作拷贝的过程称为检出,获取的工作拷
贝带有版本信息。
提交(commit):将已经修改好的工作拷贝放回版本库中的过程称为提交。
更新(update):将版本库中的修改同步到工作拷贝的过程称为提交
Git概述
基本介绍
Linux 内核开源项目有着为数众广的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事
务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和
维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费
使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper
时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:
自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其
适合管理大项目,有着令人难以置信的非线性分支管理系统
学习站点:
https://git-scm.com/book/zh/v2
基本概念
工作区(workspace):工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出
来的文件,放在磁盘上供使用或修改。
暂存区域(stage):暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也
被称作‘索引’,不过一般说法还是叫暂存区域。
仓库目录( .git):Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从
其它计算机克隆仓库时,拷贝的就是这里的数据。
本地仓库( Repository ):本地仓库是在自己电脑上的的项目版本库。
远程仓库(Remote):远程仓库是指托管在因特网或其他网络中的项目版本库。
clone:克隆其他仓库到当前目录,其他仓库可以是本地库,也可以是远程库
fetch:抓取远程库的数据到本地库,但是不合并远程库的数据到本地分支,远程跟踪分支进行了移动,但是本地分
支没有移动,工作目录的文件也没有修改
pull:拉取远程库的数据到本地库,并且合并数据到本地库,工作目录的数据同步修改
push:推送本地库的修改到远程库,如果本地库的起始版本和远程库的当前版本不一致,则需要先拉取合并,在
push
checkout:检出本地库的数据到工作目录,也叫切换分支
add:添加修改到暂存区域
commit:提交暂存区域的的修改到本地库
安装Git
Git本身是为Linux操作系统这一项目而编写的版本控制工具,并且以源代码的形式发行。在Windows本地平台上编译
这样的源码需要Cygwin一类的模拟环境,可以先安装这样的模拟环境再从Git源码编译安装,也可以使用第三方组织
通过这种方式发布了的windows平台编译版本,如:Git for Windows、GitHub for Windows等,他们不只可以运用
在Windows本地上,而且提供了bash模拟器、窗口程序等扩展。
MinGW:是“Minimalist GNU for Windows”的缩写,提供了一个进行Windows程序开发的开源编程工具集,编译的
程序是原生Windows应用,MinGW本身可以运行在Windows、Linux,甚至是Cygwin下。
Cygwin:由Cygnux开发,后被RedHat收购的一个项目,项目的目的是在Windows平台上提供一个类Unix环境,
Cywin通过一个dll文件来转换Windows 到 类Unix系统的调用API。
msys:是“Minimal SYStem”的缩写,是Bourne Shell命令行解释器系统。作为Microsoft的cmd.exe的替代品,它提
供了一个通用的命令行环境,特别适合与MinGW一起使用,用于将许多开源应用程序移植到MS-Windows平台; 它是
Cygwin-1.3的轻量级分支,它包含一小部分Unix工具。
msys2:msys2是mssys与Cygwin严重脱节后新开发的一个项目,也是Cygwin的一个轻量级分支。
Windows安装方式: Git for Windows:https://git-scm.com/download/win
Git for Windows 提供Shell和GUI两种使用方式:

  1. Git BASH
    Git for Windows提供了一个BASH仿真,用于从命令行运行Git。 2. Git GUI
    由于Windows用户通常期望图形用户界面,Git for Windows还提供Git GUI,Git BASH的强大替代品,提供几乎所
    有Git命令行功能的图形版本。
    GitHub for Windows : http://windows.github.com
    GitHub 的客户端
    Source Tree:https://www.sourcetreeapp.com/
    SourceTree是老牌的GitGUI管理工具了,号称是最好用的GitGUI工具。
    TortoiseGit: https://tortoisegit.org
    只提供Windows版本,提供中文版支持的
    Git for Windows的安装:
    选择在桌面创建快捷方式,否则需要通过右键菜单来使用,其他一路next即可
    Git for Windows的使用:
    命令行窗口调整字体:
    配置Git
    Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。程序升级时会保留配置信息。 这些变量
    存储在三个不同的位置:
    /etc/gitconfig 文件: 位于安装根路径下,包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 –
    system 选项的 git config 时,它会从此文件读写配置变量。
    ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递–global 选项让 Git 读写此文件。
    默认用户目录:C:\Users\Administrator
    当前仓库的 Git 目录中的 config 文件(git/config):针对该仓库。
    每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
    在使用前需要配置用户名和邮箱,配置信息保存在全局文件中,不随git库而改变。
    配置/修改用户信息
    命令解析: $ git config --global user.name “laowang” $ git config --global user.email “[email protected]
    每一次 Git 的提交都会用户信息,并且它会写入到每一次提交中,不可更改
    查看用户信息:
    仓库管理
    获取 Git 仓库
    Git 项目仓库的方法。第一种是从一个服务器克隆一个现有的 Git 仓库。第二种是在现有项目或目录下导入所有文件
    到 Git 中。
    一.克隆现有的仓库
    Git 克隆的是该 Git 仓库服务器上的几乎所有数据,而不是仅仅复制某个版本。 当执行 gitclone 命令的时候,默认配
    置下远程Git 仓库中的每一个文件的每一个版本都将被拉取下来
    命令解析:
    url:远程仓库地址,url的格式由数据传输协议决定,如 SSH 传输协议: git clone
    [email protected]:/root/sample.git
    该命令会在当前目录下创建一个名为 “sample” 的目录,并在这个目录下初始化一个 .git 文件夹,从远程
    仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝到sample目录。也可以加./,
    克隆到当前目录
    二.在现有目录中初始化仓库
    可用于本地仓库或者服务器端远程共享仓库的创建,如果创建远程共享库最好创建裸库(一个没有当前工作目录的仓
    库),否则push时会导致服务端的工作拷贝和仓库数据的脱离。
    命令解析:
    该命令将创建一个名为 .git 的子目录,这个子目录含有初始化的 Git 仓库中所有的必须文件,这些文件是
    Git 仓库的骨干
    –bare:创建一个裸库,仓库的骨干直接在当前目录中,主要用于远程仓库的初始化。远程仓库的目录名称
    一般以.git结尾
    如果是在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 普通仓库来进行版本控制的话,应该
    开始跟踪这些文件并提交。可通过 git add 命令来实现对指定文件的跟踪,然后执行 git commit 提交
    $ git config user.name $ git config user.email git clone [url] git init
    示例:
    git目下的.git和git2即为版本库目录,暂存区在该目录中
    工作区即为git目录,可以在该目录中新建文件然后添加到缓冲区,然后提交到版本库,相关操作参阅文件
    操作
    远程仓库的管理
    查看远程仓库列表:remote
    命令解析:
    列出指定的每一个远程服务器的简写。如果已经克隆了自己的仓库,那么至少应该能看到 origin,这是
    Git 给克隆的仓库服务器的默认名字
    选项 -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。 示例:$ cd /C/Users/Administrator/Desktop/git/ #切换当前目录 $ pwd #查看当前目录 $ git init git remote $ git remote origin ##远程厂库的名称 $ git remote -v origin http://test@localhost:8080/gitblit-1.8.0/r/p3.git (fetch) origin http://test@localhost:8080/gitblit-1.8.0/r/p3.git (push)
    添加远程仓库:remote add
    git remote add
    命令解析:
    添加一个新的远程 Git 仓库,同时指定一个可以简写。一般都是添加来源与同一个主库的版本库,不然添
    加也没有什么意义
    示例: $ git remote add test http://test@localhost:8080/gitblit-1.8.0/r/~test/p1.git
    添加p1库的派生库为远程仓库test,当然,url可以是任意库
    派生库一般为主版本库的克隆库,谁创建派生库谁有所有权限,用来让没有主版本库push权限的用户推
    送更新到派生库,然后让有主库push权限的人合并推到派生库的修改后,push修改到主库
    示例: $ git clone http://test@localhost:8080/gitblit-1.8.0/r/p1.git #test用户克隆主库到本地 $ git branch dev #创建dev分支 $ git checkout dev #切换分支dev $ 提交修改到dev分支,通过管理界面创建派生库~test/p1.git $ git remote add test http://test@localhost:8080/gitblit-1.8.0/r/~test/p1.git $ git push test dev:dev #push分支dev到派生库,主库没有push权限 $ git request-pull origin/master test #生成分支拉取邮件,可以将内容发送给有push权限的用户
    查看远程仓库详细信息:remote show git remote show [remote-name] 示例: $ git remote show origin * remote origin Fetch URL: http://test@localhost:8080/gitblit-1.8.0/r/p3.git Push URL: http://test@localhost:8080/gitblit-1.8.0/r/p3.git HEAD branch: master Remote branch: master tracked Local branch configured for ‘git pull’: master merges with remote master Local ref configured for ‘git push’: master pushes to master (fast-forwardable)
    重命名远程仓库:remote rename
    删除远程仓库:remote remove
    文件操作
    文件状态
    工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文
    件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工
    作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存
    区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
    编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。逐步将这些修改过的文
    件放入暂存区,然后提交所有暂存了的修改,如此反复。所以使用 Git 时文件的生命周期如下:
    文件操作
    检查当前文件状态:status
    git status git remote rename <旧名称> <新名称> git remote remove <仓库名称>
    命令解析:
    显示工作目录和暂存区的状态。使用此命令能看到哪些修改被暂存了, 哪些没有, 哪些文件没有被跟踪到。
    git status不显示已经commit到项目历史中去的信息。
    -s,以短格式显示文件状态
    ??:新添加的未跟踪文件 A:新添加到暂存区中的文件前面有 A 标记, M:修改过的文件 ,M 在右边表示该文件被修
    改了但是还没放入暂存区, M 在左边表示该文件被修改了并放入了暂存区。 MM:在工作区被修改并提交到暂
    存区后又在工作区中被修改了
    示例: $ touch u.txt #新建空文件u.txt ----------------------------------------------------------------------------------------- $ git status On branch master #当前工作拷贝在master分支上 Your branch is up to date with ‘origin/master’. #master分支已经是远程跟踪分支的最新版本 Untracked files: #未跟踪的文件 (use “git add …” to include in what will be committed) u.txt #暂存区没有内容,但是有未跟踪文件 nothing added to commit but untracked files present (use “git add” to track) ----------------------------------------------------------------------------------------- $ git status -s ?? u.txt #??表示未跟踪 ----------------------------------------------------------------------------------------- $ git add u.txt ----------------------------------------------------------------------------------------- $ git status On branch master Your branch is up to date with ‘origin/master’. Changes to be committed: #文件被添加到暂存区 (use “git reset HEAD …” to unstage) new file: u.txt ----------------------------------------------------------------------------------------- $ git commit -m “u.txt 1” [master 7542425] u.txt 1 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 u.txt ----------------------------------------------------------------------------------------- $ git status On branch master Your branch is ahead of ‘origin/master’ by 1 commit. #分支提交过一次,比origin/master要新 (use “git push” to publish your local commits) #使用git push推送修改到远程库 nothing to commit, working tree clean ----------------------------------------------------------------------------------------- $ 修改文件内容
    $ git status On branch master Your branch is ahead of ‘origin/master’ by 1 commit. #分支提交过一次,比origin/master要新 (use “git push” to publish your local commits) #使用git push推送修改到远程库 Changes not staged for commit: #文件被修改,但是没有放入暂存区 (use “git add …” to update what will be committed) (use “git checkout – …” to discard changes in working directory) modified: u.txt no changes added to commit (use “git add” and/or “git commit -a”)
    跟踪新文件或者暂存已修改文件:add
    git add
    命令解析: 把添加到索引库中,可以是文件也可以是目录。git不仅能判断出中,修改(不包括已删除)的文件,还能判
    断出新添的文件,并把它们的信息添加到索引库中,"."表示所有
    提交更新:commit
    git commit
    命令解析:
    提交暂存区的快照到仓库。
    -m 选项,将提交信息与命令放在同一行
    -a 选项,自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤,但是不包括未跟踪的
    文件(一次都没有add的文件)
    修改提交历史
    commit会形成提交历史,可以使用rebase处理提交历史,如:删除提交历史、和并提交历史等,以下是通过该命令
    合并提交历史的示例
    $git rebase -i HEAD~2 #会打开编辑环境进行操作编辑 pick c2b4d59 2.txt #pick,保留当前c2b4d59 squash 75c7d8f 3.txt #squash,和并提交到上一个提交 保存并退出编辑环境,会打开提交信息编辑窗口,编辑后保存退出
    移除文件:rm
    git rm
    命令解析:
    使用 git rm 来删除文件,会将本地文件删除,同时还会将这个删除操作记录下来,下次提交将删除版本
    库中的文件。
    如果文件已经暂存,需要加-f强制删除选项
    如果把文件从 Git 暂存区中删除,但仍然希望保留在当前工作目录中,使用 --cached 选项
    git rm命令所有的操作都是在操作本地文件和暂存区文件,同步到仓库还需要commit
    移动文件:mv
    git mv
    查看提交历史:log
    git log
    命令解析:
    默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面。 这个命令会列
    出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
    选项 -p,用来显示每次提交的内容差异。 也可以加上 -数字 来仅显示最近几次提交
    选项 --stat ,用来显示每次提交的简略的统计信息
    选项 --pretty,可以指定使用不同于默认格式的方式展示提交历史。比如oneline,将每个提交放在一行显
    示,如:git log --pretty --oneline
    跟 SHA-1值简写查看某一次提交历史
    文件比对
    比对工作工作目录与暂存区、暂存区与某次提交、两个树对象、两个文件对象之间的差异,甚至可以比对工作区文件
    和其他目录文件的差异。
    $git diff #默认比对工作目录与暂存区的差异,不包括未跟踪的文件 $git diff 文件名或者路径 #比对工作目录中指定文件或者目录与暂存区的差异 $git diff --cached #暂存区与最后一次提交的差异,也可以指定与某次提交对比 $git diff 提交ID1 提交ID2 #对比两次提交的差异,省略提交ID,则使用HEAD $git diff 对象ID 对象ID #对比两个文件对象的差异
    $git diff 1.txt $git diff --cached $git diff --cached 87a7 – 1.txt #对比暂存区与87a7提交的差异 $git diff 1349 87a7 – 1.txt #对比1349与87a7提交的差异,只对比1.txt文件
    回退版本
    丢弃新提交:
    $git reset 提交ID #或者可以是HEAD~3 $git push -f #如果要push,需要加-f
    导致HEAD指向提交ID,该提交ID后的提交失效
    –soft : 还原 HEAD
    –mixed(默认参数) :还原 HEAD、Index
    –hard : 还原 HEAD、Index、Working Directory
    重做某提交为新提交:
    $git revert -n 提交ID #以指定ID为模板生成新的版本,新版本的上一个版本是当前版本 $git commit $git push
    忽略文件
    总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 在这种情况下,可以创建一个名为
    .gitignore 的文件,列出要忽略的文件模式。文件 .gitignore 的格式规范如下:
    所有空行或者以 # 开头的行都会被 Git 忽略。
    可以使用标准的 glob 模式匹配。
    匹配模式可以以(/)开头防止递归。
    匹配模式可以以(/)结尾指定目录。
    要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
    .gitignore
    分支管理
    分支操作允许创建另一路线/方向上开发。我们可以使用这个操作将开发过程分为两个不同的方向。 例如,我们发布
    了1.0版本的产品,可能需要创建一个分支,以便将2.0功能的开发与1.0版本中错误修复分开。
    本地分支
    创建分支
    我们可使用git branch 命令创建一个新的分支。可以从现有的分支创建一个新的分支。 也可以使用特定的提交或标
    签作为起点创建分支。
    命令解析:
    基于当前分支的当前提交对象创建分支。没有提交过的版本库是不能创建分支的
    示例: $ git init ##初始化版本库 $ git add p1.txt ##新文件添加到缓存区 $ git commit -m “第一次提交” $ git branch ##查看分支 * master $ git branch dev ## 创建分支dev # 忽略.a结尾的文件 .a #不忽略lib.a !lib.a # 忽略当前目录下的TODO文件,但不是目录 /TODO #忽略build目录下的所有文件 build/ #忽略doc目录下的所.txt文件,不包括子目录 doc/.txt #忽略doc目录下的所.pdf文件,包括子目录 doc/**/*.pdf git branch <分支名称>
    $ git branch dev * master
    切换分支:checkout
    用于从某个提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支
    git checkout <分支名称>
    命令解析:
    checkout某个分支, Git 会自动添加、删除、修改文件以确保此时工作目录和这个分支最后一次提交时的
    样子一模一样。未跟踪文件不删除
    checkout某个提交,会形成分离分支(detached HEAD),这个分支上可以提交,但是如果切换到其它分
    支,这个分支就失效了,可以使用git checkout -b <分支名称>,基于当前提交生成分支
    示例: $ git checkout dev #切换到分支dev $ git add p2.txt #添加新文件到dev分支 $ git commit #提交缓存区内容到dev分支 $ git checkout 1349 1.txt #提取1349提交中的1.txt文件到工作区 $ git checkout 1349 #提取1349提交到工作区
    创建并且切换分支:checkout
    git checkout -b <分支名称>
    命令解析:
    相当于前面的两条命令。
    合并分支:merge
    git merge <分支名称>
    命令解析:
    合并分支到当前工作拷贝指向的分支
    如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
    此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待手动去解决合并产生
    的冲突。解决完成后需要手动提交
    Git 会在有冲突的文件中加入标准的冲突解决标记,指出冲突的内容
    示例: $ git checkout master ##切换到master分支 $ git merge dev #合并dev分支到master分支
    删除分支:branch
    git branch -d <分支名称>
    命令解析:
    删除指定分支,但是分支需要已经合并到当前检出的分支,如果需要强制删除未合并的分支,则加入-D选
    项。
    示例: $ git branch -d dev #删除dev分支 $ git branch
    分支查询:branch
    git branch
    命令解析:
    如果不加任何参数运行它,会得到当前所有分支的一个列表,分支前的 * 字符代表现在检出的那一个分支
    –merged 与 --no-merged 这两个选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。
    远程分支
    远程跟踪分支是远程分支状态的引用。 它们是不能移动的本地引用,当做网络通信操作(pull、fetch)时,它们会自
    动移动。 远程跟踪分支像是上次连接到远程仓库时,那些分支所处状态的书签。它们以 (remote)/(branch) 形式命
    名。
    Git 的 clone 命令会自动将克隆的远程库命名为 origin,拉取它的所有数据,创建一个指向它的 master 分支的指
    针,并且在本地将其命名为 origin/master(远程跟踪分支)。 Git 也会也会创建一个本地 master 分支(跟踪分
    支),并且指向origin/master
    从一个远程跟踪分支检出一个本地分支会自动创建一个 “跟踪分支” 。 跟踪分支是与远程分支有直接关系的本地分
    支。 如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
    Origin:远程厂库名称
    origin/master:远程跟踪分支,指向远程分支master
    master:master为跟踪分支,其跟踪origin/master,也就是服务器端的master分支
    查看远程仓库中的分支情况:
    git remote show <仓库名称>
    命令解析:
    获得远程仓库的分支信息。
    示例: $ git clone http://admin@localhost:8080/gitblit-1.8.0/r/p1.git #克隆远程仓库 $ git remote show #查看远程仓库 origin $ git remote show origin #查看远程仓库origin的详细信息 * remote origin Fetch URL: http://admin@localhost:8080/gitblit-1.8.0/r/p1.git Push URL: http://admin@localhost:8080/gitblit-1.8.0/r/p1.git HEAD branch: master Remote branch: master tracked Local branch configured for ‘git pull’: master merges with remote master Local ref configured for ‘git push’: master pushes to master (up to date)
    查看本地仓库中的远程分支情况:
    git branch -r
    命令解析:
    获得本地仓库中的远程分支信息
    -a 查看所有本地和远程分支信息
    示例: $ git branch -r origin/HEAD -> origin/master origin/master
    origin/HEAD就像一个指针,表示默认分支,例子中它指向 origin/master ,即 origin/master 是默认
    分支。
    创建远程分支:
    可以在远程仓库支持创建分支,也可以在本地创建分支,然后push
    示例:
    $ git branch dev #创建本地分支dev $ git checkout dev #切换到分支dev $ git add d.txt $ git commit -m “d.txt” $ git push origin dev:dev #推送本地的 dev 分支,将其作为远程仓库的 dev 分支
    删除远程分支:
    git push <远程仓库名称> --delete <分支名称>
    命令解析:
    这个命令做的只是从服务器上移除这个指针。Git 服务器通常会保留数据一段时间直到垃圾回收运行。
    对应的本地分支没有删除,需要git branch -d来删除本地分支
    也可以在本地删除以后,执行正常的push命令
    创建跟踪分支:
    git checkout -b [分支名称] [远程仓库名称]/[分支名称]
    命令解析:
    创建远程跟踪分支的跟踪分支并且检出,可以在该检出中修改文件,然后提交更新到跟踪分支,再把跟踪
    分支推送到服务器端的分支。
    跟踪分支查看:
    git branch -vv
    命令解析:
    这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否
    是领先、落后或是都有。
    从远程仓库中抓取与拉取:fetch
    git fetch [远程仓库名]
    命令解析:
    命令会访问远程仓库,会将数据拉取到本地仓库,但是它并不会自动合并或修改当前的工作分支。 示例: $ git fetch origin #从origin抓取数据 $ git merge origin/master master #合并远程跟踪分支到跟踪分支master
    如果当前分支是master,则工作目录中的内容修改
    从远程仓库中抓取并合并: pull
    git pull [远程仓库名]
    命令解析:
    git pull通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
    示例: $ git pull origin #从origin抓取数据,并且合并
    推送到远程仓库: push
    git push [远程仓库名] [本地分支名]:[远程分支名]
    命令解析:
    只有当拥有所克隆服务器的写入权限,并且之前没有人推送过时,命令才能生效。如果克隆后已经有其他
    人推送过,必须先将他们的工作拉取下来并将其合并进你的工作分支后才能推送。
    示例:
    服务器上的 Git
    Git协议
    Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。
    本地协议
    最基本的就是 本地协议(Local protocol) ,其中的远程版本库就是硬盘内的另一个目录。版本库路径作为 URL
    HTTP 协议
    HTTP 协议的运行方式和 SSH 及 Git 协议类似,只是运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验证机
    制,这意味着使用起来会比 SSH 协议简单的多,比如可以使用 HTTP 协议的用户名/密码的基础授权,免去设置
    SSH 公钥。
    HTTP 协议或许已经是最流行的使用 Git 的方式了,它即支持像 git:// 协议一样设置匿名服务,也可以像 SSH 协
    议一样提供传输时的授权和加密。
    $ git clone https://example.com/gitproject.git
    SSH 协议
    架设 Git 服务器时常用 SSH 协议作为传输协议。 因为大多数环境下已经支持通过 SSH 访问。 SSH 协议也是一个验
    证授权的网络协议;并且,因为其普遍性,架设和使用都很容易。
    $ git push
    服务器上的 Git
    Git协议
    Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。
    本地协议
    最基本的就是 本地协议(Local protocol) ,其中的远程版本库就是硬盘内的另一个目录。版本库路径作为 URL
    HTTP 协议
    HTTP 协议的运行方式和 SSH 及 Git 协议类似,只是运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验证机
    制,这意味着使用起来会比 SSH 协议简单的多,比如可以使用 HTTP 协议的用户名/密码的基础授权,免去设置
    SSH 公钥。
    HTTP 协议或许已经是最流行的使用 Git 的方式了,它即支持像 git:// 协议一样设置匿名服务,也可以像 SSH 协
    议一样提供传输时的授权和加密。
    $ git clone https://example.com/gitproject.git
    SSH 协议
    架设 Git 服务器时常用 SSH 协议作为传输协议。 因为大多数环境下已经支持通过 SSH 访问。 SSH 协议也是一个验
    证授权的网络协议;并且,因为其普遍性,架设和使用都很容易。
    $ git push $ git clone /C/Users/Administrator/Desktop/git/.git 或者$ git clone file:///C/Users/Administrator/Desktop/git/.git
    $ git clone ssh://user@server/project.git 或者$ git clone user@server:project.git
    Git 协议
    接下来是 Git 协议。 这是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服
    务,但是访问无需任何授权。 要让版本库支持 Git 协议,需要先创建一个 git-daemon-export-ok 文件 —— 它是
    Git 协议守护进程为这个版本库提供服务的必要条件 —— 但是除此之外没有任何安全措施。 要么谁都可以克隆这个
    版本库,要么谁也不能。
    Gitblit
    一个基于Java的开源Web应用,可以用于管理Git版本库,并且提供SSH,HTTP和GIT协议的网络服务,开箱即用。提
    供版本库,用户帐户和团队等管理功能。
    安装
  2. 拷贝gitblit-1.8.0.war到Tomcat的webapps目录下
  3. 启动容器
  4. http://localhost:8080/gitblit-1.8.0/
  5. 用户名和密码为:admin admin
    数据目录
    gitblit war默认在${contextFolder}/WEB-INF/data存储所有数据(用户,设置,存储库等)。可以通过以下方式修
    改该路径:
  6. 设置 GITBLIT_HOME 环境变量或 -DGITBLIT_HOME JVM系统属性
  7. 修改WEB-INF/web.xml中的
  8. JNDI指定baseFolder
    属性配置
    gitblit war的属性文件在数据目录下,通常为gitblit.properties,该文件中可以配置属性,也可以在其他属性文件中
    定义属性,让后在该文件中包含其他属性文件,被包含的多个属性文件通过逗号分隔。
    include = defaults.properties
    需要修改的属性:
    版本库目录:git.repositoriesFolder = ${baseFolder}/git
    参考资料:http://www.gitblit.com/properties.html
    创建版本库
    项目下拉列表中选择是公共库(/)、还是私有库(~admin)。个人存储库与公共/共享存储库完全相
    同,只是所有者对该存储库具有一些额外的管理权限,例如删除。
    项目名称中可以使用/对项目进行分组,如p1/p2
    整体权限控制策略
    初始化提交,没有这个选择则需要在本地目录git init
    权限配置
    http://www.gitblit.com/administration.html
    Gitblit不支持基于分支的权限(如Gitolite)控制,支持的存储库访问权限如下:
    V(在web ui中查看、下载zip) R(克隆)
    RW(克隆和推送)
    RWC(克隆和推送,创建分支)
    RWD(克隆和推送,创建、删除分支))
    RW +(克隆和推送,创建、删除分支,推送reset<版本回退>)
    个人存储库和派生库
    个人存储库
    个人存储库在公告板查看,在公共库里查看不到,个人可以删除自己的个人版本库
    $ git reset --hard head~1 #回退一个版本 $ git push #push回退操作到服务端
    派生库
    派生库一般为主版本库的克隆库,谁创建派生库谁有所有权限,用来让没有主版本库push权限的用户推送更新到派
    生库,然后让有主库push权限的人合并推到派生库的修改,然后push修改到主库
    基本原理
    add:在objects下创建文件对象,同时index会记录该文件对象的哈希值和文件本地文件路径,git ls-files
    –stage可以查看文件内容
    commit:在objects下创建提交对象,同时index会记录本次提交的文件信息(文件模式串、文件名、每
    个文件对应文件对象的哈希值),同时移动HEAD、refs中的引用
    查看特殊文件:
    .gin |–config #项目特有的配置选项 |–description #版本库描述信息,由GitWeb程序使用 |–HEAD #指示目前被检出的分支,是一个符号引用,执行的是refs的引用 |–index #保存暂存区信息 |–hoks/ #客户端或服务端的钩子脚本 |–info/ #全局性排除文件,类似于 .gitignore使用 |–objects/ #存储所有数据内容的目录,包括blob(文件对象),commit(提交对象),tree(树 #对象)、tag(标签对象) |info/ #打包文件的信息 |pack/ #打包文件以及索引。打包文件包含了从文件系统中移除的所有对象。索引文件包含 #了打包文件的偏移信息,git gc可强制打包 |–06 #真实数据对象,SHA-1值的前两个字符作为目录名,后38个字符则作为目录内的文件名 |–bd25… #使用zlib压缩,每次修改都保存新文件的所有内容,git定时打包,生成只包含差异内 #容的文件 |–refs #存储指向提交对象的指针 |–heads #HEAD文件指向这里的引用 |–tags #指向标签对象的引用,标签对象中包含有提交对象引用 |–remotes #远程引用,远程跟踪分支指向的提交对象
    $ git ls-files --stage #查看index文件内容 $ git verify-pack -v .git/objects/pack/pack-…idx #查看打包索引文件内容 $ git cat-file -p 文件名称 #查看数据对象内容,数据文件名称要由两位的目录和38位的文件名组成,可以用六位 #简写 $ git cat-file -t 文件名称 #查看数据对象类型 $ git gc --auto #如果没有需要处理的文件(打包、删除无效数据对象),则退出

你可能感兴趣的:(架构师课程,java,git,软件框架)