如何高效地使用 Git
2017-10-30 09:39
211 查看
Git是一个免费且开源的
版本控制系统,是目前最为流行的
源代码管理工具,本篇文章从
Git的基本指令到进阶操作,包含了使用
Git的过程中遇到的大部分大小问题
基本操作
初始化设置
设置用户名和邮箱
$ git config --global user.name "用户名" $ git config --global user.email "邮箱" - 其中,--global 是全局设置,如果想对特定项目使用不同配置,可取消该参数 - git config 还可以设置其他选项,因为平时不怎么用,所以详细可以参考 git config --help
查看配置
$ git config --list # 查看 Git 的某一项配置 $ git config user.name
创建 SSH Key
$ ssh-keygen -t rsa -C "邮箱" # 然后会在用户主目录下,发现 .ssh 目录,其中包含 id_rsa 和 id_rsa.pub 两个文件 # id_rsa.pub 是 SSH Key 公钥,将其添加到 github 的 SSH keys 中,就可以将本地仓库推送到远程仓库了
创建本地仓库,进行基本源代码管理
# 初始化仓库 $ git init # 将源代码提交到暂存区 $ git add . # 提交暂存区的源代码 $ git commit -m "本次提交说明" # 查看当前状态 $ git status # 查看提交历史 $ git log
将本地代码同步至远程仓库
# 克隆 $ git clone 仓库地址 # 远程仓库 $ git remote # 分支 $ git branch 分支名 // 创建 $ git checkout 分支名 // 切换 # 合并 $ git merge 分支名 # 拉取更新 $ git fetch 主机名 分支名 // 不合并 $ git pull 主机名 分支名 // 合并 # 推送 $ git push 主机名 分支名 # 打标签 $ git tag -a 版本号 -m "版本说明"
进阶操作
忽略 SSL 证书错误
通过HTTPS访问
Git远程仓库时,如果服务器的
SSL证书未经过第三方机构签署,那么
Git就会阻止这一操作
$ env GIT_SSL_NO_VERIFY=true git clone 仓库地址 $ cd 仓库名称 $ git config http.sslVerify "false" - 使用 env 命令保证了忽略证书错误只应用于此次克隆
储藏
当有未提交的修改,执行切换分支或
拉取更新需要仓库状态保持
clean的一些操作时,可以使用
git stash将目前的修改临时储藏起来
# 储藏 $ git stash # 查看储藏 $ git stash list # 应用最近储藏并删除 $ git stash pop # 应用指定储藏不删除 $ git stash apply [储藏名] # 移除储藏 $ git stash drop 储藏名
撤消操作
对于工作区和
暂存区的修改,我们不能保证上次操作是完美的,
git就是这么强大,提供了很多
反悔的操作
# 丢弃暂存区的文件,放回工作区 $ git reset HEAD 文件 # 丢弃工作区的修改 $ git checkout -- 文件 - 修改后没添加到暂存区,则撤销到 git commit 时的状态 - 修改后添加到暂存区,则撤销到 git add 时的状态 # 覆盖上次提交 $ git commit --amend [-m "本次提交说明"]
版本回退
# 回退到之前的某次提交 $ git reset --hard commit_id - HEAD 指向当前版本 - git log 可以查看提交历史,以便确定要回退到哪个版本 - git reflog 可以查看命令历史,以便确定要回到未来的哪个版本 # 撤销一个已经提交 $ git revert commit_id - 并没有从项目历史中移除这个 commit, 而是生成一个新的 commit
分支
Git有很多优点,其中
分支使用方便就是很显著的一条,创建仓库的时候,
master是默认的分支,一般,我们会创建其他的分支在上面进行开发,完后再将它们合并到主分支上来
# 创建并切换到开发分支 $ git checkout -b dev # 切换回主分支 $ git checkout master # 删掉临时分支 $ git branch -d fix # 将开发分支推送到远程仓库 $ git push origin dev # 重命名分支 $ git branch -m dev develop # 删除远程分支 - $ git push origin --delete 分支名 - $ git push origin :分支名
标签
软件要发布一个新的版本的时候,我们通常给它打个tag
# 打标签 $ git tag [-a] 标签名 [-m 附注信息 某次提交的id] # 推送标签到远程仓库 $ git push origin 标签名 $ git push origin --tags // 推送所有标签 # 删除本地标签 $ git tag -d 标签名 # 删除远程标签 $ git push origin --delete 标签名 $ git push origin :refs/tags/标签名
花式查看提交
$ git log --pretty=oneline // 只显示一行 $ git log --abbrev-commit // 只显示 SHA-1 的前几个字符 $ git log --graph // 显示 ASCII 图形表示的分支合并历史 $ git log --relative-date // 使用较短的相对时间显示 $ git log --name-only // 仅在提交信息后显示已修改的文件清单 $ git log -n // 显示最近的 n 条提交 $ git log --author=fengshangwuqi // 仅显示指定作者相关的提交 $ git log --grep // 仅显示含指定关键字的提交
git pull 与 git pull –rebase 的区别
$ git pull = git fetch + git merge $ git pull --rebase = git fetch + git rebase
git merge 与 git rebase 的区别
# 相同点 整合的最终结果所指向的快照是一样的 # 不同点 ## 提交历史不同 - merge 会生成一个新的 commit 节点,提交历史忠实地记录了实际发生过什么 - rebase 不会产生额外的 commit 节点,提交历史反映了项目过程中发生了什么 ## 冲突处理策略不同 - merge 遇见冲突后会直接停止,等待手动解决冲突并重新提交后,才能再次 merge - rebase 遇见冲突后会暂停当前操作,开发者可以选择手动解决冲突,然后 git rebase --continue 继续,或 --skip 跳过,或 --abort 停止 # 注意事项 ## 推荐 git merge 结合 --no-ff 一起使用 - git merge 默认是 fast forward(快速合并),适用于分支 B 从分支 A 从 checkout 出来后,分支 A 没有 commit - 如果分支 B 被 checkout 出来后,分支 A 也有修改,那么就没法快速前进合并,会额外建立一个 merge commit,对分支 A 和分支 B 做一个合并操作,即 --no-ff,它的好处是保持了分支的结构
其他
忽略特殊文件
对于操作系统自动生成的文件,
编译生成的中间文件,以及带有
敏感信息的配置文件等,我们不想追踪,也不想放进我们的远程仓库中,这时,我们创建一个
.gitignore文件来忽略上述文件,下面是一个前端工程忽略的文件参考
# Logs logs *.log # Runtime data pids *.pid *.seed *.DS_Store # testing coverage # Dependency directory node_modules # Bower bower_components/ dist # WebStorm文件 *.idea/ # vscode文件 .vscode/ # Emacs .tern-port .#* *# *~ # vim .agignore # 敏感信息 default.yml
Commit message 指南
好的Commit message可以提供更多的历史信息,方便
快速浏览和查找,还可以直接生成
Change log,一般至少包含
type和
subject
type:commit 的类别
- feat:添加新功能 - fix:修补缺陷 - docs:修改文档 - style: 修改格式 - refactor:重构 - perf:优化 - test:增加测试 - chore:构建过程或辅助工具的变动 - revert:回滚到上一个版本
subject:commit 的简短描述
除此之外,有兴趣的同学还可以添加 gitmoji 和 validate-commit-msg 等更多内容
总结
关于Git,如果还有
更有意思的内容或问题,欢迎在评论中交流
相关文章推荐
- 【译】如何高效的使用 Git
- 深入理解string和如何高效地使用string
- 学习ns2过程中,如何在vim中使用cscope高效阅读代码
- 如何在svn系统中使用git
- Java高效运行必备:如何选择使用String、StringBuffer与StringBuilder
- 如何使用PHP开发高效的WEB系统 推荐
- 如何高效地使用XCodeFactory自动生成的数据层代码(二)
- 如何高效使用SQLite .net (C#)
- 如何高效使用JavaEE ORM框架
- 如何高效的使用循环缓冲区
- 如何在Windows上使用GIT下载Android源代码
- 如何使用PHP开发高效的WEB系统
- 如何高效在多个浏览器之间同步使用的5个工具技巧
- 9.1.1 Java高效运行必备:如何选择使用String、StringBuffer与StringBuilder
- [转]如何高效使用SQLite .net (C#)
- 解答:如何使用PHP开发高效的WEB系统
- 【经典】如何高效地使用string
- 如何尽可能高效地使用论坛+解决编程问题的一些方法
- 如何高效的使用循环缓冲区
- [原创]如何改善Managed Code的Performance和Scalability系列之二:深入理解string和如何高效地使用string