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 分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。基本操做流程:html
git init # 初始化倉庫,生成.git目錄 git add <file> # 添加文件到暫存區 git commit -m"<message>" # 將暫存區的內容添加到本地倉庫中
初始化倉庫git
git init # 在當前目錄下初始化git倉庫 git init newrepo # 在newrepo目錄下初始化git倉庫
在執行完成 git init 命令後,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的全部元數據,其餘的項目目錄保持不變。shell
下載項目vim
git clone <repo> # 克隆git倉庫的項目到當前目錄 git clone <repo> <directory> # 克隆git倉庫的項目到指定目錄
設置git的配置信息緩存
git config # 顯示git的配置信息 # 針對系統上的全部倉庫,修改提交代碼的用戶信息 git config --global user.name "summerday" git config --global user.email 13279076@qq.com
添加文件到倉庫fetch
git add [file1] [file2] # 添加文件file1和file2進入暫存區 git add [dir] # 添加dir目錄進入暫存區,包括子目錄 git add . # 添加當前目錄下全部文件到暫存區
$ touch README.md $ git add README.md
查看在你上次提交以後是否有對文件進行再次修改。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 [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 -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 [--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~0 | 當前版本 |
HEAD^ | HEAD~1 | 上一版本 |
HEAD^^ | HEAD~2 | 上上個版本 |
刪除文件
git rm <file> # 從暫存區和工做區中刪除文件 git rm -f <file> # 若是刪除以前修改過,並已經放到暫存區中,須要強制刪除 git rm -cached <file> # 把文件從暫存區移除,但仍然但願保留在當前工做目錄中
移動或重命名工做區文件
git mv [file] [newfile] # 移動或重命名一個文件、目錄或軟連接 git mv -f [file] [newfile] # 若是新文件名已經存在,強制使用-f
查看歷史提交記錄
$ 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 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 [version] # 顯示某個提交的詳細內容 git show HEAD # 顯示HEAD提交日誌 git show HEAD^ # 顯示HEAD的父(上一個版本)的提交日誌
遠程倉庫操做
$ 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 # 修改倉庫名
從遠程獲取代碼庫,須要手動merge。
git fetch origin # 執行 git fetch 以後緊接着執行 git merge 遠程分支到你所在的任意分支 git merge origin/master
從遠程獲取代碼併合並本地的版本,至關於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 origin master git push --force origin master # 若是本地版本與遠程版本有差別,但又要強制推送 git push origin --delete master # 刪除主機但分支能夠使用 --delete 參數
git tag v1.0 # 最新一次提交打上(HEAD)"v1.0"的標籤 # 以後咱們執行 git log --decorate 就能夠看到咱們新增的標籤了。 git tag # 查看全部的標籤 git tag -d v1.0 # 刪除標籤 git show v1.0 # 查看此版本修改的內容
幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味着你能夠從開發主線上分離開來,而後在不影響主線的同時繼續工做。
git branch (branchname) # 建立分支 git checkout (branchname) # 切換分支 git merge [otherbranches] # 合併到當前分支 git branch # 列出分支 git checkout -b (branchname) # 建立分支並當即切換到該分支下 git branch -d (branchname) #刪除分支