原文地址 http://www.jianshu.com/p/8d666830e826
【自己總結】
0, git diff
git diff a b 是以a為基准,把b和a的區別展示出來,即放在前面的是基准。
1, git commit --amend 更改最近一次提交的內容
此命令可以把當前改動追加到上一次提交中
用法:
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將某個功能點從branchA移動到branchB上, 步驟如下:
- 切到branchB分支上
- 執行命令
git cherry-pick 0096b95 7bfbaaa 326d7d8
那么問題來了, 如果某個功能點提交了很多次且log信息不規范, 那我們找commit-hash的時候就得費一番功夫了, 可不可以將后來的改動追加到以前的某個commit上呢? 或者直接更改改以前的某次提交?
答案是: 可以! (git中將當前改動追加到上一次提交上可以使用命令git commit --amend
實現, 下面介紹的兩種解決方案都使用了這樣命令)
<一> 下面是直接更改某次提交的操作步驟:
- 將HEAD移到需要更改的commit上:
git rebase f744c32cf74454a74bb2f80e5e38b120cb475af1^ --interactive
找到需要更改的commit, 將行首的pick改成edit, 按esc
, 輸入:wq
退出 - 更改文件
- 使用
git add 改動的文件
添加改動文件到暫存 - 使用
git commit --amend
追加改動到第一步中指定的commit上 -
使用
git rebase --continue
移動HEAD到最新的commit處
這里會有沖突, 需要解決:- 編輯沖突文件, 解決沖突
git add .
git commit --amend
解決沖突之后再執行
git rebase --continue
上述方法, 是改動某個指定的commit, 如果我要將工作空間中已經改動的東西追加到某個commit上, 那么改如何做呢?
<二>將工作空間中的改動追加到某次提交上的步驟如下:
- 保存工作空間中的改動
git stash
- 后面的步驟就和上面的解決方案的步驟差不多, 只是第2步的
更改文件
改成執行命令git stash pop
, 其他步驟都一樣
這樣處理之后, 如果branchB分支需要branchA分支上的某個功能, 只需要找到這個功能的惟一的一個提交記錄即可, 就不需要在很多commit之中尋找這個功能點的相關提交記錄. 更改合並之后再移動功能點, 就簡單了許多, 執行找到功能點的惟一一個提交記錄, 讓后使用git cherry-pick commit-hash
即可, 操作示意圖如下:

總結: 上述更改摸個提交記錄
/將現有改動追加到某個commit之上
的方案在實際開發環境中的需求並不多, 而且實現起來有相當的局限性, 原因如下:
- 如果版本規划比較清晰, 就不會出現某個功能在不同版本之間穿梭的情形, 出現這種情況的大部分原因是:
多個版本的開發並發進行
(產品你TMD當我們是電腦么, 有多個cpu同時運行啊?! 不好意思, 忍不住爆粗口了-_-!) - 實際開發中一次提交中的改動不可能只改動一個功能點 (如果模塊或者功能點的邊界划分的十分清晰, 是可以做到每次只改動一個功能點的)