Git快速入門和經常使用命令

簡易圖解git流程概念

  • Workspace:工做區
  • Index / Stage:暫存區
  • Repository:本地倉庫區(用HEAD指向最後一次commit的結果)
  • Remote:遠程倉庫

1、快速入門

本地初始化一個項目

首先,你須要執行下面兩條命令,做爲 git 的基礎配置,做用是告訴 git 你是誰,你輸入的信息將出如今你建立的提交中。css

git config --global user.name "你的名字或暱稱"
git config --global user.email "你的郵箱"

而後在你的須要初始化版本庫的文件夾中執行:html

git init 
git remote add origin <你的項目地址> //注:項目地址形式爲:http://git.oschina.net/xxx/xxx.git或者 git@git.oschina.net:xxx/xxx.git

這樣就完成了一次版本你的初始化。git

若是你想克隆一個項目,只須要執行:github

git clone <項目地址>

完成第一次提交

進入你已經初始化好的或者克隆項目的目錄,而後執行:緩存

 
 
git pull origin master  #從遠程倉庫獲取最新版本併合並<這裏須要修改/添加文件,不然與原文件相比就沒有變更>
git add .
git commit -m "這是我第一次提交的說明"
git push origin master

而後若是須要帳號密碼的話就輸入帳號密碼,這樣就完成了一次提交。服務器

2、基本命令

配置

#顯示當前的Git配置
git config --list

#編輯Git配置文件
git config -e [--global]

#設置提交代碼時的用戶信息
git config --global user.name "[name]"
git config --global user.email "[email address]"

獲取與建立本地項目

git init    # 在當前目錄新建一個Git代碼庫
git init 目錄    # 新建一個目錄,將其初始化爲Git代碼庫
git clone 項目地址URL    #拷貝一個Git倉庫到本地

默認狀況下,Git 會按照你提供的 URL 所指示的項目的名稱建立你的本地項目目錄。 一般就是該 URL 最後一個 / 以後的項目名稱。若是你想要一個不同的名字, 你能夠在該命令後加上你想要的名稱。URL也能夠是你的本地倉庫地址,這樣就是建立了一個本地倉庫的克隆版本。網絡

增長/刪除文件到Index

你能夠計劃改動(把它們添加到緩存區),使用以下命令:
git add <filename>
git add *
這是 git 基本工做流程的第一步;yii

# 添加指定文件到暫存區
git add [file1] [file2] ...

# 添加指定目錄到暫存區,包括子目錄
git add [dir]

# 添加當前目錄的全部文件到暫存區
git add .

# 添加每一個變化前,都會要求確認
# 對於同一個文件的多處變化,能夠實現分次提交
git add -p

# 刪除工做區文件,而且將此次刪除放入暫存區
git rm [file1] [file2] ...

# 把文件從暫存區域移除,但保留在當前工做目錄中
git rm --cached [file]

# 若是刪除以前修改過而且已經放到暫存區域的話,則必需要用強制刪除選項 -f
git rm -f [file]

# 遞歸刪除整個目錄中的全部子目錄和文件
git rm –r * 

# 更名文件,而且將這個更名放入暫存區
git mv [file-original] [file-renamed]

代碼提交

使用以下命令以實際提交改動:
git commit -m "代碼提交信息"
如今,你的改動已經提交到了 HEAD,可是還沒到你的遠端倉庫。ssh

# 提交暫存區到倉庫區,並填寫備註信息
git commit -m [message]

# 提交暫存區的指定文件到倉庫區
git commit [file1] [file2] ... -m [message]

# 提交工做區自上次commit以後的變化,直接到倉庫區
git commit -a

# 提交時顯示全部diff信息
git commit -v

# 使用一次新的commit,替代上一次提交
# 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息
git commit --amend -m [message]

# 重作上一次commit,幷包括指定文件的新變化
git commit --amend [file1] [file2] ...

同步遠程倉庫

你的改動如今已經在本地倉庫的 HEAD 中了。執行以下命令以將這些改動提交到遠端倉庫:
git push origin master
能夠把 master 換成你想要推送的任何分支。 ide

若是你尚未克隆現有倉庫,並欲將你的倉庫鏈接到某個遠程服務器,你可使用以下命令添加:
git remote add origin <server>
如此你就可以將你的改動推送到所添加的服務器上去了。

# 下載遠程倉庫的全部變更
git fetch [remote]

# 查看當前配置有哪些遠程倉庫
git remote -v

# 顯示某個遠程倉庫的信息
git remote show [remote]

# 增長一個新的遠程倉庫,並命名
git remote add [shortname] [url]

# 取回遠程倉庫的變化,並與本地分支合併
git pull [remote] [branch]

# 上傳本地指定分支到遠程倉庫
git push [remote] [branch]

