git-分布式版本控制系统 学习笔记

176 阅读7分钟

工作场景使用提示

  • 对于未开始开发的新需求,需以release分支为源文件拉取新的开发分支,避免后期需求上线时与其他版本需求上线时间不一致,导致上线代码交杂。
  • 对于之前已开发的项目,启动另外新需求时,若重新以本地release分支为源文件拉取新的开发分支前,需要更新当前本地的release分支与远程库同步,避免后期开发代码冲突;注意区分源文件为本地还是远程库的release分支。

基础用法

自定义设置

  • 基础配置
git config --global user.name "userName"   // 设置git全局用户名称
git config --global user.email "userEmail" // 设置git全局用户邮箱

git config --global color.ui true  // 设置颜色 eg: 文件名等会高亮显示
  • 忽略特殊文件
    .gitignore文件加入配置项可忽略不需上传的文件,一个Git仓库可有多个.gitignore文件,但.gitignore文件在哪个(子)目录下即对那个(子)目录起作用,基本使用示例如下:
.*       // 排除所有.开头的隐藏文件
*.class  // 排除所有.class文件

!.gitignore  // 不排除.gitignore文件
!App.class   // 不排除App.class文件

例如在Windows环境自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini文件;在Python编译时会产生.pyc.pyodist等文件或目录。此时可设置.gitignore文件如下:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

但是当我们已经设置过.gitignore文件,但又确实想上传被.gitignore文件过滤条件筛选掉的文件时我们可以使用-f强制上传,同时可以使用命令查看.gitignore文件中哪个规则过滤了该文件。

git add -f <fileName>  // 强制添加文件至暂存区

git check-ignore -v <fileName>  // 使用命令查看哪个规则过滤了<fileName>文件
  • 配置别名
    alias.key
git config --global alias.st status  // 设置别名后命令行 git st === git status

git config --global alias.unstage 'reset HEAD'  // git unstage <fileName> === git reset HEAD <fileName>

// 可以尝试配置一下 git lg 如下
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。而我们所有配置文件项都存在于.git/config文件中,别名则在文件的[alias]选项后,要删除别名配置即可删除行。

基本操作

git init                     // 初始化版本库

git add <fileName>           // 将文件添加到仓库 工作区->暂存区
git commit -m 'commit desc'  // 将文件提交到仓库 暂存区->远端  eg: 可多次添加文件然后一次性提交到仓库

git status                   // 查看仓库当前状态
git diff <fileName>          // 查看文件上一次的修改内容
git diff HEAD -- <fileName>  // 查看当前文件与上一次提交文件的对比内容

git log                   // 查看版本控制提交记录
git log --pretty=oneline  // 查看版本控制提交记录 - 简化版
git log --graph           // 查看版本控制中分支合并图

版本操作

  • 版本回退
// 回退到上一个版本已提交的状态
git reset --head HEAD^     // 此处HEAD^表示上一版本 eg:HEAD^^为上两个版本,HEAD~100为往上100个版本
// 回退到上一个版本未提交的状态 eg:可以用于提交了commit但发现提错分支后不想push的情况
git reset --soft HEAD^
// 回退到上一个版本已添加但未提交的状态
git reset --mixed HEAD^
// 回退到某个commit id版本已提交的状态
git reset --head commitID  // commitID可不写全,git会自行补全,但填入值需可确定其唯一性
  • 撤销修改及删除
git checkout -- <fileName>  // 撤销工作区的修改
git reset HEAD <fileName>   // 撤销暂存区的修改

git rm <fileName>           // 手动删除文件后 效果与git add <fileName>类似

git reflog                  // 记录版本控制每一次命令操作记录

远程仓库

git clone <url>             // 克隆远程仓库 url为仓库地址

git branch                  // 查看当前分支信息
git branch <branchName>     // 创建<branchName>分支
git branch -d <branchName>  // 删除<branchName>分支 eg: 该分支还未上传到远程时可删除
git branch -D <branchName>  // 删除<branchName>分支 eg: 该分支已上传到远程但未合并分支
git branch --set-upstream-to=<remotePath> <branchName>  // 指定本地分支<branchName>与远程<remotePath>分支的链接

git checkout <branchName>     // 切换工作区的分支 eg: 副作用可以还原工作区的删除及修改
git checkout -b <branchName>  // 创建<branchName>分支并切换到该分支

git switch <branchName>     // 切换<branchName>分支
git switch -c <branchName>  // 创建<branchName>分支并切换到该分支

git push -u origin <branchName>  // 其中 -u 表示首次推送并将分支与远程库相关联
git push <remoteName> <branchName>     // 推送本地分支branchName内容至远程分支remoteName上

git pull <remoteName> <branchName>     // 拉取远程分支remoteName内容更新至本地分支branchName内

git merge <branchName>           // 将<branchName>分支内容合并到当前分支
git merge --no-ff -m 'commit desc' <branchName>  // --no-ff参数表示以用普通模式合并

git remote     // 查看远程库信息
git remote -v  // 显示远程库详细信息
git remote rm <remoteName>       // 删除远程分支remoteName eg: 此处只是删除本地与远程库的关联,远程库依旧存在于git

提升操作

  • 提取分支修改 - 复制一个特定的提交到当前分支(会影响log的合并记录)
git cherry-pick commitID  // 将commitID提交操作上所做的修改合并到当前分支
  • 暂存工作区修改
git stash       // 将工作区的修改内容清空并暂存到栈中
git stash list  // 查看栈中缓存的修改操作列表
git stash apply // 将栈中栈首的修改还原到工作区 eg: apply操作还原后栈中的内容并不删除
git stash apply stash@{0}  // 将栈中index为第0个的修改还原到工作区
git stash drop // 将栈中的的修改删除
git stash pop  // 将栈中栈首的修改还原到工作区同步删除栈中该修改信息
  • 整理提交历史
git rebase  // 把本地未push的分叉提交历史整理成直线,使得查看历史提交的变化时更容易
  • git Tag运用
npm run build
git add commit
git push
git tag <tagName> commit '<说明>'
git push origin <tagName>

SourceTree使用

以图形界面操作Git,省去了敲命令行的过程,对于常用的操作,例如提交、分支、推送等操作来说非常的方便。但在出错时,返回的依旧是Git命令返回的错误信息。

操作方式

  • 远程
    本地存在Git库时,可将本地资源直接拖入到SourceTree内添加本地Git库;本地不存在Git库时,也可以选择“New”-“Clone from URL”直接从远程克隆到本地。
  • 提交
    打开本地Git库后,SourceTree展示这个Git库的当前所有分支及文件状态。选择左侧面板的“WORKSPACE”-“File status”,右侧会列出当前已修改的文件(Unstaged files)。选中某个文件,该文件就自动添加到“Staged files”,实际上是执行了git add <fileName>命令。然后,我们在下方输入Commit描述,点击“Commit”,就完成了一个本地提交。实际上是执行了git commit -m "commit tip"命令。
  • 分支
    在左侧面板的“BRANCHES”下,列出了当前本地库的所有分支。当前分支会加粗并用○标记。要切换分支,我们只需要选择该分支,例如master,然后点击右键,在弹出菜单中选择“Checkout master”,实际上是执行命令git checkout master
    要合并分支,同样选择待合并分支,例如dev,然后点击右键,在弹出菜单中选择“Merge dev into master”,实际上是执行命令git merge dev
  • 推送
    在SourceTree的工具栏上,分别有PullPush,分别对应命令git pullgit push,只需注意本地和远程分支的名称要对应起来,使用时十分简单。

相关文章