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同時運行啊?! 不好意思, 忍不住爆粗口了-_-!)
    • 實際開發中一次提交中的改動不可能只改動一個功能點 (如果模塊或者功能點的邊界划分的十分清晰, 是可以做到每次只改動一個功能點的)

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM