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 目 ...
随机推荐
- 51nod1446 Kirchhoff矩阵+Gauss消元+容斥+折半DFS
思路: //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using ...
- python 根据数组生成图片
array = np.asarray(allBigPng, dtype=np.uint8)image = Image.fromarray(array, 'RGBA') image.save(outpu ...
- html5——全屏滚动
鼠标滚轮 window.onmousewheel=function(){}; 基本描述 1.我们使用插件fullpage,为了更好的兼容性 2.动画效果是在滚动到这一屏时触发的,此时给当前屏幕加cur ...
- 易买网之smartupload实现文件上传
经过俩个星期的奋斗,易买网项目完工.在之前,实现图片的上传,走过许多弯路,原来是好多基础的知识忘记了,没把smartupload文件包添加组件jar包至WEB-INF/lib包中,在此特别重视,做下文 ...
- Python操作数据库及hashlib模块
一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA51 ...
- C# 打开模态对话框 和打开文件夹
C# 打开另一个窗体,(模态对话框) Form1 frm= new Form1(); //创建对象 DialogResult retServer = frm.ShowDialog(); //模式对话框 ...
- 黑苹果开启retina,大分辨率的方法
首先,管理分辨率RDM的软件这里下载: http://pan.baidu.com/s/1bpjL07P 在终端输入: curl -o ~/enable-HiDPI.sh https://raw.git ...
- 网络爬虫 robots协议 robots.txt
网络爬虫 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上 ...
- final关键字用法
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. final方法 ...
- const浅析
前言 c++中使用到const的地方有很多, 而且const 本身也针对不同的类型可能有不同的含义, 比如对指针就有顶层和底层. 本节就是探讨关于C++中const的在不同的地方不同表现或含义. co ...