Git 基本的工作流程

来源:互联网 发布:ubuntu桌面版当服务器 编辑:程序博客网 时间:2024/05/18 02:32

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 仓库分两种,一种是裸仓库,它不带工作区,通常用于服务器,方便其他用户进行协作


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这个工程到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 changesin 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 changesin 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"


0 0
原创粉丝点击