Git學習筆記:經常使用命令總結

Git工做流程

Git工做區、暫存區和版本庫

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

  • git add,暫存區目錄樹更新,工做區修改【或新增】的文件內容被寫入到對象庫的一個新對象中,而該對象的ID被記錄在暫存區的文件索引中。
  • git commit,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
  • git reset HARD,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。
  • git rm --cached <file>,直接從暫存區刪除文件,工做區則不作出改變。
  • git checkout .git checkout -- <file>,用暫存區所有或指定的文件替換工做區的文件。這個操做很危險,會清除工做區中未添加到暫存區的改動。
  • git checkout HEAD .git checkout HEAD <file>,用 HEAD 指向的 master 分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。

Git基本操做

  • workspace:工做區
  • staging area:暫存區,緩存區
  • local repository:本地倉庫
  • remote repository:遠程倉庫

基本操做流程:html

git init # 初始化倉庫,生成.git目錄
git add <file> # 添加文件到暫存區
git commit -m"<message>" # 將暫存區的內容添加到本地倉庫中

Git經常使用命令:建立倉庫

git init

初始化倉庫git

git init # 在當前目錄下初始化git倉庫 
git init newrepo # 在newrepo目錄下初始化git倉庫

在執行完成 git init 命令後,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的全部元數據,其餘的項目目錄保持不變。shell

git clone

下載項目vim

git clone <repo> # 克隆git倉庫的項目到當前目錄
git clone <repo> <directory> # 克隆git倉庫的項目到指定目錄

git config

設置git的配置信息緩存

git config # 顯示git的配置信息

# 針對系統上的全部倉庫,修改提交代碼的用戶信息
git config --global user.name "summerday"
git config --global user.email 13279076@qq.com

Git經常使用命令:提交與修改

git add

添加文件到倉庫fetch

git add [file1] [file2] # 添加文件file1和file2進入暫存區
git add [dir] # 添加dir目錄進入暫存區,包括子目錄
git add .     # 添加當前目錄下全部文件到暫存區
$ touch README.md
$ git add README.md

git status

查看在你上次提交以後是否有對文件進行再次修改。url

$ git status

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

一般使用-s得到簡短的輸出結果。spa

$ git status -s

A  README.md  # A 表示新添加

git diff

比較文件在暫存區和工做區的差別,主要應用場景版本控制

git diff [file]  # 還沒有緩存的改動
git diff --chached [file]  # 查看已緩存的改動
git diff --stat [file]   #顯示摘要而非整個diff

前置條件:已經將README.md加入到暫存區。指針

vim README.md  # 編輯 modified by summerday

$ git status -s
AM README.md

$ git diff # 顯示暫存區和工做區的差別
diff --git a/README.md b/README.md
index e69de29..4dc8994 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+modified by summerday!

$ git diff --cached README.md # 顯示暫存區和上一次提交(commit)的差別
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29

$ git diff --stat README.md  #顯示摘要而非整個diff
README.md | 1 +
1 file changed, 1 insertion(+)

git commit

將暫存區內容添加到本地倉庫中。

git commit -m [message]
git commit [file1] [file2] -m [message]
git commit -am [message] # add + commit 

git revert <commit> # 撤銷指定的修改
$ git commit -m "first commit !"
[master (root-commit) b81d562] first commit !
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
 
$ git status
On branch master
nothing to commit, working tree clean

nothing to commit, working tree clean,表示咱們在最近一次提交以後,沒有作任何改動,是乾淨的工做目錄。

能夠使用-a選項跳過git add

$ vim README.md # add : modified again!

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

$ git commit -am "modify and commit again!"
[master 4c3121a] modify and commit again!
 1 file changed, 1 insertion(+)

git reset

回退版本,能夠指定退回某一次提交的版本

git reset [--soft | --mixed | --hard] [HEAD]

--mixed 爲默認,能夠不用帶該參數,用於重置暫存區的文件與上一次的提交(commit)保持一致,工做區文件內容保持不變

git reset [HEAD]
git reset --mixed [HEAD]
$ git reset HEAD # 取消以前git add添加到暫存區的內容
$ git reset HEAD^ # 回退全部內容到上一版本 git reset HEAD~1
$ git reset HEAD^ 1.txt # 回退1.txt文件的版本到上一版本
$ git reset [version] # 回退到指定版本

--soft--mixed--head的區別能夠對照:git reset soft,hard,mixed之區別深解,總結以下:git reset命令是用來將當前branch重置到另一個commit的,而這個動做可能會將index以及work tree一樣影響,而三個參數表示影響程度上的不一樣:

  • --soft:僅僅將頭指針恢復,【已經add進暫存區的內容以及工做空間的全部東西都不變】。
  • --mixed:將頭指針恢復,已經add進暫存區的內容也會丟失,【工做空間的代碼什麼的是不變的,能夠根據狀況再次進行add,commit操做】。
  • --hard:一切就全都恢復了,頭指針恢復,已經add進暫存區的內容也會丟失,代碼什麼的也恢復到之前狀態,因此該參數需謹慎使用。

