## 书籍 & 教程推荐 > date: 2016-10-20 17:15 > svn 和 git 都用过,我只想说 —— 请使用 git - [GitHub 入门与实践](http://www.ituring.com.cn/book/1581) - [git 常用操作脑图](http://blog.csdn.net/kehyuanyu/article/details/41278797) - [git 简明指南](http://www.bootcss.com/p/git-guide/) - [git tutorial](https://try.github.io) - [廖雪峰的git教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) - [git 协作流程](http://kb.cnblogs.com/page/535581/) - [版本控制入门 – 搬进 Github](http://www.imooc.com/learn/390) - [Git实战_201703014](https://segmentfault.com/a/1190000008579494) - [一张图看明白Git的四个区五种状态](http://imtuzi.com/post/git-four-areas-five-states.html) - [回滚错误合并](https://segmentfault.com/a/1190000015792394) - [git hook 代码检测](https://www.longlong.asia/2015/08/08/git-pre-receive-hook.html) 大部分时候都直接使用 git bash,轻量级使用 gitk,diff、log 时使用 tortoiseGit,当然 sourceTree 也可以玩一玩 子目录中包括 `.git` 是只会提交一个空目录, `git status` 时要注意 - gitlab 回滚 - MR revert - github PR ## 基础概念 git clone 有 2 种形式: - ssh 方式需要提前配置私钥 - https 需要账号密码认证,不过可以通过如下配置自动记录 ``` git help xxx # get help git clone git@git.coding.net:daydaygo/project.git # ssh git clone http://git.coding.net/daydaygo/project.git # http git config -l # my config git config --global user.name "daydaygo" && \ git config --global user.email "1252409767@qq.com" && \ git config --global push.default simple && \ git config --global color.ui "always" && \ git config --global credential.helper "store" && \f git config --global format.pretty "oneline" && \ git config --global core.quotepath false && \ git config --global core.autocrlf false # 自动转换换行符 git config --global core.safecrlf true # 混合换行符警告 git config --global core.ignorecase false # git 忽略文件名大小写,导致 window 下修改 linux 下报错 git config --global core.filemode false git config --global alias.s status git config --global -- unset alias.s git config --global gui.encoding utf-8 # gitk 中文乱码 ``` ``` git commit # --amend 修改提交信息 git log --pretty=short --graph git log --grep='xxx' # 查询 commit msg git rebase -i # 压缩历史,比如修正拼写错误 # 获取远程分支 git fetch git checkout xxx # 新增远程仓库 git remote add url git push -u origin mater git push # 修改远程仓库 git remote set-url origin git://new.url.here # git pull 冲突 git stash git pull git stash pop git checkout . # 取消所有临时修改 # 增加 tag git pull git tag # 轻量级tag git tag -a xxx -m 'xxx' # 含附注tag, 推荐 git push --tags # 删除 tag/branch git push origin :<name> git push origin --delete <name> git branch -m old new # 分支重命名 gb --set-upstream-to=origin/dev-daydaygo-didi # 本地分支和远程分支关联 git show [十六进制码] # 显示某一个特定的提交的日志 git log --graph --pretty=oneline --abbrev-commit # 查看提交图 git ls-files -u # 查看冲突未处理的文件列表 # 修正错误的 commit git log # 查看 commit id git reset --hard e377f60e28c8b84158 # 回滚到指定的版本 // change coder git commit -am 'xxx' --amend # 修正错误的 commit git pull // merge git push git rm -r --cached .idea # 配合 .gitignore 修改 git fetch -p origin # 同步删除本地分支 # stash git stash git stash list git stash pop git stash apply # 子模块 submodule -> 最好不用,别增加复杂度了 # http://www.jianshu.com/p/b49741cb1347 git submodule add https://github.com/chaconinc/DbConnector # add git clone xxx # 原项目 git submodule init git submodule update git rebase master # 贡献开源代码特别有用,可以让 commit 看起来像一条线 git clean -xdf # 小心这条命令,gitignore 里面的文件也会被删除掉 # 多个远程仓库 git remote add origin https://url git remote set-url --add origin https://url # 再添加一个 git push --all # git hooks 实现不允许分支合并 # .git/hooks/commit-msg #!/c/bin/php/php <?php var_dump($argv); $str = file_get_contents($argv[1]); var_dump($str); if (strpos($str, "Merge branch 'rtest'") !== false) { echo "can not merge rtest \n"; exit(1); } # 代码自动发布 # 方式一: git hook post-receive https://www.jianshu.com/p/9c2fcd803877 # 方式二: .git/hooks/post-push #!/bin/sh ssh root@xyjf-dev 'cd /data/docker; git pull' # 全新分支 git checkout --orphan test git clean -df # git gc # 查找大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" # 删除文件 git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch bin/nspatientList1.txt' --prune-empty --tag-name-filter cat -- --s # 使用 gc 再次压缩 git gc --prune=now ``` `.gitignore`:需要忽略的文件,比如项目需要使用的配置、第三方依赖的文件夹 冲突: 将每次commit用线串起来, 不同分支上面的commit就可能将直线分为2个, 当合并这2个分支就可能遇到冲突; 解决冲突实际就是修改发生冲突的文件, 修改完之后再提交一次, 这次用来合并的分支和正在使用的分支, 都将指向新的commit 标签: 对外是软件发布的版本;对内实际是指向某个commit点的指针 pull request: 你自己的项目, 怎么折腾都行, 如果想贡献代码给他人的项目, 就需要先fork版本到自己的github, 折腾完了发起一个pull request 请求 issue: 大部分都是 bug,也有部分关于软件的改进 ## github - [Trending](https://github.com/trending) - [subscribe](https://github.com/explore/subscribe) - 添加github小图标: http://shields.io/ - github 汉化:52cik/github-hans tasklist 语法 通过提交信息操作 issue 给特定 issue 提交代码会转化为 pull request url 的用处:不同版本对比;同一分支不同时间对比;获取 diff、patch 格式文件 评论:使用 R 键引用选中的评论;使用 : 来使用表情 大部分软件使用 MIT 协议; MIT协议可以和其他许可协议共存 -- 基本就是在说使用 MIT 就没错,不行之后再多加协议it ### 快捷键 跳转面板:gc goto-code 文件搜索(code 面板下):t,类似 sublime,可以模糊匹配 聚焦到搜索框:s 搜索过滤 引用 issue:# 代码段选择 显示快键键:? ### github api ok.sh: https://github.com/whiteinge/ok.sh ``` cp ok.sh /usr/bin/gh gh delete_repo daydaygo test gh fork_repo swoft-cloud swoft ``` ## svn > 这年头还有人在用 svn, 但是也没办法呀 ``` svn h/? # help svn log # 看 log 还是图形化客户端更靠谱 svn di # diff svn st # status svn revert -R . # 取消未提交的修改 svn add svn ci # commit svn rm svn merge ```