Git 主要的工作流程
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使用个进制字符的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 主要的工作流程的更多相关文章
- git概念及工作流程详解
git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...
- [git] git 分支管理和工作流程
分支管理 列举本地分支.下面的 * 是 HEAD 所指向的分支,标识当前工作目录所用的分支.其他分支隐藏在 git 仓库中,通过 git checkout 命令才能访问和修改. $ git branc ...
- Git基本命令 -- 基本工作流程 + 文件相关操作
可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...
- 基于git的工作流程
本文针对的是追求极致.快速的产品响应团队的.以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习. 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多 ...
- 如何让Git适应敏捷开发流程?
一旦涉及到版本控制系统,Git实际上代表敏捷开发的水平.Git作为一款强大的开源系统,有较强的灵活性,可以按需匹配任何开发团队的工作流程.而这种分布式相比较集中式来说,可以赋予系统更好的性能特征,且允 ...
- Git 工作流程
Git 作为一个源码管理系统,不可避免涉及到多人协作. 协作必须有一个规范的工作流程,让大家有效地合作,使得项目井井有条地发展下去.”工作流程”在英语里,叫做”workflow”或者”flow”,原意 ...
- git工作流程
git工作流程 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修改. 提交修改. 在修改完成后,如果发现错误,可 ...
- git的工作流程(分支合并)
git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: 去自己的工作分支$ git checkout work 工作.... 提交工作分支的修改$ ...
- Subversion/Git/ReviewBoard工作流程
根据My (work)Git Workflow进行修改,在 Windows下进行测试,http://mojodna.net/2009/02/24/my-work-git-workflow.html 目 ...
随机推荐
- win10 激活方法 (各版本)
很多人都在找Win10专业版永久密钥,其实win10激活码不管版本新旧都是通用的,也就是说一个win10专业版key,可以同时激活windows10专业版1809.1803.1709.1703.160 ...
- 分享一些对IT人员非常好用的资源
前言 分享一下本人工作至今整理的一些好用的资源,这些资源主要是一些工作和生活中用到的文档.软件和网站. 文档主要是面试相关的文档和技术文档,其中面试文档主要是Java这块的,技术文档就有很多,除了Ja ...
- 2 我们的C#学习方法
在这里我们借鉴了一种行之有效的学习编程语言的方法,并在此基础上进行了相应的改良.我们在培训新人中使用后,发现这种学习方法是非常有效的. 你通过做以下几个步骤来一步步学习C#语言. 1. 搞懂每一个我们 ...
- 回收maven私仓过期垃圾
login->scheduled tasks->add
- 记Spring下autowire为name时的一个现象
当autowire为byname时,假如有一个名为“user”的component,恰巧还有另一个属性为“user”,它的set方法为setUser(User user),Spring会强行把comp ...
- wordpress 你所不知道的固定链接设置方法,设置适合自己的个性固定链接,适合SEO
%year% 年份,四位数字,例如2004年 %monthnum% 一年的月份,例如05 %day% 一个月的日子,例如28 %hour% 一天中的小时,例如15 %minute% 小时,例如 ...
- MySQL实现当前数据表的所有时间都增加或减少指定的时间间隔
DATE_ADD() 函数向日期添加指定的时间间隔. 当前表所有数据都往后增加一天时间: UPDATE ACT_BlockNum SET CreateTime = DATE_ADD(CreateTim ...
- CSS——个人资料demo
1.上下外边距合并,选最大值. 2.两个input标签在编辑中如果换行了,在浏览器中显示的时候会自动增加一些距离. <!DOCTYPE html> <html lang=" ...
- Linq处理decimal字段汇总Sum()为NULL
xxxxxxxx.Sum(f => f.jifen).GetValueOrDefault(0)
- java浅析
基本结构 1.以字节码的方式运行在虚拟机上,不是直接编译成机器码运行,所以性能上差于 C 但是高于 python这样的解释形语言. 笔者大学期间学习过 汇编和C,工作后使用python,对这两种语言有 ...