Author: huixincoming
Email:huixincoming@163.com
Vendor Recommend:vx luckymengling
很久没发文了,都配不上日更达人这个勋章了:-D,之前就是为了这个勋章坚持了一个月,现在是擦亮勋章的时候了!
git vs svn
git比svn好的3个点,快,分布式,有完整的历史
gitconfig global配置,使用前配置
git config --global user.name 'huixin'
git config --global user.emal 'huixincoming@163.com'
cat ~/.gitconfig
...
[user]
name = huixin
email = huixincoming@163.com
...
初始化代码仓库本地
-
git init testgit
,或者先创建testgit,在进入testgit,执行git init -
cd testgit && find .git
branches: repository分支的情况
config: 是一个local config,对于每个repository来讲都有个本地的config,如果在local config配置user和email那么当前repository会使用local config
description: 描述文件
HEAD: 指针
hooks: 是event hooks,我们可以写一些脚本,让它在commit之前先运行这些脚本,pre-commit、pre-push等等,是shell脚本,编辑pre-commit,在运行git commit时,会先运行pre-commit脚本
objects: 描述存储的文件对象
ref: 描述引用信息
所有对repository的变更,都会通过.git下的文件做一个记录
添加文件检查状态
-
git add filename ...
, 将本地变化存储到index,也可以添加多个文件名字,或者用*添加所有变化,但不包括隐藏文件 -
git status
检查状态 -
find .git
发现比之前多了index,repository的变化保存到了index(这是git比svn快的原因);提交版本的时候只会把这个变化提交上去
objects 文件夹下也会比之前多了东西,最终所有代码仓库里的文件都是通过objects做存储的,它要标识出有哪些文件。
commit将变化提交到版本管理系统
-
git commit -m 'balabala'
说明本次提交,也可以git commit
进入文件进行编辑
输出说明:
第一行
1 master,提交是在哪个分支,默认是master分支
2 root-commit, 本次提交是在哪一次提交的基础上提交的,因为是初次提交,所以是root-commit
3 哈希值,本次提交代号,一个唯一标识
4 本次提交的描述
第二行
文件变化总览
第三行
操作简要 -
git log
查看提交历史 - 配置local .git/config,这样再次提交就会使用本repository的config配置
[user]
name = XXX
email = xxx@xxx.com
ignoring files
代码的产物不应放在源码管理系统里面(repository)
-
vim .git/info/exclude
可将不想包含到源码的文件写到里面,可以使用通配符(*代表所有,但不包含隐藏文件;*.py[cod]意思是不包含*.pyc,*.pyd,*.pyo)。存在问题会有多人合作同时开发项目,这个设置只在本地生效,无法共享 -
vim .gitignore
本身是源代码仓库的文件,对任何开发者都生效;git add \*
不会添加 . 开头的文件 ,git add .
会添加当前路径下所有变更的文件 - 对已经add的文件添加到 .gitignore,可通过
git rm --cached filename
,将添加进本地仓库的文件remove
撤销提交命令
-
git reset --hard HEAD~
回退到上一个版本, 不保留本地修改 -
git reset --soft HEAD~
回退到上一个版本,但是保留本次提交的本地修改,相当于撤销了上一次git commit,保留了上一次git add,这个回退给你重新修改commit的机会 -
git reset HEAD~
回退到上一个版本,保留本次提交的本地修改,但是没有add进本地库,相当于上一次的git commit, git add 都被撤销,此时可以git diff查看修改。
如果想与上一次commit的描述相同的话,快捷的方式 可以在commit的时候的使用git commit -c ORIG_HEAD
(只有使用了reset后才会有ORIG_HEAD),会直接把之前那次head的commit message带过来 -
git commit --amend
向上一次的提交添加遗漏,相当于将遗漏文件 append到上一次commit
先执行 git add 将想要append的文件提交到本地repository
然后执行 git commit --amend 将遗漏添加到上一次commit,同时也可以修改上一次的描述
Local Repository,Staging Area and Working Directory
- LocalRepository:代码提交(commit)到本地仓库形成的历史
- WorkingDirectory:工作目录,本地通过文件浏览能够看到的所有东西
- StagingArea:当我们要在WorkingDirectory做一些改变的时候,会与LocalRepository有一些不同,我们想把这些不同提交到LocalRepository形成一次新的commit的时候,我们如何决定哪些内容想通过git commit 提交,我们需要把想要提交的内容通过git add命令添加到StagingArea里面,当我们运行git commit命令的时候只会把我们添加到StagingArea中的不同(diff),commit到LocalRepository里面。
- 通过
git log
会看到历史的提交, -
git log --oneline
只会看到每次提交的哈希值,以及这次提交commit的message,方便我们查找<commit-id>
撤销命令详述
- 如图,当我们把LocalRepository的指针指到第一次提交之后,我们之前的2次提交怎么处理?
可以通过git reset命令行的一些参数,实现对这2次提交的不同处理 -
git reset <commit-id>
, 回滚到指定的那次提交,保存了修改的文件,但撤销了指定commit-id前的所有git add和git commit。即将LocalRepository的指针指导了第一次提交,然后将后2次提交的内容保存到了WorkDirectory,并没有加入到StagingArea。此时可以使用diff,也可以进行二次修改。 -
git reset <commit-id>~2
,回滚到指定提交,再往前数2次的那次提交 - 配合
git log --online
可以方便到查找历史版本 -
git reset --mixed <commit-id | reference>
,和git reset <commit sha1|reference>
一样的。是保守的、安全的回滚。会将指定版本后所有的提交都保存到WorkingDirectory。给我们第二次修改的机会。推荐 -
git reset --hard <commit-id | reference>
,激进的回滚。回滚到指定版本,并将指定版本后所有的提交都drop掉。在本地的WorkingDirectory中也看不见了。不推荐 -
git reset --soft <commit-id| reference>
,介于 hard 和 mixed 之间的回滚。会将指定版本后所有的提交都保存到WorkingDirectory并加入到StagingArea中。