概念
Git 仓库有三个主要组成——工作目录,缓存区和提交历史。
1、git的工作区:<mark style="box-sizing: border-box;">在当前仓库中,新增,更改,删除文件这些动作,都发生在工作区里面。</mark>
2、git的暂存区:英文叫stage或index。在版本库.git/目录下,有一个index文件。它实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在Git对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。如果当前仓库,有文件更新,并且使用<mark style="box-sizing: border-box;">git add 命令,那么这些更新就会出现在暂存区中。</mark>
3、版本库:当前仓库下,如果没有任何的提交,那么版本库就是对应上次提交后的内容。
当对工作区修改(或新增)的文件执行 “git add” 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 “git rm –cached ” 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 “git checkout .” 或者 “git checkout – ” 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
使用git diff查看各个区之间的差异
使用命令 | 代表意义 |
---|---|
git diff | 比较的是工作区和暂存区的差别 |
git diff –cached | 比较的是暂存区和版本库的差别 |
git diff HEAD | 可以查看工作区和版本库的差别 |
区域 | 命令 | 区域 |
---|---|---|
工作区 | git add | 暂存区 |
暂存区 | git commit | 本地仓库 |
本地仓库 | git push | 远程仓库 |
操作 | GIT | SVN |
---|---|---|
检出/复制/克隆 | git clone | svn checkout |
提交 | git commit | svn commit |
查看提交的详细记录 | git show | svn cat |
确认状态 | git status | svn status |
确认差异 | git diff | svn diff |
确认记录 | git log | svn log |
添加 | git add | svn add |
移动 | git mv | svn mv |
删除 | git rm | svn rm |
取消修改 | git checkout / git reset | svn revert |
创建分支 | git branch | svn copy |
切换分支 | git checkout | svn switch |
合并 | git merge | svn merge |
创建标签 | git tag | svn copy |
更新 | git pull / git fetch | svn update |
反映到远端 | git push | svn commit |
忽略档案目录 | .gitignore | .svnignore |
初始化
$ git init:(在工作目录中初始化新仓库)
$git clone [url]:(从现有仓库克隆)
$ git clone git://github.com/schacon/grit.git mygrit
更新仓库
工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪
已跟踪:
已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。
未跟踪:
而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改.
$ git status:(检查当前文件状态)
$ git add :(跟踪新文件)(暂存已修改文件)
$git diff: (查看已暂存和未暂存的更新)
$git diff --cached:(查看已经暂存起来的变化)
.gitignore文件:(忽略某些文件)
$ git commit:(提交更新)
每次准备提交前,先用 git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit
$ git commit
这种方式会启动文本编辑器以便输入本次提交的说明。默认是vim,也可通过git config --global core.editor命令指定你喜欢的编辑软件
$ git commit -m "Story 182: Fix benchmarks for speed"
$ git commit -a -m 'added new benchmarks':(跳过使用暂存区域)
$ git rm [filename]:(移除文件)
$ git rm --cached [filename]:
把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。
$ git mv file_from file_to:(移动文件)
查看历史
$git log:(查看历史提交信息)
$ git log -p -2:(查看最近两次提交信息)
$ git log -U1 --word-diff:(单词层面的对比)
$ git log --stat:(显示简要的增改行数统计)
撤销操作
$ git commit --amend:(修改最后一次提交)
$ git reset HEAD benchmarks.rb:(取消已经暂存的文件)
$ git checkout -- benchmarks.rb:(取消对文件的修改)
远程仓库
git remote:(Git 默认使用origin来标识你所克隆的原始仓库)
$ git remote //查看当前的远程库
origin
$ git remote show origin //查看远程库origin的详细信息
$ git remote rename pb paul //远程仓库重命名
$ git remote rm paul //移除数据库
$ git remote add pb git://github.com/paulboone/ticgit.gi //添加远程仓库,仓库名为pb
git push:(从远程仓库抓取数据)
$ git fetch [remote-name]
git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
git pull:(从远程仓库抓取数据,并自动合并)
$ git fetch [remote-name]
git push:(将本地仓库中的数据推送到远程仓库)
$ git push [remote-name] [branch-name]
$ git push origin master
关于代码回滚
git reset、git checkout 和 git revert 是你的 Git 工具箱中最有用的一些命令。它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文件。
git clone git commit git fetch git merge git pull git status
HEAD branch: master Remote branch: master tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
网友评论