Git常用指令彙總

本文作者: 李瑞豪
修改時間: 2019-09-01 10:38:24
本文鏈接: https://lruihao.cn/posts/git.html

介紹

  • 工作區:就是你在電腦裏能看到的目錄。
  • 暫存區:英文叫stage, 或index。一般存放在 “.git目錄下” 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
  • 版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關係:
{% asset_img work.jpg 工作區、暫存區和版本庫 %}

圖中左側爲工作區,右側爲版本庫。在版本庫中標記爲 "index" 的區域是暫存區(stage, index),標記爲 “master” 的是 master分支所代表的目錄樹。
圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"遊標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。
圖中的objects標識的區域爲 Git 的對象庫,實際位於 ".git/objects" 目錄下,裏面包含了創建的各種對象及內容。
當對工作區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。
當執行 "git rm --cached <file>" 命令時,會直接從暫存區刪除文件,工作區則不做出改變。
當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。
當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因爲不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

基本常用命令

第一次使用git的時候,需要設置用戶信息和用戶郵箱,用於辨識提交者身份。

git config --global user.name <git用戶名>
git config --global user.email <郵箱地址>
git config --list                           # 查看當前用戶信息

基本操作

git init                    # 把當前的目錄變成可以用git進行版本控制的git倉庫,生成隱藏.git文件。
git add XX                  # 把xx文件添加到暫存區去。
git add –A                  # git add --all的縮寫,提交全部
git add –a                  # 只提交刪除和修改的內容(不包括新增)
git add .                   # 監控工作區的狀態樹,使用它會把工作時的所有變化提交到暫存區
git commit -m "提交信息"     # 從暫存區提交到本地倉庫
git push origin master      # Git會把master分支推送到遠程庫對應的遠程分支上

commit內容規範

push

git push origin name
git push –u origin master
git push origin --delete name     # 刪除遠程分支

把當前master分支推送到遠程庫; -u表示記住分支和地址,下次使用git push即可。

remote

git remote add origin reposityUrl     # 關聯一個遠程庫
git remote                            # 查看遠程庫的信息
git remote –v                         # 查看遠程庫的詳細信息

clone

git clone reposityUrl                   # 從遠程庫中克隆
git clone -b branchName reposityUrl     # 克隆指定分支

pull

git pull

從遠程倉庫拉下來到本地庫然後合併相當於git fetch+git merge
一般push前先拉去最新版本,避免代碼衝突,如果有衝突需要解決了衝突才能提交。

fetch

git fetch               # 從遠程庫抓下最新版本,但是不合並

fetch是從遠程庫到本地庫,但是未在工作區,需要git merge

merge

git merge dev           # 在當前的分支上合併dev分支

分支合併也是在本地完成,新的分支只有在合併後才允許被刪除。

branch,checkout

git branch            # 查看當前所有的分支
git branch name       # 創建分支
git branch –r         # 看遠程所有分支
git branch –a         # 查看本地遠程分支
git branch –d name    # 刪除分支
git checkout name     # 切換分支
git checkout –b name  # 創建並切換到name分支上
git checkout -- file

git checkout -- file相當於取消對文檔的修改,將最新的本地版本庫的本文件複製覆蓋它。(比較危險!)

reflog,log

git log               # 顯示所有提交過的版本信息:commit id,提交者,日期
git reflog            # 查看歷史記錄的commit id

{% note info %}
想看到自己的操作記錄,則可以使用log與reflog,它兩個的區別如下:

  1. git log命令可以顯示所有提交過的版本信息;
    如果感覺太繁瑣,可以加上參數--pretty=oneline,只會顯示版本號和提交時的備註信息。
  2. git reflog可以查看所有分支的所有操作記錄。(包括已經被刪除的commit記錄和reset的操作)
    {% endnote %}

reset

git reset --hard HEAD^        
git reset --hard HEAD~        # 回退到上一個版本
git reset --hard HEAD~100     # 回退到100個版本

git reset head -- file        # 不加file則全部退回  
git reset file                # 將本地倉庫的當前版本退回至暫存區,相當於取消暫存

版本退回是從本地倉庫到暫存區,如果已經提交遠程庫,此時的版本是低於最新的版本的會拒絕提交,
需要用git push -f origin master強制提交。

status

git status

查看你的文件在暫存區和工作目錄的狀態,默認是較爲詳細的顯示,並提示你可以用何種命令完成你接下來可能要做的事情。

git status -s

較爲簡單的輸出當前的狀態,如:

$ git status -s
M  README.md
 D hello.rb
?? world.java

你可以看到,在簡短輸出中,有兩欄。第一欄是暫存區的,第二欄則是工作目錄的。這裏表示:

  • README.md 在暫存區中的狀態是 modify
  • hello.rd 在工作目錄中的狀態是 delete
  • world.java 還未添加到版本控制。

diff

git diff XX         # 查看XX文件修改了哪些內容

git diff            # 工作目錄和暫存區
git diff --cached   # 暫存區和本地倉庫
git diff HEAD 	    # 工作目錄和本地倉庫
git diff --stat     # 顯示信息摘要

rm, mv

git rm                           # 將文件從暫存區和工作目錄刪除,-f 爲強制刪除
git rm filename                  # 刪除文件
git rm –r dirname                # 刪除文件夾 –r 表示遞歸所有子目錄
git rm --cached <path>           # 將文件從暫存區中刪除
git mv <old_path> <new_path>

git rm用來刪除文件、目錄。git mv命令用於移動或重命名一個文件、目錄。

比如刪除photos文件,本地刪除後,遠程倉庫還會有,所以

git rm -r photos
git commit -m "刪除相冊"
git push

submodule

git submodule add         # 添加子模組

git submodule init        # 子模組初始化
git submodule update      # 子模組更新

{% note primary %}
當一個遠程庫有子模組時,直接clone子模組只是一個空文件夾,需要進入子模組的空文件夾initupdate纔行。
或者使用遞歸克隆git clone --recursive 遠程庫
子模組更新後,父模組必須更新,因爲需要更新commit id。
{% endnote %}

tag

git tag -a v1.0                   # 給最新一次提交打標籤
git tag -a <tagname> -m "標籤"    # 指定標籤信息命令
git tag                           # 查看版本打的Tag

{% note success %}
當你執行git tag -a命令時,Git會打開你的編輯器,讓你寫一句標籤註解,就像你給提交寫註解一樣。
如果我們忘了給某個提交打標籤,又將它發佈了,我們可以給它追加標籤。
{% endnote %}
例如,假設我們發佈了提交85fc7e7(最後一行),但是那時候忘了給它打標籤。 我們現在也可以:

$ git tag -a v0.9 85fc7e7
$ git log --oneline --decorate --graph
*   d5e9fc2 (HEAD -> master) Merge branch 'change_site'
|\  
| * 7774248 (change_site) changed the runoob.php
* | c68142b 修改代碼
|/  
* c1501a2 removed test.txt、add runoob.php
* 3e92c19 add test.txt
* 3b58100 (tag: v0.9) 第一次版本提交

stash

git stash               # 把當前的工作隱藏起來,等以後恢復現場後繼續工作
git stash list          # 查看所有被隱藏的文件列表

gitk

gitk      # git自帶GUI

其他

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章