SVN和Git,因为SVN要是主机挂了.所有记录都GG了.而Git是分布式的.而且Git平台比较多,GitLab,coding.net,GitHub等等
Git可以现在本地执行,可以在本地进行commit,而SVN每次commit都必须是提交到主机.(虽然笔者推荐多push,但是可以本地commit有时也是不错的,主要是保证本地能有备份)
SVN :
Git :
注意Git的存储图中,外面有间隔线的表明数据没有变化,存的只是索引.
SVN是差异比较,每个版本的文件依赖于上一个版本.
Git的每个版本的文件是独立存在的,是直接记录快照.
三个工作区域 :
三种状态:
其实还有二种形式可分 1. 未跟踪 : 在本地未git add的就是未跟踪的. 2. 已跟踪 : 上述三种状态都是已跟踪状态.
以上状态都可以通过git status查看 or 紧凑一点的git status -s
//ubuntu apt-get install git
其他版本系统 :http://git-scm.com/downloads
一开始设置用户名和邮箱
$ git config --global user.name "404_K" $ git config --global user.email [email protected]
更改git编译器
git config --global core.editor 命令设定你喜欢的编辑软件
详情输入git config查看 or git help config
初始化仓库
克隆现有仓库
git clone https://github.com/mzkmzk/Read.git [重命名本地目录]
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式(简化的正则)匹配。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反.
详细可参考https://github.com/github/gitignore
要从Git移除文件,必须git rm 掉已跟踪文件,并且commit到缓存区.并且在工作目录中删除指定文件.
会有几种情况
git rm 后面可跟glob
删除log下后缀为log的文件
git rm log/\*.log
为何要加\,因为不需要shell帮忙,git自行解析
git rm *~ ,所以~结尾的文件.
git mv README.md README
无论通过命名还是图形改名字,git都能检测出来
以上语句git会自动执行
mv README.md README git rm RADME.md git add README
git log参数说明
选项 | 说明 |
---|---|
-p | 显示更新差异 |
--stat | 显示修改统计信息 |
--shortstat | 只显示--stat中最后的行数修改统计 |
--name-only | 显示已修改文件清单 |
--name-status | 显示新增,修改和删除的文件清单 |
--abbrev-commit | 只显示SHA-1的前几个字符 |
--relative-date | 使用较短的时间显示 |
--graph | 图形显示分支合并历史 |
--pretty | 使用自定义格式显示历史提交信息 |
git log 限制输出
选项 | 说明 |
---|---|
-n | 仅显示n条提交 |
--after | 显示指定时间之后的提交 |
--before | 显示指定时间之前的提交 |
--author | 只显示该作者 |
--committer | 只显示该提交者 |
--grep | 显示关键字 |
-S | 只显示添加/删除了某个关键字的提交 |
当你先commit了一次,后面发现少add了一些文件/commit的信息写错了
git commit -m "first" git add other.js git commit --amend
当已经commit但想撤回提交到缓冲区.
git reset HEAD 文件名 404-K:My_Website maizhikun$ git add . 404-K:My_Website maizhikun$ git status On branch master Your branch is ahead of 'origin/master' by 7 commits. (use "git push" to publish your local commits) Changes to be committed: (use "git reset HEAD ..." to unstage)
modified: REAMDME.md 404-K:My_Website maizhikun$ git reset HEAD REAMDME.md Unstaged changes after reset: M REAMDME.md
想撤销工作区间的操作,
git checkout -- README.md,注意这会把git仓库中的文件覆盖掉你本地的文件.
标签分为两种附注标签和轻量标签
查看标签信息 git show 版本号
如果后期追加标签
git tag -a v0.2 SHA-1码
共享标签
git push origin 标签名称 //or 提交多个标签 git push origin --tags
检出标签
git checkout -b 分支名称 标签名称
git log --oneline --decorate可以查看分支父节点
创建新分支
git branch 分支名称
切换分支
git checkout 分支名称
删除分支
git branch -d 分支名称
合并分支
git merge 分支名称
查看当前分支和所有的分支
git branch git branch -v //查看每个分支最后一次提交 git branch --merged/--no-merged git branch --vv //查看设置所有跟踪的分支. //显示合并/未合并到当前分支的分支
git pull 和 git fetch
大多数情况下,git pull = git fetch + git merge
git fetch从服务器上抓本地没有的数据,它不会修改工作目录的内容,它只会获取数据.建议多使用git fetch,何时merge应该自己使用.
删除远程分支:当远程分支的工作完成了,也就是你和其他作者已经完成了指定任务并且merge到master分支上,就可以删除远程分支
git push origin --delete 远程分支名称
变基的作用是让开发线的注释会像串行一样显示,而非merge那样并行的显示.
合并分支,一般都使用merge或rebase
merge是指:当有两个分支分别改了代码,merge是把这两个分支和她们的共同祖节点进行合并,合并成新的分支.
rebase: 现在有两个并行的开发分支C3和C4,先把C4rebase到C3中,然后再到C3mergeC4,完成变基.
变基的玩法
一开始的情况
现在只想提交client到master,怎么办?.
$ git rebase --onto master server client git checkout master $ git merge client
完成目标.
变基的准则:不要对在你的仓库外有副本的分支执行变基
因为变基相当于丢弃现有的提交然后进行不同的提交,如果你已经把这个分支提交到仓库,别人抓了下来,你再向rebase修改,其他开发者必须和你进行合并修改.
git init --bare,可以生成一个空的仓库,初始化仓库时不会创建工作空间.
自行搭建git服务器建议gitlab,帮组文件
第三方git托管https://git.wiki.kernel.org/index.php/GitHosting
ssh-keygen通过设定以后,就会在~/.ssh发现公钥(.pub)和密钥了.
一般使用
ssh-keygen -t rsa -b 4096 -C "[email protected]"
树 用途 HEAD 上一次提交的快照,下一次提交的父结点 Index 预期的下一次提交的快照 Working Directory 沙盒
查看Index(下次准备push的)
git ls-files -s
重置命名 reset,原理
reset和checkout的危险性