# 強行推送當前分支到遠程倉庫,即便有衝突
git push [remote] --force

# 推送全部分支到遠程倉庫
git push [remote] --all

要更新你的本地倉庫至最新改動,執行:
git pull
以在你的工做目錄中 獲取(fetch) 並 合併(merge) 遠端的改動。
要合併其餘分支到你的當前分支(例如 master),執行:
git merge <branch>
兩種狀況下,git 都會嘗試去自動合併改動。不幸的是,自動合併並不是次次都能成功,並可能致使 衝突(conflicts)。 這時候就須要你修改這些文件來人肉合併這些 衝突(conflicts) 了。改完以後,你須要執行以下命令以將它們標記爲合併成功:
git add <filename>
在合併改動以前,也可使用以下命令查看:
git diff <source_branch> <target_branch>

3、查看信息

# 列出當前目錄全部尚未被git管理的文件和被git管理且被修改但還未提交(git commit)的文件,-s參數可簡化顯示
git status

# 顯示全部提交過的用戶,按提交次數排序
git shortlog -sn

# 顯示指定文件是什麼人在什麼時間修改過
git blame [file]

# 顯示暫存區和工做區的差別
git diff

# 顯示暫存區和上一個commit的差別
git diff --cached [file]

# 顯示工做區與當前分支最新commit之間的差別
git diff HEAD

# 顯示兩次提交之間的差別
git diff [first-branch]...[second-branch]

# 顯示今天你寫了多少行代碼
git diff --shortstat "@{0 day ago}"

# 顯示某次提交的元數據和內容變化
git show [commit]

# 顯示某次提交發生變化的文件
git show --name-only [commit]

# 顯示某次提交時,某個文件的內容
git show [commit]:[filename]

# 顯示當前分支的最近幾回提交
git reflog

4、撤銷

假如你作錯事,你可使用以下命令替換掉本地改動:
git checkout -- <filename>
此命令會使用 HEAD 中的最新內容替換掉你的工做目錄中的文件。已添加到緩存區的改動,以及新文件,都不受影響。

假如你想要丟棄你全部的本地改動與提交,能夠到服務器上獲取最新的版本並將你本地主分支指向到它:
git fetch origin
git reset --hard origin/master

# 恢復暫存區的指定文件到工做區
git checkout [file]

# 恢復某個commit的指定文件到暫存區和工做區
git checkout [commit] [file]

# 恢復暫存區的全部文件到工做區
git checkout .

# 重置暫存區的指定文件,與上一次commit保持一致,但工做區不變
git reset [file]

# 重置暫存區與工做區,與上一次commit保持一致
git reset --hard

# 重置當前分支的指針爲指定commit,同時重置暫存區,但工做區不變
git reset [commit]

# 重置當前分支的HEAD爲指定commit,同時重置暫存區和工做區,與指定commit一致
git reset --hard [commit]

# 重置當前HEAD爲指定commit,但保持暫存區和工做區不變
git reset --keep [commit]

# 新建一個commit,用來撤銷指定commit
# 後者的全部變化都將被前者抵消,而且應用到當前分支
git revert [commit]

# 暫時將未提交的變化移除,稍後再移入
git stash
git stash pop

5、分支管理

分支是用來將特性開發絕緣開來的。在你建立倉庫的時候,master 是「默認的」。在其餘分支上進行開發,完成後再將它們合併到主分支上。
建立一個叫作「feature_x」的分支,並切換過去:
git checkout -b feature_x
切換回主分支:
git checkout master
再把新建的分支刪掉:
git branch -d feature_x
除非你將分支推送到遠端倉庫,否則該分支就是 不爲他人所見的:
git push origin <branch>

# 列出全部本地分支
git branch

# 列出全部遠程分支
git branch -r

# 列出全部本地分支和遠程分支
git branch -a

# 新建一個分支,但依然停留在當前分支
git branch [branch-name]

# 新建一個分支,並切換到該分支
git checkout -b [branch]

# 新建一個分支,指向指定commit
git branch [branch] [commit]

# 新建一個分支,與指定的遠程分支創建追蹤關係
git branch --track [branch] [remote-branch]

# 切換到指定分支,並更新工做區
git checkout [branch-name]

# 切換到上一個分支
git checkout -

# 創建追蹤關係,在現有分支與指定的遠程分支之間
git branch --set-upstream [branch] [remote-branch]

# 合併指定分支到當前分支
git merge [branch]

# 選擇一個commit,合併進當前分支
git cherry-pick [commit]

# 刪除分支
git branch -d [branch-name]

# 刪除遠程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]

6、歷史記錄

# 列出歷史提交記錄
git log

# 顯示commit歷史,以及每次commit發生變動的文件
git log --stat

