git log
查看 提交歷史默認不用任何參數的話,git log
會按提交時間列出全部的更新,最近的更新排在最上面javascript
經常使用 -p
選項展開顯示每次提交的內容差別,用 -2
則僅顯示最近的兩次更新;java
僅顯示簡要的增改行數統計git
git checkout .
#本地全部修改的。沒有的提交的,都返回到原來的狀態
git stash
#把全部沒有提交的修改暫存到stash裏面。可用git stash pop回覆。
git reset --hard HASH
#返回到某個節點,不保留修改。
git reset --soft HASH
#返回到某個節點。保留修改
web
某個節點是哪一個節點?shell
指某次提交的版本ID,通常輸入前幾位便可。查看某次提交的版本ID能夠經過git log 的方法,也能夠api
經過git reflog來查看,git reflog 能夠查看全部分支的全部操做記錄(包括(包括commit和reset的操做),bash
包括已經被刪除的commit記錄,git log則不能察看已經刪除了的commit記錄。app
--hard 是本地代碼,index,commmit都回退學習
--soft是代碼保留,index保留,commit回退,能夠隨時提交;fetch
--mixed是代碼保留,index 和commit回退。
對於已經push的代碼,回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上,線下代碼保持一致就要用到git revert.
revert 使用,須要先找到你想回滾版本惟一的commit標識代碼,能夠用 git log 或者在adgit搭建的web環境歷史提交記錄裏查看.
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
一般,前幾位便可
git revert c011eb3
git revert是用一次新的commit來回滾以前的commit,git reset是直接刪除指定的commit
看似達到的效果是同樣的,其實徹底不一樣.
第一:
上面咱們說的若是你已經push到線上代碼庫, reset 刪除指定commit之後,git push可能致使一大堆衝突.可是revert 並不會.
第二:
若是在往後現有分支和歷史分支須要合併的時候,reset 恢復部分的代碼依然會出如今歷史分支裏.可是revert 方向提交的commit 並不會出如今歷史分支裏.
第三:
reset 是在正常的commit歷史中,刪除了指定的commit,這時 HEAD 是向後移動了,而 revert 是在正常的commit歷史中再commit一次,只不過是反向提交,他的 HEAD 是一直向前的.
7.1 比較工做區與暫存區
git diff 不加參數即默認比較工做區與暫存區
7.2 比較暫存區與最新本地版本庫(本地庫中最近一次commit的內容)
git diff --cached [<path>...]
7.3 比較工做區與最新本地版本庫
git diff HEAD [<path>...] 若是HEAD指向的是master分支,那麼HEAD還能夠換成master
7.4 比較工做區與指定commit-id的差別
git diff commit-id [<path>...]
7.5 比較暫存區與指定commit-id的差別
git diff --cached [<commit-id>] [<path>...]
7.6 比較兩個commit-id之間的差別
git diff [<commit-id>] [<commit-id>]
7.7 使用git diff打補丁
git diff > patch //patch的命名是隨意的,不加其餘參數時做用是當咱們但願將咱們本倉庫工做區的修改拷貝一份到其餘機器上使用,可是修改的文件比較多,拷貝量比較大,
此時咱們能夠將修改的代碼作成補丁,以後在其餘機器上對應目錄下使用 git apply patch 將補丁打上便可
git diff --cached > patch //是將咱們暫存區與版本庫的差別作成補丁
git diff --HEAD > patch //是將工做區與版本庫的差別作成補丁
git diff Testfile > patch//將單個文件作成一個單獨的補丁
拓展:git apply patch 應用補丁,應用補丁以前咱們能夠先檢驗一下補丁可否應用,git apply --check patch 若是沒有任何輸出,那麼表示能夠順利接受這個補丁
另外可使用git apply --reject patch將能打的補丁先打上,有衝突的會生成.rej文件,此時能夠找到這些文件進行手動打補丁
學習無他法,惟有鍥而不捨
$ git fetch <遠程主機名>
要更新全部分支,命令能夠簡寫爲:
$ git fetch
上面命令將某個遠程主機的更新,所有取回本地。默認狀況下,git fetch
取回全部分支的更新。若是隻想取回特定分支的更新,能夠指定分支名,以下所示 -
$ git fetch <遠程主機名> <分支名>
好比,取回origin
主機的master
分支。
$ git fetch origin master
所取回的更新,在本地主機上要用」遠程主機名/分支名」的形式讀取。好比origin
主機的master
分支,就能夠用origin/master
讀取。
取回遠程主機的更新之後,能夠在它的基礎上,使用git checkout命令建立一個新的分支。
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master
的基礎上,建立一個新分支:newBrach。
此外,也可使用git merge
命令或者git rebase
命令,在本地分支上合併遠程分支。
$ git merge origin/master # 或者 $ git rebase origin/master
上面命令表示在當前分支上,合併origin/master
。
暫時理解不了,之後再說。
1)使用git log -g 找回以前提交的commit
2)使用git branch [新分支] commit_id 建立一個分支
3)切換到新分支,檢查文件是否存在
git remote show
命令加上主機名,能夠查看該主機的詳細信息。
$ git remote show <主機名>
git remote add
命令用於添加遠程主機。
$ git remote add <主機名> <網址>
git remote rm
命令用於刪除遠程主機。
$ git remote rm <主機名>
git remote rename
命令用於遠程主機的更名。
$ git remote rename <原主機名> <新主機名>
12.git stash
一、恢復改動。若是你要恢復的是最近的一次改動,git stash pop便可。若是有屢次stash操做,那就經過git stash list查看stash列表,從中選擇你想要pop的stash,運行命令git stash pop stash@{id}或者 git stash apply stash@{id}便可。
二、刪除stash。git stash drop <stash@{id}> 若是不加stash編號,默認的就是刪除最新的,也就是編號爲0的那個,加編號就是刪除指定編號的stash。git stash clear 是清除全部stash,整個世界一會兒清淨了!
三、git stash pop 與 git stash apply <stash@{id}> 的區別。
git stash pop stash@{id}命令會在執行後將對應的stash id 從stash list裏刪除,而 git stash apply stash@{id} 命令則會繼續保存stash id。
14.git rebase
此圖是git merge 的結果。
這是git rebase的結果。「mywork"分支歷史看起來像沒有通過任何合併同樣。
$ git checkout mywork
$ git rebase origin
這些命令會把你的"mywork"分支裏的每一個提交(commit)取消掉,而且把它們臨時 保存爲補丁(patch)(這些補丁放到".git/rebase"目錄中),而後把"mywork"分支更新 爲最新的"origin"分支,最後把保存的這些補丁應用到"mywork"分支上。
當'mywork'分支更新以後,它會指向這些新建立的提交(commit),而那些老的提交會被丟棄。 若是運行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除.
在應用的補丁的過程當中可能會遇到衝突,解決衝突的辦法是:
$ git rebase --continue
這樣git會繼續應用(apply)餘下的補丁。
在任什麼時候候,你能夠用--abort參數來終止rebase的行動,而且"mywork" 分支會回到rebase開始前的狀態。
$ git rebase --abort
git rebase和git merge的區別
使用Git log來參看commit時,其commit的順序也有所不一樣。
假設C3提交於9:00AM,C5提交於10:00AM,C4提交於11:00AM,C6提交於12:00AM,
對於使用git merge來合併所看到的commit的順序(重新到舊)是:C7 ,C6,C4,C5,C3,C2,C1
對於使用git rebase來合併所看到的commit的順序(重新到舊)是:C7 ,C6‘,C5',C4,C3,C2,C1
由於C6'提交只是C6提交的克隆,C5'提交只是C5提交的克隆,
從用戶的角度看使用git rebase來合併後所看到的commit的順序(重新到舊)是:C7 ,C6,C5,C4,C3,C2,C1
另外:
當本地和遠程倉庫都有代碼更新時,直接push會失敗。須要使用 git pull: 更新代碼,git 會自動merge不一樣的更新,
a. 若是git 自動merge成功,再進行 git push操做就會成功。
b. 若是git 自動merge失敗,使用git status能夠查看哪一個文件 merge失敗,須要手動修改衝突地方,再進行git add git commit操做,以後再git push
But,這種方法提交後,就會在提交記錄裏顯示 merge: *********************,而git rebase就能解決這種問題
15.git revert
git revert 是生成一個新的提交來撤銷某次提交,這次提交以前的commit都會被保留
git reset 是回到某次提交,提交及以前的commit都會被保留,可是這次以後的修改都會被退回到暫存區
具體一個例子,假設有三個commit, git st:
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
當執行git revert HEAD~1時, commit2被撤銷了
git log能夠看到:
revert "commit2":this reverts commit 5fe21s2...
commit3: add test3.c
commit2: add test2.c
commit1: add test1.c
git status 沒有任何變化若是換作執行git reset --soft(默認) HEAD~1後,運行git logcommit2: add test2.ccommit1: add test1.c運行git status, 則test3.c處於暫存區,準備提交。若是換作執行git reset --hard HEAD~1後,顯示:HEAD is now at commit2,運行git logcommit2: add test2.ccommit1: add test1.c運行git st, 沒有任何變化另外:git revert <commit log string>是撤消該commit,做爲一個新的commit。