跟我学Git(三)

超强命令:filter-branch

如果你需要以某种脚本化的方式重写大量提交(例如,全面修改你的电子邮件地址或从所有提交中删除某个文件),就需要filter-branch,它能够大面积修改你的历史记录。

从所有提交中删除某个文件

filter-branch是一个可以用来清洗整个历史记录的工具,要想从整个历史记录中删除名为passwords.txt的文件,可以使用filter-branch--tree-filter选项,例如:

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

--tree-filter选项会在每次检出项目后执行指定的命令,然后重新提交结果。要想在所有分支上执行filter-branch,可以传入--all选项。

将子目录设置为新的根目录

如果你从其他源代码导入,获得了一些没什么用的子目录(trunk、tags等)。如果想让trunk子目录成为新目录每次提交的根目录,如下可以做到:

git filter-branch --subdirectory-filter trunk HEAD

现在项目的根目录为trunk子目录,Git会自动删除所有与该子目录无关的提交。

全面修改邮箱地址

在开始工作之前忘记执行git config设置自己的姓名和邮箱地址,或者在开源项目前需要将所工作电子邮件地址改成个人邮件地址,可以使用filter-branch批处理修改多个提交中的电子邮件地址。

git filter-branch --commit-filter '
        if [ "$GIT_AUTHOR_EMAIL" = "dewitt@localhost" ];
        then 
                GIT_AUTHOR_NAME="Dewitt";
                GIT_AUTHOR_EMAIL="dewitt@example.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi'  HEAD

这个命令会修改历史记录中所有提交的SHA-1,不仅仅是包含指定电子邮件地址的提交。

重置

三棵树

关于重置的操作,先用较简单的理解方法将Git视为三棵树的内容管理器。

  • HEAD 最近提交的快照,下次提交的父提交
  • 索引 预计的下一次提交的快照(暂存区)
  • 工作目录 沙盒,在提交到索引并写入历史之前,可以随意修改

    重置的步骤

  1. 移动HEAD指针的指向(如果指定了--soft,则在此停止)
  2. 更新索引,取消暂存所有的东西
  3. 如果指定了--hard,更新工作目录。

    合并的高级用法

    忽略空白字符

    某些情况下,冲突与空白字符有关,因为每一行在一边被删除,而在另一边又被添加回来。默认情况下,Git将所有的这些行视为改动过的,因此它无法合并文件。如果你发现合并中出现了大量与空白字符有关的问题,你可以中止合并,然后加上-Xignore-all-space-Xignore-space-change再重新进行合并。第一个选项完全忽略空白字符,第二个选项将单个或多个空白字符序列视为等同。

    rerere

    rerere(reuse recorded resolution),使用该功能可以让Git记住一个块冲突的解决方案,如果下次再碰到相同类型的冲突,Git就可以自动解决。如果选用了一个已合并的分支,修复了一堆冲突后决定对其进行变基操作,这就不必再去解决同样的冲突了。运行如下命令启用:
    git config --global rerere.enabled true
    如果需要大量的合并操作,或者经常变基,可以启用rerere功能减轻负担。
全部评论

相关推荐

不知道怎么取名字_:玩游戏都写到简历上了啊
投递BOSS直聘等公司6个岗位
点赞 评论 收藏
分享
想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务