# 查看歷史記錄的簡潔的版本
git log --oneline    

# 查看歷史中何時出現了分支、合併
git log --oneline --graph    

# 逆向顯示全部日誌
git log --reverse --oneline    

# 查看歷史中何時出現了分支、合併
git log --oneline --graph

# 顯示指定文件相關的每一次diff
git log -p [file]

# 搜索提交歷史,根據關鍵詞
git log -S [keyword]

# 顯示某個commit以後的全部變更,每一個commit佔據一行
git log [tag] HEAD --pretty=format:%s

# 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件
git log [tag] HEAD --grep feature

# 顯示某個文件的版本歷史,包括文件更名
git log --follow [file]
git whatchanged [file]

# 顯示過去5次提交
git log -5 --pretty --oneline

# 查找指定用戶的提交日誌,看5條
git log --author=用戶名 --oneline -5   
 
# 查看3周前且在12月12日以後的全部提交,--no-merges 選項以隱藏合併提交
git log --oneline --before={3.weeks.ago} --after={2017-12-12} --no-merges

7、標籤

在軟件發佈時建立標籤,是被推薦的。這是個舊有概念,在 SVN 中也有。能夠執行以下命令以建立一個叫作 1.0.0 的標籤:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要標記的提交 ID 的前 10 位字符。使用以下命令獲取提交 ID:
git log
你也能夠用該提交 ID 的少一些的前幾位,只要它是惟一的。

# 列出全部tag
git tag

# 新建一個tag在當前commit
# -a 選項意爲"建立一個帶註解的標籤"。 不用 -a 選項也能夠執行的,但它不會記錄這標籤是啥時候打的,誰打的,也不會讓你添加個標籤的註解。 我推薦一直建立帶註解的標籤
git tag -a [tag]

# 新建一個tag在指定commit
git tag [tag] [commit]

# 刪除本地tag
git tag -d [tag]

# 刪除遠程tag
git push origin :refs/tags/[tagName]

# 查看tag信息
git show [tag]

# 提交指定tag
git push [remote] [tag]

# 提交全部tag
git push [remote] --tags

# 新建一個分支,指向某個tag
git checkout -b [branch] [tag]

Git有commit,爲何還要引入tag?
"請把上週一的那個版本打包發佈,commit號是6a5819e…"
"一串亂七八糟的數字很差找!"
若是換一個辦法:
"請把上週一的那個版本打包發佈,版本號是v1.2"
"好的,按照tag v1.2查找commit就行!"
因此,tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一塊兒。

8、http(s)方式如何自動記住密碼

https 方式每次都要輸入密碼,按照以下設置便可輸入一次就不用再手輸入密碼的困擾並且又享受 https 帶來的極速

按照如下設置記住密碼十五分鐘:

git config --global credential.helper cache

若是你想自定義記住的時間,能夠這樣:

git config credential.helper 'cache --timeout=3600' //這裏記住的是一個小時,如需其餘時間,請修改3600爲你想修改的時間,單位是秒

你也能夠設置長期記住密碼:

git config --global credential.helper store

或修改倉庫的地址帶上你的帳號密碼

http://yourname:password@git.oschina.net/name/project.git //注意,當使用郵箱時,請對@符號使用%40替換

若是你本來使用的 ssh 地址想更換成 http(s) 地址,能夠執行如下命令:

//刪除本來的ssh倉庫地址
git remote rm origin //origin 表明你本來ssh地址的倉庫的別名
//新增http地址的倉庫
git remote add origin http://git.oschina.net/username/project.git

8、版本回退

回退遠程倉庫的版本

先在本地切換到遠程倉庫要回退的分支對應的本地分支,而後本地回退至你須要的版本,而後執行:

git push <倉庫名> <分支名> -f

以當前版本爲基礎,回退指定個commit

首先,確認你當前的版本須要回退多少個版本,而後計算出你要回退的版本數量,執行以下命令

git reset HEAD~X //X表明你要回退的版本數量,是數字!!!!

須要注意的是,若是你是合併過度支,那麼被合併分支帶過來的 commit 並不會被計入回退數量中,而是隻計算一個,因此若是須要一次回退多個 commit,不建議使用這種方法

回退到和遠程版本同樣

有時候,當發生錯誤修改須要放棄所有修改時,能夠以遠程分支做爲回退點退回到與遠程分支同樣的地方,執行的命令以下

git reset --hard origin/master // origin表明你遠程倉庫的名字,master表明分支名

 

參考資料:

Git教程-廖雪峯的官方網站

經常使用 Git命令清單-阮一峯的網絡日誌

Git教程-菜鳥教程

Git教程-易百教程

碼雲平臺幫助文檔

圖解Git

git使用簡易指南

相關文章
相關標籤/搜索