git撤銷與合併操做

前奏

不少時候,發現本身真的未曾學會過git,特別是本地多個分支在同時開發,合併master產生各類衝突,commit了沒必要要的信息,commit了錯誤的修改等等狀況下,總感受很懼怕操做git,細思而知,git很強大,本身卻未曾認識到它的強大之處。
直觀的理解git,下面是一張很好的圖(圖片來源網絡,不知源處):git

1634331848b2fff5?imageslim

git的撤銷

  • git reset網絡

    - git reset --soft: 將分支回退到指定提交,工做區維持現狀不變,暫存區會在現有基礎上增長該commit以後的提交。
    - git reset --mixed: (默認操做)將分支回退到指定提交,暫存區也被同步爲該指定提交,工做區保持不變。
    - git reset --hard: 將分支回退到指定分支,暫存區和工做區都會被同步爲該指定的提交。

git reset後的三個參數回退程度是依次遞進。soft最輕微,它不會重置當前工做區和暫存區,只會將回退版本後續的提交加到暫存區。mixed會改變暫存區,使它和回退版本同步。hard則會重置工做區和暫存區,使它和回退版本一致。spa

/* 
    git reset --soft target
*/

working   index   HEAD   target         working  index  HEAD
-------------------------------------------------------------
A          B       C       C               A       B     C
A          B       C       A               A       B+C   A



/* 
    git reset --mixed target
*/

working   index   HEAD   target         working  index  HEAD
-------------------------------------------------------------
A          B       C       C               A       C     C
A          B       C       A               A       A     A


/* 
    git reset --hard target
*/

working   index   HEAD   target         working  index  HEAD
-------------------------------------------------------------
A          B       C       C               C       C     C
A          B       C       A               A       A     A
  • git checkoutcode

    - git checkout -- file: 撤銷工做區的修改。

git的合併

  • git mergeblog

    - 只解決一次衝突,分別對應的是當前分支最新提交和合並分支的最新提交的衝突
    - 合併以後產生一個新的提交
    - commit信息按照時間順序合併
  • git rebase圖片

    - 合併不產生新的commit
    - 解決衝突的過程是:合併分支的最新提交 && 當前分支第1次提交 ------》 解決衝突並add後的分支 && 當前分支第2次提交......依次解決完全部當前分支的提交。
    - commit信息在合併分支的後續依次添加,呈一條線。

對於push到遠程分支前,合併master分支到底用merge仍是rebase看具體狀況,若是當前分支的提交是在merge執行前一下子,即便用git merge,當前的commit時間線上仍是會排列在後面, 也能夠先stash,再merge。若是是好久以前commit過,那merge就會吧當前commit按照時間順序插入到某個正確的時間點上,因此commit信息就容易混亂,能夠撤銷commit再stash,再merge。
固然rebase可能不須要考慮那麼多,可是須要解決屢次commit的衝突,以致於重複解決衝突。開發

相關文章
相關標籤/搜索