zoukankan      html  css  js  c++  java
  • git 如何更改某个提交内容/如何把当前改动追加到某次commit上? git rebase

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

      

  • 相关阅读:
    Eclipse中Outline里各种图标的含义
    synchronized
    instanceof
    java代码实现rabbitMQ请求
    ftp服务的搭建及调用
    WebService学习总结(三)——使用JDK开发WebService
    Java Web Service 学习
    通俗理解阻塞、非阻塞,同步、异步。
    mongo VUE 操作
    【清华集训2014】主旋律
  • 原文地址:https://www.cnblogs.com/everest33Tong/p/6418494.html
Copyright © 2011-2022 走看看