Git 主要的工作流程

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

git 4种对象

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

2tree

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

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

四者之间的关系:

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


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


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


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


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


5.获得一个git仓库


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


1)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) 51686d4] Initial commit

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

create mode 100644 a

create mode 100644 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 269ab6e] mofify a

1 file changed, 1 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 #匹配0个或多个文件夹

                            

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

build/

Documenation/

src/

.DS_Store

git status查看

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

git commmit -m “add ignore"


posted @ 2017-05-26 16:55  cxchanpin  阅读(215)  评论(0编辑  收藏  举报