Git

Git入门

Git实践

Posted by Bug1024 on June 13, 2017

前言

  • Git是一个快速、可扩展的分布式版本控制系统(Svn是集中式)
  • 分布式版本控制的优点
    • 没有“中央服务器”,每个人的电脑上都是一个完整的版本库
    • 工作的时候不需要联网,因为版本库就在本地,因此可以轻松进行版本管理,而svn服务器挂了或断网时就无法commit
  • 存储内容
    • svn使用的是增量文件系统(Delta Storage systems)存储每次提交(commit)之间的差异
    • Git会记录每次提交的文件的全部内容(snapshot)

基础

常用命令

工作区&暂存区&版本库

关系图

  • 工作区
    • 用户本地coding的目录
  • 暂存区
    • 英文叫stage, 或index
    • 一般存放在 “.git目录下” 下的index文件(.git/index)中
  • 版本库
    • 工作区有一个隐藏目录.git,这就是Git的版本库

origin的概念

  • git为你默认创建的指向这个远程仓库的标签
  • 可使用 git remote -v 查看origin具体指向的远程仓库

开发流程

  • 克隆仓库
    • 默认克隆maser分支 git clone git@github.com:bug1024/jeet-vim.git
    • 克隆指定的分支 git clone -b bug_fix git@github.com:bug1024/jeet-vim.git
    • git clone 支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等
  • 检出分支
    • 基于当前本地分支创建并切换到develop分支 git checkout -b develop
    • 基于远程分支创建并切换到develop分支 git checkout -b develop origin/develop
  • 修改代码
  • 查看文件状态
    • git status
  • 查看具体的改动
    • git diff
  • 将改动的文件添加到暂存区
    • 添加指定的文件 git add 文件1 文件2
    • 添加所有改动文件 git add .`
  • 将暂存区的文件纳入版本库
    • 一次commit就是一个版本 git commit
  • 将当前分支同步到远程仓库
    • git push
    • git push 的默认行为和gitconfig配置文件中push.default选项相关,参考
  • push失败
    • 通常是由于远程分支有了新的版本提交
    • 直接拉取,会产生额外的merge git pull
    • 拉取远程分支,以此为基础,不会产生额外的merge(推荐)git pull --rebase,更多戳我
    • 使用git push -f 可强制推送(慎用)
  • 解决冲突
    • 查看冲突文件 git status
    • 解决冲突,保存文件
    • git add & git commit & git push
    • 参考 解决冲突

最佳实践

  • 保持本地分支和远程分支名一致
  • 保持本地分支和master分支同步,即时常git merge master 或者 git rebase master两种方式的区别
  • 完善git配置,可参考git配置,这是我的配置文件
  • 配置加强的终端,比如oh-my-zsh,可方便的在终端上显示git分支名称,改动状态等
  • 使用额外工具,比如tig,MacOS下安装直接brew install tig
  • commit时尽量最小粒度提交,不要将所有改动做一次提交,注释信息中避免只写update,fix bug等,通常提交类型包括
    • feature (feature)
    • fix (bug fix)
    • docs (documentation)
    • style (formatting, missing semi colons, …)
    • refactor
    • test (when adding missing tests)
    • chore (maintain)

代码回滚

  • 清理工作区中没有被track的文件 git clean -f
  • 移除所有没有被追踪的文件或目录 git clean -dfx
  • 撤销改动过但未add的文件 git checkout -- 文件1
  • 撤销add过但未commit的文件 git reset 文件1
  • 回滚某个文件到指定版本 git reset 版本号 文件1
  • 回滚版本库到指定版本(不会保留本地改动, soft会保留本地改动) git reset --hard 版本号
  • git log找不回commit时可以使用git reflog
  • 合并前3个commitgit rebase -i HEAD~4

其他命令

  • checkout指定文件,git checkout origin/remote_branch_name -- file_path
  • 追加最近一次的commit,git commit --amend
  • 删除远程分支, git push origin :remote_branch_name
  • 切换到上一次分支 git checkout -

参考