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

git如何更改某个提交内容/如何把当前改动追加到某次commit上?gitrebase

原文地址    http:www.jianshu.comp8d666830e826【自己总结】0,gitdiffgitdiffab是以a为基准,把b和a的区别展示出来,即放在前面的

原文地址        http://www.jianshu.com/p/8d666830e826

【自己总结】

0, git diff

  git diff a b 是以a为基准,把b和a的区别展示出来,即放在前面的是基准。

1, git commit --amend  更改最近一次提交的内容

  此命令可以把当前改动追加到上一次提交中

用法:

 

  1   #修改需要修改的地方。
  2  git add .
  3  git commit –amend,然后在出来的编辑页面修改后保存即可,注意这里即使不保存直接退出即在vim中按<:q>也会生效。

注:log中的日志id会改变。

 

2, 更改某个指定commit

  ①,git rebase <指定commit的父commit> --interactive  

  ②,将需要改动的commit前面的pick 改为 edit,然后保存退出。

  ③,更改文件

  ④,git add <更改的文件>

  ⑤,git commit --amend

  ⑥,git rebase --continue

  这里如果有冲突, 需要先解决冲突:

  • 编辑冲突文件, 解决冲突
  • git add .
  • git commit --amend

  解决冲突之后再执行git rebase --continue

3, 将当前更改追加到某个commit上(同2只有细微区别)

  ①,git stash 保存工作空间的改动

  ②,git rebase <指定commit的父commit> --interactive

  ③,将需要改动的commit前面的pick 改为 edit,然后保存退出

  ④,git stash pop

  之后的步骤和2一样  

  ⑤,git add <更改的文件> 

  ⑥,git commit --amend 

  ⑦,git rebase --continue 

  这里如果有冲突, 需要先解决冲突: 

  • 编辑冲突文件, 解决冲突
  • git add .
  • git commit --amend
  • 解决冲突之后再执行git rebase --continue

  

原文转载如下:

 

问题: 由于项目的版本线混乱, 导致可能需要在不同分支上切换, 而且某些功能也可能在不同分支上移动.
一个版本可能有多个功能点, 一个版本又对应于一个分支, 如果一个功能点有多个提交, 那么当其他分支需要这个功能点时怎么办? cherry-pick或patch都可以实现, 但是都各有麻烦的地方: cherry-pick需要找出要移动的功能点相关的提交记录, 而patch需要功能点的提交记录都是连续的. 实际开发中不同功能点之间的提交记录往往是穿插的. 如果某个功能点相关的改动只生成一个commit,这将极大的简化功能点在分支间的移动工作. 那么是否可以实现改动某次提交 和 将现有改动追加到某次提交上 呢?

 

下面是cherry将某个功能点从一个分支移动到其他分支的示意图:

 


使用cherry-pick移动某个功能点

 

如上图, 可以使用cherry-pick将某个功能点从branchA移动到branchB上, 步骤如下:

 

  • 切到branchB分支上
  • 执行命令git cherry-pick 0096b95 7bfbaaa 326d7d8

 

那么问题来了, 如果某个功能点提交了很多次且log信息不规范, 那我们找commit-hash的时候就得费一番功夫了, 可不可以将后来的改动追加到以前的某个commit上呢? 或者直接更改改以前的某次提交?

 

答案是: 可以! (git中将当前改动追加到上一次提交上可以使用命令git commit --amend实现, 下面介绍的两种解决方案都使用了这样命令)

 


 

<一> 下面是直接更改某次提交的操作步骤:

 

  1. 将HEAD移到需要更改的commit上:
    git rebase f744c32cf74454a74bb2f80e5e38b120cb475af1^ --interactive
    找到需要更改的commit, 将行首的pick改成edit, 按esc, 输入:wq退出
  2. 更改文件
  3. 使用git add 改动的文件添加改动文件到暂存
  4. 使用git commit --amend追加改动到第一步中指定的commit上
  5. 使用git rebase --continue移动HEAD到最新的commit处
    这里会有冲突, 需要解决:

    • 编辑冲突文件, 解决冲突
    • git add .
    • git commit --amend

    解决冲突之后再执行git rebase --continue

 


 

上述方法, 是改动某个指定的commit, 如果我要将工作空间中已经改动的东西追加到某个commit上, 那么改如何做呢?

 

<二>将工作空间中的改动追加到某次提交上的步骤如下:

 

  1. 保存工作空间中的改动git stash
  2. 后面的步骤就和上面的解决方案的步骤差不多, 只是第2步的更改文件改成执行命令git stash pop, 其他步骤都一样

 

这样处理之后, 如果branchB分支需要branchA分支上的某个功能, 只需要找到这个功能的惟一的一个提交记录即可, 就不需要在很多commit之中寻找这个功能点的相关提交记录. 更改合并之后再移动功能点, 就简单了许多, 执行找到功能点的惟一一个提交记录, 让后使用git cherry-pick commit-hash即可, 操作示意图如下:

 


功能点的提交合并到一个commit之后, 移动功能点的操作示意图

 


 

总结: 上述更改摸个提交记录/将现有改动追加到某个commit之上的方案在实际开发环境中的需求并不多, 而且实现起来有相当的局限性, 原因如下:

 

    • 如果版本规划比较清晰, 就不会出现某个功能在不同版本之间穿梭的情形, 出现这种情况的大部分原因是: 多个版本的开发并发进行 (产品你TMD当我们是电脑么, 有多个cpu同时运行啊?! 不好意思, 忍不住爆粗口了-_-!)
    • 实际开发中一次提交中的改动不可能只改动一个功能点 (如果模块或者功能点的边界划分的十分清晰, 是可以做到每次只改动一个功能点的)

 

  

 


推荐阅读
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • Thisworkcameoutofthediscussioninhttps://github.com/typesafehub/config/issues/272 ... [详细]
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
  • 第一种方法gitarchive-oupdate.zip$(gitdiffnew-versionold-version--name-only)此方法如果文件有删除,则 ... [详细]
author-avatar
风华绝代LL58
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有