热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于javascript:工作中使用-Git-解决问题的场景

简略来说,就这七点:应用gitrebase让提交记录更加清晰可读应用gitreflog+gitreset跳到任意commit应用gitcherry-pick获取指定的commit应用git

简略来说,就这七点:

  • 应用 git rebase 让提交记录更加清晰可读
  • 应用 git reflog + git reset 跳到任意 commit
  • 应用 git cherry-pick 获取指定的 commit
  • 应用 git commit –amend 更改提交内容
  • 应用 git revert 回滚某次的提交
  • 应用 git stash 来暂存文件
  • 配置 git alias 晋升工作效率

应用 git rebase 让提交记录更加清晰可读

rebase 根本用法

rebase 翻译为变基,它的作用和 merge 类似,用于把一个分支的批改合并到以后分支

如下图所示,通过 rebase 后提交历史的变动状况

不明确单分支的益处,能够在看看知乎的这个问题:Git commits历史是如何做到如此清新的?

Vue 的作者尤雨溪就是说:多用 rebase

具体用法:

  • 基于 master 分支创立 feature 分支
  • 在 feature 分支上开发性能点
  • master 上也提交了commit
  • 在 feature 分支上执行 git rebase master,意为以 master 分支最初的提交作为基点,一一利用 feature 的每个更改

git rebase VS git merge

合并分支有两种,即 rebase 、merge

merge 翻译为合并,即 git merge branchname,即合并分支代码,这种办法会保留每次 commit 的,当你应用 gitk 查看时就发现好几条色彩的线

另一种是 rebase,即去除一系列的提交记录,“复制”它们,而后在另一个中央一一放下去

所以 rebase 的劣势就明了了,它能发明更清晰的提交记录

但 merge 会保留你所有的 commit 的历史工夫,当开发人员一多,历史记录就会变得凌乱

rebase 的交互模式

在开发中,通常会在一个分支上产生很多有效的提交,这种状况下应用 rebase 的交互模式能够把屡次 commit 压缩成一次提交,失去一个洁净的提交历史

# 先看提交
git log 
# f9f6f3b commit 3
# 2feb45f commit 2
# 07a3cb6 commit 1
# 咱们要批改 2 的话,rebase 到它的下一个 commit,这里是 1
git rebase 07a3cb6 -i
# 而后在关上的对话框外面批改,之后还要一个 rebase continue
git rebase -i 
# 或者是 git rebase -i HEAD~2 对最近的两次 commit 进行合并    

也有人称之为后悔药性能,即你无论写什么 commit,最初都能够批改,无论提交什么,都能够合并,DIY性强

应用 git reflog + git reset 跳到任意 commit

换个说法叫时光机,即通过查找所有分支的所有操作记录(包含曾经被删除的 commit 记录和 reset 的操作),通过 reset HEAD 跳到指定 commit

git reflog
#afa2f45 HEAD@{10}: checkout: moving from 明天 to 今天
#4abcda5 HEAD@{11}: commit: 买通1800处仙窍
#de42069 HEAD@{12}: commit: 真言轮经大成
git reset HEAD@{10}
# 或者 git reset --hard afa2f45

如此一来,就回到了 afa2f45 commit 处,相熟「工夫法令」、「时光机」的人都晓得,这是回到过来

应用 git cherry-pick 获取指定的 commit

意为“挑拣”提交,和 merge 合并一个分支的所有提交不同,它会获取某个分支的单个提交,并作为一个新的提交接入到以后分支上

这个须要故事背景才容易了解

张三在分支上开发性能,每个性能点提交一次commit,共六个提交六个性能点(别离是 feature1~feature6),再回到第一个提交点,即他应用 git reset --hard feature1 跳转第一个 commit,在此基础上开发一个新性能,即 feature7,那么如果把 feature7 合并到 feature6 上怎么做?

git reflog
# git reflog 查看所有分支的所有操作记录(包含曾经被删除的 commit 记录和 reset 的操作)
# 找到 feature7 的 commit 4c97ff3
# 回到 feature6 的 commit cd52afc
git reset --hard cd52afc
# 应用 cherry-pick 拿到 feature7 的代码
git cherry-pick 4c97ff3

具体可看小蝌蚪的这篇 小蝌蚪传记:git时光穿梭机–女神的侧颜 来领会一二

