git常用指令整理及說明(詳細)
標籤: git
本文是git系列博客的第二篇。本文對指令按照使用場景(建庫,查看,修改,分支)進行分類歸納,介紹指令基本含義和用法,方便查閱。
安裝和配置
參考我前面的博客:git在各操作系統平臺下的安裝和配置
工作區、版本庫和暫存區
- 工作區:就是你在電腦裏能看到的目錄,比如我的learngit文件夾就是一個工作區。
- 版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
- 暫存區:Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
我們把文件往Git版本庫裏添加的時候,是分兩步執行的:
- 第一步是用
git add
把文件添加進去,實際上就是把文件修改添加到暫存區;- 第二步是用
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 dev
和git checkout dev
git branch dev
,新建分支是新建指針,指向當前commitgit 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描述寫進去
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