git merge 撤销 gitmerge后如何撤销
2025-05-06 12:56 - 立有生活网
这个git的hook文件具体啥意思,为什么hexo deploy后有这种效果?
dlop正在开发,这时候就要从上开一个热分支,或者release分支也行,改好之后在分别合并到其他分支。release通常意味着终止,别在从release上拉分支了。今天分享关于Githooks。
git merge 撤销 gitmerge后如何撤销
git merge 撤销 gitmerge后如何撤销
git merge 撤销 gitmerge后如何撤销
为了测试我的实验是否成功?我又一次把外壳放置在上面,拧上螺丝,点了点左键,有了反应。可是右键依然如故。我把鼠标反过来拍了拍,重新放到鼠标垫上进行实验。我心里默念着“上帝保佑”,谁知老天开眼,鼠标成功恢复,我不禁大喜。
我们主要讲一下它怎么用?有什么用?我用它来做什么。
Hook的意思就是钩子,用于在执行某个之前或之后进行一些其他额外的作。
Git有很多的,如commit/push等,每个都有不同的钩子函数。
我们可以在这些钩子函数中执行一些自己想要的作来满足一些需求。
那么这些钩子函数怎么查到了?
用下面命令:
cd .git/hooks
上图这些带.sample后缀的文件就是对应的钩子函数。使用hexo搭建了个人博客,放在了github上。
随便点开一个文件,里面就详细说明如何使用它。
大概就是将对应文件名去掉后缀名,保留文件,将自己想要实现的作写在里面就行。
然而,大家都应该知道,这个.git文件是不能提交到仓库中去的。这样一来,如果是多人合作项目,那别人要用就只能过去了。
为了解决这个问题。有一个工具出现了。
Husky
它能让配置 Git 钩子变得更简单。
我一直很纳闷儿,为何使用了打包命令hexo d成功后,我的github博客更改(比如添加了文章,更改了样式等)就能成功。
但是使用git status命令,本地更改并没有提交到远程的github啊。。。
这鼠标的主板很小巧,左键与右键的按钮小的可怜,而中间的滑轮却大得夸张。我将主板挪了挪位置,又将外壳扣在上面实验,但鼠标的左右键没有发出熟悉的脆响。我又重复试验了很多次,甚至改动了辅助主板的纸片的位置,但丝毫没有得到什么结果,我甚至是想放弃了。我突然想起老爸曾经修鼠标的画面:“他在主板下面垫了一块比较硬的纸片,就成功地让鼠标恢复了功能。我何尝不效仿一下呢?”我想,“如果说这样对鼠标的修复有用的话,那么鼠标的主板目前应该处于较低的位置,致使外壳上用于按键的零件无法发挥功效,根本够不到按钮。”于是,我撕下一块较硬的纸片,折叠成长方形,用拳头砸实,放在鼠标主板右键的按钮下,将另一块纸片放在左键按钮下,使主板的位置有所提高。
git回退git回退作取消
rebase只好用搜索引擎继续搜索,看到有人提出可以先使用rebase把多个提交合并成一个提交,再使用rrt产生一次反提交,这种方法的思路非常清晰,把rrt和rebase两个命令搭配得很好,相当于使用rrt回退的升级版。从接触编程就开始使用Git进行代码管理,先是自己玩Github,又在工作中使用Gitlab,虽然使用时间挺长,可是也只进行一些常用作,如推拉代码、提交、合并等,更复杂的作没有使用过,看过的教程也逐渐淡忘了,有些对不起Linus大神。
然后保存,就会拥有包含前三次提交的全部变更的单一提交 。出来混总是要还的,前些天就遇到了Git里一种十分糟心的场景,并为之前没有深入理解Git命令付出了一下午时间的代价。
基础试探先介绍一下这种场景,我们一个项目从N版本升到A版本时引入了另一项目的jar包,又陆续发布了B、C版本,但在C版本后忽然发现了A版本引入的jar包有极大的性能问题,B、C版本都是基于A版本发布的,要修复jar包性能问题,等jar包再发版还得几天,可此时线上又有紧急的Bug要修,于是就陷入了进退两难的境地。
决定先将代码回退到A版本之前,再基于旧版本修复Bug,也就开始了五个小时的受苦之路。
rrt首先肯定的是rrt,gitrrtcommit_id能产生一个与commit_id完全相反的提交,即commit_id里是添加,rrt提交里就是删除。
但是使用gitlog查看了提交记录后,我就打消了这种想法,因为提交次数太多了,中途还有几次从其他分支的merge作。”利益于”我们不太干净的提交记录,要完成从C版本到N版本的rrt,我需要倒序执行rrt作几十次,如果其中顺序错了一次,最终结果可能就是不对的。
另外我们知道我们在进行代码merge时,也会把merge信息产生一次新的提交,而rrt这次mergecommit时需要指定m参数,以指定mainline,这个mainline是主线,也是我们要保留代码的主分支,从feature分支往dlop分支合并,或由dlop分支合并到的提交还好确定,但feature分支互相合并时,我哪知道哪个是主线啊。
所以rrt的文案被废弃了。
但由于我们都在feature分支开发,我在feature分支上将代码回退到某次提交后,将其合并到dlop分支时却被提示报错。这是因为feature分支回退了提交后,在git的workflow里,feature分支是落后于dlop分支的,而合并向dlop分支,又需要和dlop分支保持的同步,需要将dlop分支的数据合并到feature分支上,而合并后,原来被reset的代码又回来了。
这个时候另一个可选项是在分支上执行reset,使用--hard选项完全抛弃这些旧代码,reset后再强制推到远端。
gitreset--hardcommit_idgitpush--forceorigin但是还是有问题,首先,我们的分支在gitlab里是被保护的,不能使用forcepush,毕竟风险挺大了,万一有人reset到最开始的提交再强制push的话,虽然可以使用reflog恢复,但也是一番折腾。
另外,reset毕竟太野蛮,我们还是想能保留提交历史,以后排查问题也可以参考。
升级融合
先说一下rebase,rebase是”变基”的意思,这里的”基”,在我理解是指commit形成的gitworkflow,使用rebase,我们可以改变这些历史提交,修改commit信息,将多个commit进行组合。
介绍rebase的文档有很多,我们直接来说用它来进行代码回退的步骤。
首先,切出一个新分支F,使用gitlog查询一下要回退到的commit版本N。使用命令gitrebase-iN,-i指定交互模式后,会打开gitrebase编辑界面,形如:pick6fa5869commit1pick0b84ee7commit2pick986c6c8commiticka0dcccommit4这些commit自旧到新由上而下排列,我们只需要在commit_id前添加作命令即可,在合并commit这个需求里,我们可以选择pick最旧的commit1,然后在后续的commit_id前添加squash命令,将这些commits都合并到最旧的commit1上。保存rebase结果后,再编辑commit信息,使这次rebase失效,git会将之前的这些commit都删除,并将其更改合并为一个新的commit5,如果出错了,也可以使用gitrebase--abort/--continue/--edit-todo对之前的编辑进行撤销、继续编辑。这个时候,主分支上的提交记录是older,commit1,commit2,commit3,commit4,而F分支上的提交记录是older,commit5,由于F分支的祖先是older,明显落后于主分支的commit4,将F分支向主分支合并是不允许的,所以我们需要执行gitmerge将主分支向F分支合并,合并后git会发现commit1到commit4提交的内容和F分支上commit5的修改内容是完全相同的,会自动进行合并,内容不变,但多了一个commit5。再在F分支上对commit5进行一次rrt反提交,就实现了把commit1到commit4的提交全部回退。这种方法的取巧之处在于巧妙地利用了rebase作历史提交的功能和git识别修改相同自动合并的特性,作虽然复杂,但历史提交保留得还算完整。
rebase这种修改历史提交的功非常实用,能够很好地解决我们遇到的一个小功能提交了好多次才好使,而把git历史弄得乱七八糟的问题,只需要注意避免在多人同时开发的分支使用就行了。
遗憾的是,当天我并没有理解到rebase的这种思想,又由于试了几个方法都不行太过于慌乱,在rebase完成后,向主分支合并被拒之后对这些方式的可行性产生了怀疑,又加上有同事提出听起来更可行的方式,就中断了作。
文件作这种更可行的方式就是对文件作,然后让git来识别变更,具体是:
从主分支上切出一个跟主分支完全相同的分支F。从文件管理系统项目文件夹为bak,在bak内使用gitcheckoutN将代码切到想要的历史提交,这时候git会将bak内的文件恢复到N状态。在从文件管理系统内,将bak文件夹下除了.git文件夹下的所有内容粘贴到原项目目录下。git会纯从文件级别识别到变更,然后更新工作区。在原项目目录下执行add和commit,完成反提交。这种方式的巧妙之处在于利用git本身对文件的识别,不牵涉到对workflow作。
小结
终于靠着文件作方式成功完成了代码回退,事后想来真是一把心酸泪。
rrt适合需要回退的历史提交不多,且无合并冲突的情景。如果你可以向强推代码,且想让gitlog里不再出现被回退代码的痕迹,可以使用gitreset--hard+gitpush--force的方式。如果你有些geek,追求用”正规而正统”的方式来回退代码,rebase+rrt满足你的需求。如果你不在乎是否优雅,想用最简单,最直接的方式,文件作正合适。git真的是非常的代码管理工具,入手简单,三五个命令组合起来就足够完成工作需求,又对geeker们非常友好,你想要的骚作它都支持,学无止境啊。
关注我,后续更多干货奉上!
git常用作
为了让我的五个小时不白费,复盘一下当时的场景,学习并总结一下四种代码回退的方式:如果不用"pick"或者"edit",而是指定"squash",Git 会同时应用那个变更和它之前的变更并将提交说明归并。因此,如果想将这三个提交合并为单一提交, 可以将脚本修改成这样
保存并退出编辑器,Git 会应用全部三次变更然后将送回编辑器来归并三Reset然后就考虑reset了,reset也能使代码回到某次提交,但跟rrt不同的是,reset是将提交的HEAD指针指到某次提交,之后的提交记录会消失,就像从没有过这么一次提交。次提交说明。
注:最顶行pick 不能修改为squash
当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是 git stash 命令。
“‘储藏”“可以获取工作目录的中间状态——也就是修改过的被的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。
当追准备切换分支,但是还不想提交你正在进行中的工作;所以储藏这些变更。为了往堆栈推送一个新的储藏,只要运行? git stash :
这时,你可以方便地切换到其他分支工作;你的变更都保存在栈上。要查看现有的储藏,你可以使用? git stash list :
git stash apply :重新应用你刚刚实施的储藏
git stash apply stash@{number} :应用更早的储藏
只需回到需要合并的源分支,运行 git merge 命令指定要合并进来的分支即可;Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 git status 观察
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。可以看到此文件包含类似下面这样的部分:
在解决了所有文件里的所有冲突后,运行? git add ?将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)
pull时为了防止更改后pull Feiled的出现,先执行comm可以看到 ======= 隔开的上半部分,是? HEAD (即 分支,在运行 merge 命令时所切换到的分支)中的内容,下半部分是在 iss53 分支中的内容。解决冲突的办法无非是二者选其一或者亲自整合到一起。比如可以通过把这段内容替换为下面这样来解决:it,stash or rrt。
git不允许除feature分支和外的分支merge到release
前端的小伙伴们对Hook”家里就这样一个鼠标适用于这种型号的电脑,坏了的话就得花钱去买,不如让我来修一修。就这样,我把修好鼠标定为目标,找到橱柜里的螺丝刀,又仔仔细细地观察了一遍鼠标,将鼠标的外壳拆卸下来,探究鼠标的内部结构。这个东西应该都很了解。一般情况总的来说就是让配置文件和钩子关联起来。:和dlop并行。上始终是最稳定的代码,dlop是正在开发的代码。feature则是某个开发为了自己的功能拉的分支。
房屋租赁合同简易版 房屋租赁合同简易版的

2017房屋租赁合同范本标准版? 联本合同未尽事宜,一律按《中华经济合同法》的有关规定,经合同双方共同协商,作出补充规定,补充规定与本合同具有同等效力。系方式:: 1.甲方出租给乙方的···
杂牌手机回收(杂牌手机回收平台)

临沂手机批发市场在那 5、可以入手,因为是苹果为手机损坏顾客提供的新机,所以价格低官换机指的是在正常购买的iPhone激活后一年保修期内,手机出现非人为损坏等问题,苹果公司就会更换一部···
怎样投资理财 怎样投资理财比较好

怎样投资理财? 请点击输入描述 说到理财,大多数人反应会想到的是买理财产品。 怎样投资理财 怎样投资理财比较好 怎样投资理财 怎样投资理财比较好 其实理财不仅仅只是买理财产品,而是一···