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

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

【本身总结】vim

0, git diff并发

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

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

  此命令能够把当前改动追加到上一次提交中code

用法:blog

 

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

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

 

2, 更改某个指定commit开发

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

  ②,将须要改动的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同时运行啊?! 很差意思, 忍不住爆粗口了-_-!)
    • 实际开发中一次提交中的改动不可能只改动一个功能点 (若是模块或者功能点的边界划分的十分清晰, 是能够作到每次只改动一个功能点的)
相关文章
相关标签/搜索