做爲一個開發者,若是如今還不知道git
或者還不會使用git
,那麼你應該好好的檢討。本身去好好看一遍的入門介紹吧。今天只是對本身在平常中使用git
的一些經常使用命令的介紹與本身認爲不錯且能提升咱們辦公效率的命令。內容可能會有點雜亂,但絕對都是經典的命令,在此記下筆記,也但願能幫助來賞臉關顧的大家。git
在這以前,來介紹一下git
的三個區域github
經過一張圖就能簡潔易懂的明白它們之間的轉化。shell
先從clone
命令來介紹,使用過git
的都知道它。git colne
命令拉取遠程倉庫到本地。但當咱們要拉取到指定的文件夾下時,你可能會直接mkdir
,其實無需如此,一條命令就能搞定git clone 遠程倉庫 文件名
,就是如此簡單。fetch
咱們在工做中可能會遇到這麼一種狀況,使用git add .
直接將工做區的全部修改的文件加入到暫存區了,可是後面發現有一個文件先不要加進去,此時咱們就可使用以下命令就能夠將該文件退回到工做區中。this
git rm --cached <file>
有這麼一種狀況,當你正在開發中時,有一個線上的緊急bug
須要修復,此時開發中的功能又沒有完成你不想提交,此時你可使用git stash
將工做區的文件都存放起來。這時你就能夠放心的去切分支修復bug
,修復完以後執行git stash pop
能夠將先前存放的取出,固然也有一些其餘的相關命令例如:git stash list
查看存放的記錄,git stash drop
丟棄存放的記錄。spa
可能在開發中咱們要打標籤git tag tagName
,而且要將相應的標籤推送到遠程倉庫中,此時可使用以下命令進行推送。3d
git push --tags tagName
當你commit
之後,發現有一個文件沒有加進上次的commit
中,或者又修改了一些文件。此時你並不想增長新的commit
信息,只是想將其加入到上次的commit
中。這時你就可使用rest
git commit --amend <file>
將暫存區的文件加入其中,而且你也能夠修改此時的commit
信息。code
reset
也能實現前面的rm
的效果,可使用以下命令來替代前面的git rm --cached <file>
命令blog
git reset HEAD <file>
但reset
用途更廣,結合soft
參數能夠回撤到任意的commit
節點進行操做
git reset --soft index
執行該命令以後,就回到index
處,工做區不變、暫存區回到當時的index
處。另外還有一個hard
參數。
git reset --hard index
與soft
能夠說對立,它的效果就在於工做區與暫存區的不一樣,它會清空這兩個區。
對於rebase
是重定向的意思,若是你當前的分支與遠程的分支commit
信息存在差別時,會提醒你此時不能進行push
,必須先將遠程的commit
信息拉去到本地來,才能進行提交。對於這種狀況就可使用rebase
命令了。以下當前處在develop
分支
此時應該先執行rebase
命令
git fetch git rebase origin/master
執行完以後,最後再push
到遠程master
git push origin master
最終各個分支的狀況就是上圖的效果了。若是以爲命令多難記,這裏也可用一條命令來完成上面的效果
git pull --rebase origin master
這是rebase
的簡單運用,也是常見的命令了。下面介紹rebase
的一個可選參數--onto
。
使用場景:開發過程當中咱們都會建立不一樣的分支進行開發不一樣的功能,當你在分支A
上建立了新分支B
進行開發功能而且也提交了一些commit
時,此時你發現原來A
分支上有錯誤的commit
,若是要rebase
到master
上時,不能將這個錯誤的commit
也附帶上。這個時候就該--onto
大顯神通了。
當前處在B
分支,要獲得上面的結果,只需執行以下命令
git rebase --onto master <b的commit hash code> B
這個不只能夠針對不一樣的分支,也能做用於同一個分支上。因此針對上面的狀況能夠只對分支B
進行操做,等價命令以下:
git rebase --onto <a的commit hash code> <b的commit hash code> B
當咱們要修改commit
信息的名稱時,若是要修改的commit
處在第一個時,可使用
git commit --amend
若是不是第一個時,咱們就要使用到rebase
的--interactive
可選參數了,能夠簡寫爲-i
。
git rebase -i <commit hash code>
參數後面的commit hash code
爲須要修改的commit
的前一個。執行以後就會出現以下相似的信息:
pick 137cf0a First coommit pick 163dc38 Second commit # Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s)) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
根據提示咱們能夠有6
個可選擇的操做。相信提示已經說的很明顯了,對於咱們這種要修改First coommit
的狀況,須要使用r
。
r 137cf0a First commit pick 163dc38 Second commit
執行以後會跳到修該First coomit
的界面,進行修改便可。
First commit # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Thu Jan 26 23:07:10 2017 +0800 # # rebase in progress; onto f9aee6e # You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'. # # Changes to be committed: # new file: file1
至於其餘的操做項,有興趣的能夠本身去嘗試一下。例如s
操做就能夠用來合併commit
。
相信branch
都很熟悉,我這裏要說的是他的另外一種可能會用到的狀況。場景是這樣的:若是在你進行建立新的分支時,並不想從當前的commit
信息節點進行建立分支。
要實現如上效果只需在建立分支時在後面再添加額外的參數,該參數就是你所需調到的commit
節點的hash code
git branch new_branch <commit hash code>
這裏提一下push
的--set-upstream
,它的效果是設置上游分支,當咱們將遠程不存在的本地分支推送到遠程時,若是不在推送的分支上,咱們通常會使用以下命令進行推送。
git checkout push_branch git push origin push_branch
下面是簡潔的方法,使用該參數無需切換分支,能夠直接使用以下命令進行推送。
git push --set-upstream origin push_branch
這個命令的場景是:當你所在的分支沒用,你要刪除它,但其中的一個commit
你仍是想推送到遠程master
上。
將分支切換到master
,執行如下命令:
git cherry-pick <b的 commit hash code>
咱們所熟知的是使用merge
來進行分支的合併,每次使用merge
時都會自動將副分支合併成一個commit
進行推送到主分支上,那麼若是我不想它自動推送到主分支上時(可能我還須要進行修改),這時就可使用--squash
操做
git merge --squash dev_branch
執行完以上命令後,咱們就能夠在暫存區看到一個還未提交的文件狀態。
當咱們切分支太頻繁了以後,可能會忘了一些分支是從哪一個分支切過來的,此時可使用以下命令查看:
git reflog
894a16d HEAD@{0}: commit: commit another todo 6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman 324336a HEAD@{2}: commit: commit todo 6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger 6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom 6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman 6876e5b HEAD@{6}: commit (initial): initial commit
這樣咱們就能夠看到所用的操做歷史了。這樣若是咱們使用git reset
命令不當心刪除了須要的東西。能夠經過此來查找到刪除操做的hash code
,以後就能夠經過以下命令進行恢復。
git checkout <hash code>
目前想到的就這些了,但願能有所幫助
我的博客:https://idisfkj.github.io