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同時運行啊?! 很差意思, 忍不住爆粗口了-_-!)
    • 實際開發中一次提交中的改動不可能只改動一個功能點 (若是模塊或者功能點的邊界劃分的十分清晰, 是能夠作到每次只改動一個功能點的)
相關文章
相關標籤/搜索