標籤: githtml
[TOC]git
本文是git系列博客的第二篇。本文對指令按照使用場景(建庫,查看,修改,分支)進行分類概括,介紹指令基本含義和用法,方便查閱。github
參考我前面的博客:git在各操做系統平臺下的安裝和配置數據庫
工做區:就是你在電腦裏能看到的目錄,好比個人learngit文件夾就是一個工做區。segmentfault
版本庫:工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。服務器
暫存區:Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。app
咱們把文件往Git版本庫裏添加的時候,是分兩步執行的:學習
第一步是用
git add
把文件添加進去,實際上就是把文件修改添加到暫存區;fetch第二步是用
git commit
提交更改,實際上就是把暫存區的全部內容提交到當前分支。網站
由於咱們建立Git版本庫時,Git自動爲咱們建立了惟一一個master分支,因此,如今git commit就是往master分支上提交更改。
簡單理解:須要提交的文件修改統統放到暫存區,而後,一次性提交暫存區的全部修改。
詳細知識見工做區和暫存區和[Git 基礎 - 記錄每次更新到倉庫
](https://git-scm.com/book/zh/v...
創建遠程庫(爲空,不要加README.md,否則後面會push不上去)
本地新建文件夾
git init
初始化倉庫,能夠發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的。勿人爲瞎改
遠程庫的名字就是origin
,這是Git默認的叫法
git remote add origin git@github.com:michaelliao/learngit.git
這個命令是在本地的learngit倉庫下執行的。這兩個地方的倉庫名不須要相同,由於會經過在本地的倉庫目錄下執行這條命令(命令中包含遠程庫的名字)已經將二者創建了聯繫
git push -u origin master
把本地庫的全部內容推送到遠程庫上。把本地庫的內容推送到遠程,用git push
命令,其實是把當前分支master推送到遠程。因爲遠程庫是空的,咱們第一次推送master分支時,加上了-u參數(推送和關聯),Git不但會把本地的master分支內容推送到遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。
git push origin master
每次本地提交後,推送最新修改到遠程庫
假設github上面已經有一個遠程庫,可是本地沒有,須要克隆到本地,遠程庫的名字叫gitskills
git clone git@github.com:michaelliao/gitskills.git
克隆一個本地庫,則在當前文件夾下會多一個gitskills
的文件夾。
cd gitskills
進入克隆下來的本地庫,默認的名字是和github上的同樣的
git push origin master
推送分支,就是把該分支上的全部本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上
git status
查看倉庫當前的狀態
git diff 文件名
查看對文件作什麼修改
git diff 版本號1 版本號2 --stat
查看兩個版本的差別的文件列表,包括被修改行數和增刪圖。參數改成--name-status
前面顯示修改說明字母(A,M等),無行數
git log
顯示從最近到最遠的提交日誌
git log --pretty=oneline
簡化日誌輸出的顯示信息,commit id
很長,詳細顯示見這裏
git reflog
記錄你的每一次命令,最早顯示的是這個命令執行以後的版本的版本號的前七位,這樣就算你清屏了或者重啓了,也能找到某個版本的版本號,就能夠輕鬆回退到那個版本
git branch
查看當前所在的分支。git branch
命令會列出全部分支,當前分支前面會標一個*
號
git log --graph --pretty=oneline --abbrev-commit
用帶參數的git log能夠看到分支的合併狀況。用git log --graph
命令能夠看到分支合併圖
git remote
查看遠程庫的信息
git remote -v
顯示更爲詳細的信息
git add readme.txt
添加,可是不提交
git commit -m "提交描述"
提交,只有add後提交纔有效。"改文件->add文件->再改->提交",則第二次修改無效,不會被提交,只會成功提交第一次的修改。
git checkout -- 文件名
把沒暫存(即沒add)的幹掉,或者說,丟棄工做區,回到到暫存狀態
git reset HEAD 文件名
把暫存的狀態取消,工做區內容不變,但狀態變爲「未暫存」。
簡單來講,沒有add過的修改,只須要git checkout -- 文件名
便可撤銷;add 過的修改,先git reset HEAD 文件名
變成沒add 過的修改,再git checkout -- 文件名
撤銷。操做示例能夠看這張圖
git reset --hard HEAD^
會回退到上一個版本
git reset --hard 某版本號前幾位
經過命令行上的歷史信息(假如你沒清屏的話),找到某版本 的版本號回到指定版本。不必定要所有的版本號,就像這個命令的例子,只要前面的約七、8位這樣就能夠。
git checkout -b dev
建立一個新的分支:dev,而且會切換到dev分支。因此這條命令有兩個做用。git checkout命令加上-b
參數表示建立並切換,至關於如下兩條命令:git branch dev
和git checkout dev
git branch dev
,新建分支是新建指針,指向當前commit
git checkout dev
切換到dev分支
git checkout master
dev分支的工做完成,咱們就能夠切換回master分支(此時在dev分支的修改在master上是看不到的)
git merge dev
這是在master分支上執行的命令,做用是:把dev分支上的工做成果合併到master分支上
git branch -d dev
刪除已合併的分支。刪除分支就是刪除指針
git branch -D dev
Git友情提醒,dev分支尚未被合併,若是刪除,將丟失掉修改,若是要強行刪除,須要使用git branch -D dev
命令
git rebase master
變基。在當前分支(非master)下執行該命令,則至關於把當前分支和mater分支合併,和merge操做相似,但提交歷史不一樣,rebase操做的log更乾淨。具體可參考Git 分支 - 變基
假設在master分支和feature1分支對同一文件作了修改
git merge feature1
在master分支上執行該命令,與feature1分支合併。這種狀況下,Git沒法執行「快速合併」,只能試圖把各自的修改合併起來,但這種合併就可能會有衝突,果真衝突了!Git告訴咱們,readme.txt文件存在衝突,必須手動解決衝突後再提交。git status
也能夠告訴咱們衝突的文件
合併分支時,若是可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。若是要強制禁用Fast forward
模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息
git merge --no-ff -m "merge with with no-ff" dev
準備合併dev分支,注意--no-ff
參數表示禁用Fast forward,由於本次合併要建立一個新的commit,因此加上-m參數,把commit描述寫進去
Git還提供了一個stash功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做
git stash
保存工做現場
git stash list
查看工做現場
git stash apply
恢復工做現場,可是恢復後,stash內容並不刪除,有多個工做現場時能夠git stash apply stash@{0}
恢復特定的現場
git stash drop
刪除stash的內容
git stash pop
恢復的同時也把stas內容刪除了
這部分只介紹經常使用的幾個操做
git fetch origin
這個命令查找 「origin」 是哪個服務器,從中抓取本地沒有的數據,而且更新本地數據庫,移動 origin/master
指針指向新的、更新後的位置
git push (remote) (branch)
推送本地的分支來更新遠程倉庫上的 同名分支。如前文提到的git push origin master
就是將本地master分支推送到遠程master分支;複雜一點的,git push origin serverfix:awesomebranch
將本地的 serverfix分支推送到遠程倉庫上的awesomebranch分支
git push origin --delete serverfix
或者git push origin :remotebranch
,刪除遠程的serverfix分支
git pull
在大多數狀況下它的含義是一個git fetch
緊接着一個git merge
命令。具體可參考Git遠程操做詳解和Documentation git-pull