Git
是一个免费且开源的版本控制
系统,是目前最为流行的源代码管理
工具,本篇文章从Git
的基本指令到进阶操做,包含了使用Git
的过程当中遇到的大部分大小问题
设置用户名和邮箱
前端
$ git config --global user.name "用户名" $ git config --global user.email "邮箱" - 其中,--global 是全局设置,若是想对特定项目使用不一样配置,可取消该参数 - git config 还能够设置其余选项,由于平时不怎么用,因此详细能够参考 git config --help
查看配置
node
$ git config --list # 查看 Git 的某一项配置 $ git config user.name
建立 SSH Key
git
$ 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 status -sb // 查看 branch 和 short status # 查看提交历史 $ git log
# 克隆 $ git clone 仓库地址 # 远程仓库 $ git remote # 分支 $ git branch 分支名 // 建立 $ git checkout 分支名 // 切换 # 合并 $ git merge 分支名 # 拉取更新 $ git fetch 主机名 分支名 // 不合并 $ git pull 主机名 分支名 // 合并 # 推送 $ git push 主机名 分支名 # 打标签 $ git tag -a 版本号 -m "版本说明"
经过 HTTPS
访问 Git
远程仓库时,若是服务器的 SSL
证书未通过第三方机构签署,那么 Git
就会阻止这一操做github
$ env GIT_SSL_NO_VERIFY=true git clone 仓库地址 $ cd 仓库名称 $ git config http.sslVerify "false" - 使用 env 命令保证了忽略证书错误只应用于这次克隆
当有未提交的修改,执行 切换分支
或 拉取更新
须要仓库状态保持 clean
的一些操做时,可使用 git stash
将目前的修改临时储藏起来web
# 储藏 $ git stash # 查看储藏 $ git stash list # 应用最近储藏并删除 $ git stash pop # 应用指定储藏不删除 $ git stash apply [储藏名] # 移除储藏 $ git stash drop 储藏名
对于 工做区
和 暂存区
的修改,咱们不能保证上次操做是完美的,git
就是这么强大,提供了不少 反悔
的操做vim
# 丢弃暂存区的文件,放回工做区 $ 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 branch dev # 建立并切换到开发分支 $ git checkout -b dev # 切换回主分支 $ git checkout master # 快速检出上一个分支 $ git checkout - # 查看全部分支 $ git branch -a # 查看合并到当前分支的分支列表 $ git branch --merged # 查看还没合并到当前分支的分支列表 $ git branch --no-merged # 删掉临时分支 $ git branch -d fix # 将开发分支推送到远程仓库 $ git push origin dev # 重命名分支 $ git branch -m dev develop # 删除远程分支 - $ git push origin --delete 分支名 - $ git push origin :分支名
软件要发布一个新的版本的时候,咱们一般给它打个 tag
app
# 打标签 $ 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 commit -m "a no chnage commit" --allow-empty 主要用于一下情形: - 标记新的工做或一个新功能的开始 - 记录对项目的跟代码无关的改动 - 跟使用你仓库的其余人交流 - 做为仓库的第一次提交,由于第一次提交后不能被 rebase
$ git pull = git fetch + git merge $ git pull --rebase = git fetch + 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
文件来忽略上述文件,下面是一个前端工程忽略的文件参考ssh
# 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
能够提供更多的历史信息,方便 快速浏览和查找
,还能够直接生成 Change log
,通常至少包含 type
和 subject
,type 是 commit 的类别,subject 是 commit 的简短描述curl
## type - feat:添加新功能 - fix:修补缺陷 - docs:修改文档 - style: 修改格式 - refactor:重构 - perf:优化 - test:增长测试 - chore:构建过程或辅助工具的变更 - revert:回滚到上一个版本
除此以外,有兴趣的同窗还能够添加 gitmoji 和 validate-commit-msg 等更多内容
若是某个提交修复了一个 Issue
,当提交到某个分支时,提交信息里可使用 fix/fixes/fixed
, close/closes/closed
或者 resolve/resolves/resolved
等关键词,后面再跟上 Issue
号,这样就会关闭这个 Issue
$ git commit -m "fix: ..., fix #1, #2"
这将会关闭 Issue #1 和 #2
,而且在 Issue
讨论列表里关联引用此次提交
若是想连接 其余仓库的 Issue
,则使用 {user}/{repo}#ISSUE_NUMBER
在建立一个仓库时,Github
会为你提供一个预置的软件许可证列表
若是此时没有选择,后来能够经过 web 界面 create new file
,输入 LICENSE
,点击右侧的 choose a license template
来添加
Octotree
:提供项目目录GitHub Plus
:提供每一个文件的大小和下载连接GitHub Hovercard
:悬停在用户头像或仓库地址上时,经过悬浮框提供更多信息Sourcegraph for GitHub
:提供 IDE 上经常使用的功能操做Awesome Autocomplete for GitHub
:提供更强大的智能搜索Isometric Contributions
:更友好地展现提交记录Git.io 是 Github 的 短网址
服务
你能够经过 Curl
命令以普通 HTTP
协议使用它
$ curl -i https://git.io -F "url=https://github.com/..." HTTP/1.1 201 Created Location: https://git.io/abc123 $ curl -i https://git.io/abc123 HTTP/1.1 302 Found Location: https://github.com/...
Gists 方便咱们管理代码片断,没必要使用功能齐全的仓库
Gist
能够很是方便地获得便于嵌入到其余网站的 HTML 代码
并且,Gists
能够像任何标准仓库同样被克隆,你能够像 Github
仓库同样去修改和更新 Gists
,只不过,Gists
不支持目录,全部文件都添加在仓库的根目录下
github 仓库页面
提供了一些 快捷键
方便你们快速导航,按 ?
能够查看当前页面支持的 快捷键列表
咱们在 Pull Requests
, Issues
, commit
, Markdown
文件中能够加咱们喜欢的表情,使用方法以下
:name_of_emoji:
好比 :joy:
会返回一个
更多表情,可参考 emoji-cheat-sheet
其中,可能经常使用的表情有
:tada:
:sparkles:
:bug:
: :white_check_mark:
: :wrench:
:ok_hand:
:construction_worker:
:whale:
:clap:
关于 Git
,若是还有 更有意思的内容或问题
,欢迎在评论中交流