Git 主要的工作流程
Git使用40个16进制字符的SHA-1
Hash来唯一标识对象
如:e98757d0598ab6eeaf1df0d87dd00826048bd80b
git 有4种对象
1、blob
表示文本文件,二进制文件或者是链接文件
2、tree
3、commit
大多数情况,commit 代表是一个历史提交
4、tag:指向一个固定的一个历史提交
四者之间的关系:
一个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"
Git使用40个16进制字符的SHA-1 Hash来唯一标识对象 如:e98757d0598ab6eeaf1df0d87dd00826048bd80b
git 有4种对象
1、blob 表示文本文件,二进制文件或者是链接文件
2、tree
3、commit 大多数情况,commit 代表是一个历史提交
4、tag:指向一个固定的一个历史提交
四者之间的关系:
一个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"