简略来说,你的每一次 commit,就是一次记录,能够合并到任意中央。所以开发性能点或者修复bug之类,尽量做到一个性能点一个commit,不便出错时挑拣代码

应用 git commit –amend 更改提交内容

amend 的意思是修改

# 持续改变你的文件
git add . 
git commit --amend --no-edit
# 你这次的改变会被增加进最近一次的 commit 中

合并到上次的commit 中

git commit --amend:弹出让你批改内容

git commit --amend --no-edit:放弃上一次的commit内容

PS:如果你的代码曾经 push 了的话,要慎用,因为会批改提交历史。

应用 git revert 回滚某次的提交

上文提到一个回滚操作:git reset --hard xxx,能回到某次的 commit,除此之外,还有一种则是能撤销某次 commit

# 先找到你想撤销的那个 commit hash值
git log
git revert 

这种做法会新建一条commit 信息,来撤回之前的批改。

而 git reset 会间接提交记录退回到指定的 commit 上。

所以就集体开发或集体 feature 分支而言,能够应用 git reset 来回滚代码,但在多人合作的集成分支上,git revert 更适宜。这样,提交的历史记录不会被抹去,能够平安地进行撤回

应用 git stash 来暂存文件

顾名思义,就是把本地的改变暂存起来

先理解下 git 的四大工作区域

四大工作区域

  • Workspace(工作区):本地电脑所见的文件和目录
  • Index/Stage(暂存区):个别寄存在 .git 目录下,当你 git add 改变文件,改变的文件就放入在「暂存区」
  • Respository(本地仓库):当你 git clone 地址,就将近程仓库克隆到本地仓库。它是存在本地的版本库,其中HEAD指向最新放入仓库的版本。当你执行 git commit,文件改变就到本地仓库
  • Remote(近程仓库):相似Github、Gitlab、码云等放在代码托管平台

常见的场景是你还在开发一个性能点的时候,忽然有个线上 bug 须要你紧急修复,这次你能够git commit 提交到本地仓库,后续通过 git commit --amend 持续在原 commit 上批改内容。但这里还有一种办法,行将代码存在暂存区,等 bug 修复完后,再从暂存区取出

根本命令如下:

git stash # 将本地的改变暂存
git stash save "message" # 执行存储时,增加备注
git stash pop # 利用最近一次暂存,并删除暂存记录
git stash apply #复原最近的存储,但不会把存储从存储列表中删除,某人应用第一个存储,即 stash@{0},如果要应用其余,git stash apply stash@{$num}
git stash list # 查看 stash 了哪些存储
git stash clear #删除所有缓存的 stash
git ls-files --stage #查看 index 暂存区

配置 git alias 晋升工作效率

次要是为了简化命令,它的根本用法是 git config --global alias.<简化的字符> 原始命令

如上面的例子:

git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch

当然,另一种办法是在 .gitconfig 文件中设置

[alias]
st = status -sb
co = checkout
br = branch
mg = merge
ci = commit
ds = diff --staged
dt = difftool
mt = mergetool
last = log -1 HEAD
latest = for-each-ref --sort=-committerdate --format=\"%(committername)@%(refname:short) [%(committerdate:short)] %(contents)\"
ls = log --pretty=format:\"%C(yellow)%h %C(blue)%ad %C(red)%d %C(reset)%s %C(green)[%cn]\" --decorate --date=short
hist = log --pretty=format:\"%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\" --topo-order --graph --date=short
type = cat-file -t
dump = cat-file -p
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

参考政采云的配置

除此之外

还有一些不常见却好用的命令

  • gitk:关上git的图形化工具
  • gitjk:吊销您刚刚在git中所做的操作
  • git help -g:展现帮忙信息
  • cat .git/HEAD:查看分支文件
  • git fetch --all && git reset --hard origin/master:回到近程仓库的状态

    • 摈弃本地所有的批改,回到近程仓库的状态
  • git push -f origin master:强行获取近程最新代码

参考资料

  • git 时光穿梭机
  • 我在工作中是如何应用 git 的
  • 程序员必会的六条黄金 Git 命令,让你效率进步百分之百
  • Oh Shit, Git!?!
  • 我是如何应用 git 的?

推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
author-avatar
本来就是哦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有