git使用雜記

前言

做爲一個開發者,若是如今還不知道git或者還不會使用git,那麼你應該好好的檢討。本身去好好看一遍的入門介紹吧。今天只是對本身在平常中使用git的一些經常使用命令的介紹與本身認爲不錯且能提升咱們辦公效率的命令。內容可能會有點雜亂,但絕對都是經典的命令,在此記下筆記,也但願能幫助來賞臉關顧的大家。git

區域

在這以前,來介紹一下git的三個區域github

  • 工做區(working directory)
  • 暫存區(stage index)
  • 本地歷史區(history)

經過一張圖就能簡潔易懂的明白它們之間的轉化。shell

clipboard.png

clone

先從clone命令來介紹,使用過git的都知道它。git colne命令拉取遠程倉庫到本地。但當咱們要拉取到指定的文件夾下時,你可能會直接mkdir,其實無需如此,一條命令就能搞定git clone 遠程倉庫 文件名,就是如此簡單。fetch

rm

咱們在工做中可能會遇到這麼一種狀況,使用git add .直接將工做區的全部修改的文件加入到暫存區了,可是後面發現有一個文件先不要加進去,此時咱們就可使用以下命令就能夠將該文件退回到工做區中。this

git rm --cached <file>

stash

有這麼一種狀況,當你正在開發中時,有一個線上的緊急bug須要修復,此時開發中的功能又沒有完成你不想提交,此時你可使用git stash將工做區的文件都存放起來。這時你就能夠放心的去切分支修復bug,修復完以後執行git stash pop能夠將先前存放的取出,固然也有一些其餘的相關命令例如:git stash list查看存放的記錄,git stash drop丟棄存放的記錄。spa

tag

可能在開發中咱們要打標籤git tag tagName,而且要將相應的標籤推送到遠程倉庫中,此時可使用以下命令進行推送。3d

git push --tags tagName

amend

當你commit之後,發現有一個文件沒有加進上次的commit中,或者又修改了一些文件。此時你並不想增長新的commit信息,只是想將其加入到上次的commit中。這時你就可使用rest

git commit --amend <file>

將暫存區的文件加入其中,而且你也能夠修改此時的commit信息。code

reset

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

對於rebase是重定向的意思,若是你當前的分支與遠程的分支commit信息存在差別時,會提醒你此時不能進行push,必須先將遠程的commit信息拉去到本地來,才能進行提交。對於這種狀況就可使用rebase命令了。以下當前處在develop分支

clipboard.png

此時應該先執行rebase命令

git fetch
git rebase origin/master

執行完以後,最後再push到遠程master

git push origin master

最終各個分支的狀況就是上圖的效果了。若是以爲命令多難記,這裏也可用一條命令來完成上面的效果

git pull --rebase origin master

這是rebase的簡單運用,也是常見的命令了。下面介紹rebase的一個可選參數--onto

--onto

使用場景:開發過程當中咱們都會建立不一樣的分支進行開發不一樣的功能,當你在分支A上建立了新分支B進行開發功能而且也提交了一些commit時,此時你發現原來A分支上有錯誤的commit,若是要rebasemaster上時,不能將這個錯誤的commit也附帶上。這個時候就該--onto大顯神通了。

clipboard.png

當前處在B分支,要獲得上面的結果,只需執行以下命令

git rebase --onto master <b的commit hash code> B

這個不只能夠針對不一樣的分支,也能做用於同一個分支上。因此針對上面的狀況能夠只對分支B進行操做,等價命令以下:

git rebase --onto <a的commit hash code> <b的commit hash code> B

--interactive

當咱們要修改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

相信branch都很熟悉,我這裏要說的是他的另外一種可能會用到的狀況。場景是這樣的:若是在你進行建立新的分支時,並不想從當前的commit信息節點進行建立分支。

clipboard.png

要實現如上效果只需在建立分支時在後面再添加額外的參數,該參數就是你所需調到的commit節點的hash code

git branch new_branch <commit hash code>

push

這裏提一下push--set-upstream,它的效果是設置上游分支,當咱們將遠程不存在的本地分支推送到遠程時,若是不在推送的分支上,咱們通常會使用以下命令進行推送。

git checkout push_branch
git push origin push_branch

下面是簡潔的方法,使用該參數無需切換分支,能夠直接使用以下命令進行推送。

git push --set-upstream origin push_branch

cherry-pick

這個命令的場景是:當你所在的分支沒用,你要刪除它,但其中的一個commit你仍是想推送到遠程master上。

clipboard.png

將分支切換到master,執行如下命令:

git cherry-pick <b的 commit hash code>

merge

咱們所熟知的是使用merge來進行分支的合併,每次使用merge時都會自動將副分支合併成一個commit進行推送到主分支上,那麼若是我不想它自動推送到主分支上時(可能我還須要進行修改),這時就可使用--squash操做

git merge --squash dev_branch

執行完以上命令後,咱們就能夠在暫存區看到一個還未提交的文件狀態。

reflog

當咱們切分支太頻繁了以後,可能會忘了一些分支是從哪一個分支切過來的,此時可使用以下命令查看:

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

關注

clipboard.png

相關文章
相關標籤/搜索