熟記這些git命令,你就是大神

1.git log  查看 提交歷史

默認不用任何參數的話,git log 會按提交時間列出全部的更新,最近的更新排在最上面javascript

2.git log -p -2

經常使用 -p 選項展開顯示每次提交的內容差別,用 -2 則僅顯示最近的兩次更新;java

3.git log --stat

僅顯示簡要的增改行數統計git

4.放棄本次修改

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

5.關於git reset --hard,git reset --soft,git reset --mixed的區別:

 

--hard 是本地代碼,index,commmit都回退學習

--soft是代碼保留,index保留,commit回退,能夠隨時提交;fetch

--mixed是代碼保留,index 和commit回退。

6.git revert

對於已經push的代碼,回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上,線下代碼保持一致就要用到git revert.

  • git revert用於反轉提交,執行evert命令時要求工做樹必須是乾淨的.
  • git revert用一個新提交來消除一個歷史提交所作的任何修改.
  • revert 以後你的本地代碼會回滾到指定的歷史版本,這時你再 git push 既能夠把線上的代碼更新.(這裏不會像reset形成衝突的問題)

 

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.git diff

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文件,此時能夠找到這些文件進行手動打補丁  
    學習無他法,惟有鍥而不捨

8.git fetch

$ 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

9.git rebase

暫時理解不了,之後再說。

10.誤刪分支怎麼恢復

1)使用git log -g 找回以前提交的commit

2)使用git branch [新分支] commit_id    建立一個分支

3)切換到新分支,檢查文件是否存在

 

11.git remote 命令

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。

相關文章
相關標籤/搜索