原文地址        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同时运行啊?! 不好意思, 忍不住爆粗口了-_-!)
    • 实际开发中一次提交中的改动不可能只改动一个功能点 (如果模块或者功能点的边界划分的十分清晰, 是可以做到每次只改动一个功能点的)

  

git 如何更改某个提交内容/如何把当前改动追加到某次commit上? git rebase的更多相关文章

  1. Git如何在不提交当前分支的情况下切换到其它分支进行操作——git stash

    假如现在的Bug你还没有解决,而上边又给你派了一个新的Bug,而这个Bug相比较现在正在苦思冥想的Bug比较容易解决. 你想先解决新的Bug,可是之前的Bug还没有解决完而不能提交.怎么办? 解决方法 ...

  2. git rebase修改历史提交内容

    目录 简述 解决过程 简述 git提交历史中有一次提交的内容是有问题,因为每隔一段时间就要发一次版本,所以必须修改这次提交的内容,以便其不影响已经发布的版本. 大概是这样子的 A --- B ---- ...

  3. 使用git处理github中提交有冲突的pull request

    前言: 为什么要写这篇文章,因为前段时间有一个开源的github中的项目有一个朋友提交了一个pr看了下是帮忙优化了下代码(十分感谢这位网友).但是他提交的pr刚好和我的项目有许多的冲突导致无法自动合并 ...

  4. git恢复到上次提交

    4个区 5种状态 未修改(Origin) 已修改(Modified) 已暂存(Staged) 已提交(Committed) 已推送(Pushed) 检查修改 已修改,未暂存(检查工作区与暂存区间的差异 ...

  5. Git检出和提交至远程仓库

    步骤一:首先需要一个Github账号,还没有的话先去注册:https://github.com/,我们使用Git需要先安装Git工具,这里给出下载地址:https://git-for-windows. ...

  6. Git 撤销所有未提交(Commit)的内容

    撸了好多代码,但是突然设计改了(~~o(>_<)o ~~):或者引入个第三方库,后来又发现用不着,想删掉,但文件太多了(比如几百个):那,怎么办呢,都不想了...Git 比人聪明,所以能很 ...

  7. git命令--git checkout 之 撤销提交到暂存区的更改

    SYJ@WIN-95I6OG3AT1N /D/gitlab/ihr-kafka-produce (master) $ git status [由于工作区文件被修改了,所以显示为红色] On branc ...

  8. git把dev部分提交过的内容合并到master

    git 把dev部分提交过的内容合并到master $ git reflog a6de5cc HEAD@{}: checkout: moving from wf_dev to master 303aa ...

  9. 使用git将本地文件提交到github存储库

    1.首先你要安装git https://git-for-windows.github.io/ 去官网自行下载对应版本 2.安装好git服务器后,找到你项目的文件夹,右键git bash here打开命 ...

随机推荐

  1. EasyUI 在Tab页用button打开新Tab

    标签: <a href="javascript:void(0)" class="easyui-linkbutton" id="ipConfig& ...

  2. 使用IntelliJ IDEA 搭建 spring mvc开发环境

    填好GroupId.ArtifactId,一路Next创建工程,在main 目录创建 java文件夹并转换为Sources Root,创建好工程目录结构如下: 配置工程 配置 pom.xml,引入相关 ...

  3. DataTable 作为ObjectDataSource的数据源

    好像是不能直接实现的.不过我从网上找到了这样的方法: 比如在BLL层中,SubjectManager是我对Subject表的业务类,此类中包含了Subject表的增删改查等各种方法.在aspx 页面中 ...

  4. Jenkins发送邮件,邮件正文嵌套的html中文显示乱码

    解决方案: 1.添加系统变量.变量名:JAVA_TOOL_OPTIONS变量值:-Dfile.encoding=UTF8 2.打开jenkins,系统管理--系统设置,在全局属性处勾选Environm ...

  5. 转 C++函数返回值,你必须注意的问题

    归根结底,C++所面临的问题要求它提供各种各样的机制以保证性能,也许,这辈子也见不到C++能安全有效的自己进行内存垃圾回收..... 老程序猿都会提醒菜鸟,注意函数的返回值,因为,很可能,你的函数返回 ...

  6. Github上删除仓库

    1.先进入到工程里面,然后选择“Settings” 2.将页面拉到最下面,然后点击“Delete this repository”,接着在弹出的窗口中输入需要删除的仓库名. 弹出的窗口如下:

  7. 洛谷2860 [USACO06JAN]冗余路径Redundant Paths

    原题链接 题意实际上就是让你添加尽量少的边,使得每个点都在至少一个环上. 显然对于在一个边双连通分量里的点已经满足要求,所以可以用\(tarjan\)找边双并缩点. 对于缩点后的树,先讲下我自己的弱鸡 ...

  8. CH6202 黑暗城堡

    一道最短路+生成树 原题链接 实际上就是生成树的中每个点到节点\(1\)的距离等于原图中这个点到节点\(1\)的最短距离,求这样的生成树的棵数. 先用\(SPFA\)或\(Dijkstra\)求出所有 ...

  9. Javascript的一个怪现象

    javascript有一个怪现象,就是减法也会导致小数位数问题,是一个麻烦的问题,比如. <html><script> var a=10,b=20.1; alert( a - ...

  10. CentOS 7安装配置Samba服务器

    CentOS 7安装配置Samba服务器 CentOS 7下Samba服务器安装配置过程笔记. 假设我们有这样一个场景 共享名 路径 权限 SHAREDOC /smb/docs 所有人员包括来宾均可以 ...