工作区,版本库解析
参考链接:http://blog.csdn.net/felix_f/article/details/8777463
左边为工作区,即是我们平时看到的目录,右图为版本库,其中版本库中左侧的index为暂存区(stage, index),右侧为分支(图中为master)
- 我们修改工作区中的文件,通过add可以将修改到暂存区中;
- 当修改了工作区中的文件而没有add,通过checkout --<file>可以用暂存区中的文件替换工作区中的文件
- 而当我们已经add的时候,我们可以通过reset HEAD将master分支中的文件提交到文件恢复到暂存区当中
- 通过commit可以将add的内容添加到master分支中
- 通过rm --cached来删除暂存区中的某个文件
- 通过checkout HEAD <file>会用master分支中全部或者部分文件替换暂存区和工作区中的文件
常用命令
git clone clone一个工程到本地
- git clone <https>
git status 查看git工程当前的状态
从下图可以看出git status可以显示的结果可以分成三种情况:
- 已经commit的但是没有push的(版本库中master分支和网上的工程区别),即是下图中的:Your branch is ahead of 'origin/master' by 1 commit.
- 已经add的但是没有commit的(版本库中的master分支和暂存区的去呗),即是下图中的绿色部分
- 工作区中修改的但是没有add的(工作区和暂存区的区别),即下图中的红色部分
git add <path>将工作区中修改提交到暂存区
- -u 把<path>中所有tracked文件中被修改过或已删除文件的信息添加到索引库。它不会处理untracted的文件。
- -A [<path>]表示把<path>中所有tracked文件中被修改过或已删除文件和所有untracted的文件信息添加到索引库。
git checkout 将暂存区中的文件替换到工作区中
- git checkout branch 检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch 指向的树更新暂存区和工作区。
- git checkout/git checkout HEAD 汇总显示工作区、暂存区与HEAD的差异。
- git checkout -- filename 用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。
- git checkout branch -- filename 维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相 应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。
- git checkout -- . 或写作 git checkout .注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的 修改(相对于暂存区)。相当于用暂存区的所有文件直接覆盖本地文件
git commit 将暂存区中的内容提交到分支中
- git commit -m “messages” 参数后面跟字符串,告诉Git本次修改的说明信息。总是应该在每次提交的时候注明说明信息。
git push 将版本库中的内容push到远程分支上
git pull 将远程的分支pull到本地
gitignore
语法
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
以#表示注释
举例
保留工程中所有的.v文件,忽略其它所有的文件
**/*表示忽略工程中的所有文件
!**/*.v表示跟踪工程中的所有*.v文件
其中**表示目录递归
#save all verilog file(*.v)
**/*
!**/*.v
分支管理
当我们在程序开发过程中由于需求需要在目前的基础上进行开发一个新的功能,或者调试bug,或者分组开发的时候,而如果我们直接在这个基础上开发,那么就会影响到其他人的开发,这样我们就可以创建一个分支来进行开发,而影响主分支master上面的开发,而当我们开发并且调试完毕之后在merge到主分支上啊就可以。
本地分支
github中的分支管理采用的是一个HEAD的指针,其指向的是我们本地分支中的当前分支,其最初是指向master这个主分支的。而我们的提交(commit)就是在HEAD指向的这个分支下进行的提交。
当我们在github上面创建了一个 repository之后,然后采用git clone命令克隆到本地,git其默认创建了一个master的分支。
git branch 查看当前的分支。其中前面带星号的就是我们当前所在的分支。
git branch <branch_name> 创建一个名叫branch_name的分支,例如我们创建了一个dev的分支。
通过上图可以看到,创建了一个dev的分支,其指向了最新的commit3,但是此时HEAD指针其实还没有变,我们需要通过
git checkout <branch_name> 切换当当前的分支
此时我们就在dev分支下面进行开发了。 我们在dev下新建一个test文件,并且修改里面的内容通过add和commit命令提交。然后切换到master分支,发现master分支下并没有test这个文件
git merge <branch_name> 将某一个分支merge到当前的分支
我们可以git merge dev将dev分支merge到当前的分支上面,这样我们在master分支下就可以看到test文件了
git branch -d <branch_name> 用来删除分支
远程分支同步
前面所说的全部都是在本地进行开发,远程的仓库没有变化。当我们创建一个repository的时候,github会在远程建立一个master分支,并且将其和本地的master分支对应起来,我们可以通过
git branch -a来进行查看
可以看到远程只有一个master的分支,其HEAD指针指向了master分支,而本地有两个分支。此时如果我们通过git push origin dev就可以将其push到远程,并且在远程建立一个dev的分支,并且将该dev分支与我们本地的dev分支相对应。
而一种情况是我们在远程有好多的分支,而git clone默认的是克隆的是master分支下面的文件,其他分支不会被克隆,我们我们可以采用
git clone -b <branch_name> <url>的方式仅克隆某一个分支下面的文件。
或者我们克隆了master分支之后,我们可以在本地通过
git branch <branch_name> <remote_branch_name>的方式创建一个分支,并且将其和远程的分支进行同步。
总结
git branch
- git branch/git branch -v查看本地分支、
- git branch <branch_name> 创建分支
- git branch -a/-all 查看所有分支,包括远程分支
- git branch -d <branch_name> 删除分支
git checkout <branch_name> 切换当当前的分支
git merge <branch_name> 将某一个分支merge到当前的分支
git clone -b <branch_name> <url>的方式仅克隆某一个分支下面的文件。
git branch <branch_name> <remote_branch_name>的方式创建一个分支,并且将其和远程的分支进行同步。