git經常使用指令整理及說明(詳細)

git經常使用指令整理及說明(詳細)

標籤: githtml


[TOC]git


本文是git系列博客的第二篇。本文對指令按照使用場景(建庫,查看,修改,分支)進行分類概括,介紹指令基本含義和用法,方便查閱。github

安裝和配置

參考我前面的博客:git在各操做系統平臺下的安裝和配置數據庫

工做區、版本庫和暫存區

  • 工做區:就是你在電腦裏能看到的目錄,好比個人learngit文件夾就是一個工做區。segmentfault

  • 版本庫:工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。服務器

  • 暫存區:Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。app

咱們把文件往Git版本庫裏添加的時候,是分兩步執行的:學習

  1. 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;fetch

  2. 第二步是用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 devgit checkout dev

  • git branch dev,新建分支是新建指針,指向當前commit

  • git checkout dev切換到dev分支

  • git checkout masterdev分支的工做完成,咱們就能夠切換回master分支(此時在dev分支的修改在master上是看不到的)

  • git merge dev 這是在master分支上執行的命令,做用是:把dev分支上的工做成果合併到master分支上

  • git branch -d dev 刪除已合併的分支。刪除分支就是刪除指針

  • git branch -D devGit友情提醒,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描述寫進去

bug分支

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

優秀教程&筆記


做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索