HEAD說明

^表示 數字表示 含義
HEAD HEAD~0 當前版本
HEAD^ HEAD~1 上一版本
HEAD^^ HEAD~2 上上個版本

git rm

刪除文件

git rm <file> # 從暫存區和工做區中刪除文件
git rm -f <file> # 若是刪除以前修改過,並已經放到暫存區中,須要強制刪除
git rm -cached <file> # 把文件從暫存區移除,但仍然但願保留在當前工做目錄中

git mv

移動或重命名工做區文件

git mv [file] [newfile] # 移動或重命名一個文件、目錄或軟連接
git mv -f [file] [newfile] # 若是新文件名已經存在,強制使用-f

Git經常使用命令:日誌信息

git log

查看歷史提交記錄

$ git log
commit bcc72cf028fa25cd8cebf7e310ebfe18d848d9e3 (HEAD -> master)
Author: xxx
Date:   Mon Nov 30 14:40:24 2020 +0800

    update

commit 272df45cb2357655f07576bc59bd92aac9c9fe96
Author: xxx
Date:   Mon Nov 30 12:50:22 2020 +0800

    first commit !

$ git log --oneline  # 查看簡潔版本
bcc72cf (HEAD -> master) update
272df45 first commit !
b81d562 first commit !

$ git log --graph # 顯示拓撲圖結構,顯示什麼時候工做分叉、又什麼時候歸併。
$ git log --reverse --oneline # 逆向顯示
$ git log --author=summerday --oneline -5 # 查看最近5行做者爲summerday的提交記錄
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges # 三週前且在四月十八日以後的全部提交 --no-merges 選項以隱藏合併提交

git blame

查看文件的修改記錄

$ git blame README.md 
272df45c (huayuhao 2020-11-30 12:50:22 +0800 1) modified by summerday!
bcc72cf0 (huayuhao 2020-11-30 14:40:24 +0800 2)
bcc72cf0 (huayuhao 2020-11-30 14:40:24 +0800 3) reset test!

git show

顯示信息

git show [version]  # 顯示某個提交的詳細內容
git show HEAD   # 顯示HEAD提交日誌
git show HEAD^  # 顯示HEAD的父(上一個版本)的提交日誌

Git經常使用命令:遠程操做

git remote

遠程倉庫操做

$ git remote -v
origin  git@xxx.git (fetch)
origin  git@xxx.git (push)
# origin爲遠程地址的別名

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

git remote add [shortname] [url] #添加遠程版本庫 shortname爲本地的版本庫
# git remote add origin xxx.git

git remote rm name # 刪除遠程倉庫
git remote rename old_name new_name # 修改倉庫名

git fetch

從遠程獲取代碼庫,須要手動merge。

git fetch origin
# 執行 git fetch 以後緊接着執行 git merge 遠程分支到你所在的任意分支
git merge origin/master

git pull

從遠程獲取代碼併合並本地的版本,至關於git fetch + git merge FETCH_HEAD

# 格式: git pull <遠程主機名> <遠程分支名>:<本地分支名>
git pull
git pull origin
git pull origin master:brantest # 將遠程主機 origin 的 master 分支拉取過來,與本地的 brantest 分支合併
git pull origin master # 遠程分支是與當前分支合併,則冒號後面的部分 能夠省略

git push

將本地的分支版本上傳到遠程併合並。

# 格式 : git push <遠程主機名> <本地分支名>:<遠程分支名>
# git push <遠程主機名> <本地分支名>  若是本地分支名與遠程分支名相同,則能夠省略冒號
git push origin master
git push --force origin master # 若是本地版本與遠程版本有差別,但又要強制推送
git push origin --delete master # 刪除主機但分支能夠使用 --delete 參數

Git標籤管理

git tag v1.0 # 最新一次提交打上(HEAD)"v1.0"的標籤
# 以後咱們執行 git log --decorate 就能夠看到咱們新增的標籤了。
git tag # 查看全部的標籤
git tag -d v1.0 # 刪除標籤
git show v1.0 # 查看此版本修改的內容

Git分支管理

幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味着你能夠從開發主線上分離開來,而後在不影響主線的同時繼續工做。

git branch (branchname) # 建立分支
git checkout (branchname) # 切換分支
git merge [otherbranches] # 合併到當前分支
git branch # 列出分支
git checkout -b (branchname) # 建立分支並當即切換到該分支下
git branch -d (branchname) #刪除分支
相關文章
相關標籤/搜索