Git使用个进制字符的SHA-
Hash来唯一标识对象
如:e98757d0598ab6eeaf1df0d87dd00826048bd80b

git 有种对象

1、blob
表示文本文件,二进制文件或者是链接文件

、tree

3、commit
大多数情况,commit 代表是一个历史提交

4、tag:指向一个固定的一个历史提交

四者之间的关系:

一个tag指向commit对象。一个commit指向一个tree对象,tree对象能够包括其它的

tree对象和blob对象,commit指向这种一个tree结构,就代表着你提交某个工作区的某一个状态。

对这些内容进行分别进行相关hash之后。就能够得到他们的唯一标识。git仅仅关心文件的内容,如两个

文件有相同的内容,那么他们会指向相同一个blob对象,而像文件名称之类的一些其他信息。会存储在tree对象里边。

有了这个git对象以后。我们须要一个仓库来对这些对象进行存储和操作。

5.获得一个git仓库

git 仓库分两种,一种是裸仓库,它不带工作区,通经常使用于server,方便其它用户进行协作

)git init

使用命令:

进入一个工作区

cd /Users/hairongchen/Documents/git

输入:

hairongchen:git (master #)$ git init drama_non_bar_repo

显示:表示为我们创建了一个文件夹,里面还带了一个.git文件夹

Initialized empty Git repository in /Users/hairongchen/Documents/git/drama_non_bar_repo/.git/

进入这个目录:

hairongchen:git (master #)$ cd drama_non_bar_repo/.git/

hairongchen:.git (GIT_DIR!)$

看到命令提示符提示,这是git工作区间。

下面是git工作所须要文件夹和文件

hairongchen:.git (GIT_DIR!)$ ls

HEAD confighooksobjects

branches descriptioninforefs

hairongchen:.git (GIT_DIR!)$

再退出来,然后创建一个裸仓库,发现没有创建一个.git文件夹

hairongchen:.git (GIT_DIR!)$ cd ../..

hairongchen:git (master #)$ git init --bare drama_bare_repo

Initialized empty Git repository in /Users/hairongchen/Documents/git/drama_bare_repo/

hairongchen:git (master #)$

再进入这个文件夹看一下,发现和上面创建一样,但没有在.git文件夹里面,这是由于它不带工作区,repo仅仅有git工作所需的文件和文件夹

hairongchen:git (master #)$ cd drama_bare_repo

hairongchen:drama_bare_repo (BARE:master)$ ls

HEAD confighooksobjects

branches descriptioninforefs

退出

hairongchen:drama_bare_repo (BARE:master)$ cd ../..

对于已经有的工作环境,怎么增加git 管理呢?

hairongchen:Documents (master #)$ cd git

创建一个已有的目录,再进入目录

hairongchen:git (master #)$ mkdir git_init_repo

hairongchen:git (master #)$ cd git_init_repo/

再输入git init 就为我们初始化好了,例如以下:

hairongchen:git_init_repo (master #)$ git init

Initialized empty Git repository in /Users/hairongchen/Documents/git/git_init_repo/.git/

hairongchen:git_init_repo (master #)$

2)git clone获取一个仓库,因为git
clone 要一个远程地址,我这里没有,就用刚刚创建的裸仓库来clone

hairongchen:git_init_repo (master #)$ cd ..

hairongchen:git (master #)$ git clone git_bare_repo/ git_clone_repo

fatal: repository 'git_bare_repo/' does
not exist

hairongchen:git (master #)$ git clone drama_bare_repo/ git_clone_repo

Cloning into 'git_clone_repo'...

warning: You appear to have cloned an empty repository.

done.

假设是远程的仓库。不须要加后面的一个路径參数。它使用一个repo名称就能够了

3)有了git仓库。就能够进行git的基本流程了

git 仓库有三个区域:

working directory :工作区,我们时常编辑代码的地方。它维护着一个树型结构

staging area:暂存区。是工作区与历史仓库中间的一个缓存,它代表着是你提交的一个工作

状态,维护着是一个虚拟的一个树型结构

history repository;历史仓库。是我们前提到的commit指向的一个树型结构。git的工作就是环绕这三个区域进行的。

我们从working directory
加入文件到staging area里,然后把staging area里提交到history repository里

我们也能够从history repository里 checkout
这个project到working directory
里。

大部分时间我们都时往staging area暂存区加入东西,然后把staging area里提交到history
repository里。经常使用

1.git add

2.git commit

查看工作区与暂存区的差别来确保提交是我们所须要的呢?

用
3.git status

怎么来删除staging area区不须要的东西呢?

用4.git rm,

有时我们从工作区working directory
中重命名文件或移动文件,然后再把他们加入到暂存区里面

用5. git mv

最后是6.gitignore,
来确保我们工作区里一些不希望加入到暂存区和历史区中的文件加入进去

以下来进行演示:

创建一个仓库。并创建两个文件,加入到暂存区中

hairongchen:Documents (master #)$ git init git_basic

Initialized empty Git repository in /Users/hairongchen/Documents/git_basic/.git/

hairongchen:Documents (master #)$ cd git_basic

hairongchen:git_basic (master #)$ touch a

hairongchen:git_basic (master #)$ touch b

hairongchen:git_basic (master #)$ git add

Nothing specified, nothing added.

hairongchen:git_basic (master #)$ git add a b

再用git status
看一下:

hairongchen:git_basic (master #)$ git status

On branch master

Initial commit

Changes to be committed:

(use "git rm --cached <file>..." to unstage)

new file:   a

new file:   b

这两个文件是一个初始的提交,再有git commit
提交,那么这两个文件就提交到历史记录中去了如:

hairongchen:git_basic (master #)$ git commit -m "Initial commit"

[master (root-commit) d4] Initial commit

files changed, insertions(+),
deletions(-)

create mode a

create mode b

改动一下a文件

hairongchen:git_basic (master)$ vim a

用git status来看一下,显示a文件改动了。但没有保存到暂存区里面。也就是说它还没被准备提交

hairongchen:git_basic (master *)$ git status

On branch master

Changes not staged
for commit:

(use "git add <file>..." to update what will be committed)

(use "git checkout -- <file>..." to discard changes
in working directory)

modified:   a

no changes added to commit (use "git add"
and/or "git commit -a")

用git add a
加入到暂存区中,再用git status,
告诉我们a已经准备提交了:

hairongchen:git_basic (master *)$ git add a

hairongchen:git_basic (master +)$ git status

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

modified:   a

再用git commit - “modify a”
进行提交:

hairongchen:git_basic (master +)$ git commit -m"mofify a"

[master ab6e] mofify a

file changed, insertion(+)

删除文件

我们删除a文件,用git rm a ,它将工作工区各暂存区全删除:

hairongchen:git_basic (master)$ git rm a

rm 'a'

hairongchen:git_basic (master +)$ ls

b

hairongchen:git_basic (master +)$ git status

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

deleted:    a

它告诉我们,当我们git commit 命令时,
就相当于这个历史里就没有a文件了

我们原还一下:

hairongchen:git_basic (master +)$ git reset HEAD a

Unstaged changes after reset:

D a

hairongchen:git_basic (master *)$ ls

b

hairongchen:git_basic (master *)$ git checkout a

hairongchen:git_basic (master)$ ls

a b

假设我们仅仅删除暂存区里的文件,而不删除工作里的文件呢?

用git rm — cached a :

hairongchen:git_basic (master)$ git rm --cached a

rm 'a'

hairongchen:git_basic (master +)$ git status

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

deleted:    a

Untracked files:

(use "git add <file>..." to include
in what will be committed)

a

显示它还没有一个跟踪的文件

我们能够用git add 又一次加到暂存区:

hairongchen:git_basic (master +)$ git add a

有时候我们的文件被重命名或移动路径:

把a 重命名为c:

hairongchen:git_basic (master)$ git mv a c

hairongchen:git_basic (master +)$ git status

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

renamed:    a -> c

它告诉我们这里有一个reset操作。实际上git
并没有文件的命名和移动操作,实际是一种操作的组合

我们改动回去 git mv c a

直接在自己的工作区改动:

hairongchen:git_basic (master +)$ git mv c a

hairongchen:git_basic (master)$ mv a c

hairongchen:git_basic (master *)$ git status

On branch master

Changes not staged
for commit:

(use "git add/rm <file>..." to update what will be committed)

(use "git checkout -- <file>..." to discard changes
in working directory)

deleted:    a

Untracked files:

(use "git add <file>..." to include
in what will be committed)

c

no changes added to commit (use "git add"
and/or "git commit -a”)

它告诉我们说a被删除了,还没有被暂存,同一时候有一个c
文件,没有被纳入跟踪

再次输入git add a c :

hairongchen:git_basic (master *)$ git add a c

hairongchen:git_basic (master +)$ git status

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

renamed:    a -> c

git mv 所做的事情:

在工作区把你的文件重命名或移动,在暂存区把原有的文件删除了。然后再把新的文件加入到暂存区

最后是6.gitignore,
来确保我们工作区里一些不希望加入到暂存区和历史区中的文件加入进去

进入一个文件夹:

cd  ../git_ignore_demo/

vim .gitignore

*.[oa]   #以o
和a 结尾的文件
不要加入到git
仓库中

*~ #vim 中间文件

*.pyc #全部的pyc不要中入git
仓库中

!test.pyc #test.pyc要纳入git
仓库中。告诉git 
这个文件不要被忽略

\!text.py #对于文件名称中有!时,在前加\ !text.py不要被忽略

foo/ #以/结尾代表是一个文件夹,这样子的话,就匹配不到foo文件了

**/res #匹配个或多个文件夹

#假设其它文件都不须要都能够加进来

build/

Documenation/

src/

.DS_Store

用 git status查看

用git add .gitingore
增加进入,用于整个仓库的共享

git commmit -m “add ignore"

Git 主要的工作流程的更多相关文章

  1. git概念及工作流程详解

    git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...

  2. [git] git 分支管理和工作流程

    分支管理 列举本地分支.下面的 * 是 HEAD 所指向的分支,标识当前工作目录所用的分支.其他分支隐藏在 git 仓库中,通过 git checkout 命令才能访问和修改. $ git branc ...

  3. Git基本命令 -- 基本工作流程 + 文件相关操作

    可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...

  4. 基于git的工作流程

    本文针对的是追求极致.快速的产品响应团队的.以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习. 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多 ...

  5. 如何让Git适应敏捷开发流程?

    一旦涉及到版本控制系统,Git实际上代表敏捷开发的水平.Git作为一款强大的开源系统,有较强的灵活性,可以按需匹配任何开发团队的工作流程.而这种分布式相比较集中式来说,可以赋予系统更好的性能特征,且允 ...

  6. Git 工作流程

    Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去.”工作流程”在英语里,叫做”workflow”或者”flow”,原意 ...

  7. git工作流程

    git工作流程 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修改. 提交修改. 在修改完成后,如果发现错误,可 ...

  8. git的工作流程(分支合并)

    git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: 去自己的工作分支$ git checkout work 工作.... 提交工作分支的修改$ ...

  9. Subversion/Git/ReviewBoard工作流程

    根据My (work)Git Workflow进行修改,在 Windows下进行测试,http://mojodna.net/2009/02/24/my-work-git-workflow.html 目 ...

随机推荐

  1. $P2299 Mzc和体委的争夺战$

    \(problem\) #ifdef Dubug #endif #include <bits/stdc++.h> using namespace std; typedef long lon ...

  2. Unity学习-摄像机的使用(六)

    快速对齐摄像机 [选择摄像机-GameObject-Align With View] Game模板中显示的界面,就是摄像机拍摄后的画面 本次学习案例 添加一个地形,一个点光源,三个Cube   了解摄 ...

  3. 12.Nodes

    Nodes(节点) Animation(动画)       KeyframeAnimation 逐帧动画,该节点中包含了所有绑定属性的动画逻辑   Animation Group 逐帧动画分组   S ...

  4. jQuery——jQuery选择器

    基本选择器 # Id选择器 $(“#btnShow”)选择id为btnShow的一个元素 . 类选择器 $(“.liItem”)选择含有类liItem的所有元素 ele 标签选择器 $(“li”)选择 ...

  5. html——相对路径、绝对路径(有待补充....)

    相对路径主要看你访问的文件相对自己的页面在哪个文件夹下.如果自己藏的很深,必须用“../”跳出.如果项目中的文件位置分布是这样: 那么index页面若要访问这两张图片就需要用相对路径: <img ...

  6. python编辑csv

    import csv import time def timestamp_to_timestr(timeStamp): timeArray = time.localtime(int(timeStamp ...

  7. 【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)

    报错没有关闭,直接可以用UpdateXml函数 http://192.168.136.128/sqli-labs-master/Less-50/?sort=1 and UpdateXml(1,conc ...

  8. 浅谈SOCKS5代理与HTTP代理的应用区别

    [1]什么是SOCKS5协议. SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递.SOCKS是"Sockets”的缩写. 当防火墙后的客户端要访问外部的服务器时,就 ...

  9. DECLARE_DYNAMIC

    DECLARE_DYNAMIC(class_name) DECLARE_DYNCREATE 包含了DECLARE_DYNAMIC的功能,并且可以在运行过程中动态创建对象.如果需要动态创建类对象,需要使 ...

  10. Navicat 导出为 Excel 文件

    1:先选择一个表 再点击导出向导 2:看图   3:选择保存的路径  4:选择字段    5:最后执行吧