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

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

標籤: git



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

安裝和配置

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

工作區、版本庫和暫存區

  • 工作區:就是你在電腦裏能看到的目錄,比如我的learngit文件夾就是一個工作區。
  • 版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
  • 暫存區:Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。

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

  1. 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
  2. 第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在git commit就是往master分支上提交更改。

簡單理解:需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

詳細知識見工作區和暫存區Git 基礎 - 記錄每次更新到倉庫

本地庫和遠程庫

新建倉庫

  • 建立遠程庫(爲空,不要加README.md,不然後面會push不上去)
  • 本地新建文件夾
  • git init初始化倉庫,可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的。勿人爲瞎改
  • 遠程庫的名字就是origin,這是Git默認的叫法
  • git remote add origin [email protected]: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 [email protected]: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 某版本號前幾位通過命令行上的歷史信息(假如你沒清屏的話),找到某版本 的版本號回到指定版本。不一定要全部的版本號,就像這個命令的例子,只要前面的約7、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

發佈了96 篇原創文章 · 獲贊 99 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章