玩轉Git就這麼簡單!這些常用命令你確定都用過嗎?

2020-12-25 探險家之指路明燈

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:遠程倉庫基本操作流程:

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

git init

初始化倉庫

git init # 在當前目錄下初始化git倉庫 git init newrepo # 在newrepo目錄下初始化git倉庫在執行完成 git init 命令後,Git 倉庫會生成一個 .git 目錄,該目錄包含了資源的所有元數據,其他的項目目錄保持不變。

git clone

下載項目

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.comGit常用命令:提交與修改

git add

添加文件到倉庫

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

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

$ git statusOn branch masterNo commits yetChanges to be committed: (use "git rm --cached <file>..." to unstage) new file: README.md通常使用-s獲得簡短的輸出結果。

$ git status -sA 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 -sAM README.md$ git diff # 顯示暫存區和工作區的差異diff --git a/README.md b/README.mdindex 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.mdnew file mode 100644index 0000000..e69de29$ git diff --stat README.md #顯示摘要而非整個diffREADME.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 statusOn branch masternothing to commit, working tree cleannothing to commit, working tree clean,表示我們在最近一次提交之後,沒有做任何改動,是乾淨的工作目錄。

可以使用-a選項跳過git add。

$ vim README.md # add : modified again!$ git statusOn branch masterChanges 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.mdno 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說明

^表示數字表示含義HEADHEAD~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] # 如果新文件名已經存在,強制使用-fGit常用命令:日誌信息

git log

查看歷史提交記錄

$ git logcommit bcc72cf028fa25cd8cebf7e310ebfe18d848d9e3 (HEAD -> master)Author: xxxDate: Mon Nov 30 14:40:24 2020 +0800 updatecommit 272df45cb2357655f07576bc59bd92aac9c9fe96Author: xxxDate: Mon Nov 30 12:50:22 2020 +0800 first commit !$ git log --oneline # 查看簡潔版本bcc72cf (HEAD -> master) update272df45 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 -vorigin 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.gitgit remote rm name # 刪除遠程倉庫git remote rename old_name new_name # 修改倉庫名git fetch

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

git fetch origin# 執行 git fetch 之後緊接著執行 git merge 遠程分支到你所在的任意分支git merge origin/mastergit pull

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

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

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

# 格式 : git push <遠程主機名> <本地分支名>:<遠程分支名># git push <遠程主機名> <本地分支名> 如果本地分支名與遠程分支名相同,則可以省略冒號git push origin mastergit 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) #刪除分支原文連結:https://www.cnblogs.com/summerday152/p/14069968.html

如果覺得本文對你有幫助,可以轉發關注支持一下

相關焦點

  • 小姐姐用動畫圖解Git命令,一看就懂!
    之前公眾號也發過很多git相關的文章:Git這些高級用法,喜歡就拿去用!一文速查Git常用命令,搞定版本控制照做就ok大牛總結的Git使用技巧,寫得太好了!掌握這10條規範,輕鬆搞定Git!但是呢,民工哥,也經常在後臺看到讀者說,命令太多了不好記啊,時間長了不用又忘記了等等的吐槽。
  • 三招教你輕鬆擴展 git bash 命令(下)
    如果碰巧 cmd 存在該命令,那麼既可以在 cmd 中直接運行該命令,也可以在 git bash 中藉助 winpty+cmd原生命令 方式調用該命令.示例:F:\workspace\git-bash-extend>tree卷 常用 的文件夾 PATH 列表卷序列號為 62AE-62CAF:.
  • Git命令和Sourcetree你更喜歡哪個?--文末送書
    可能對於很多開發來說,只要搞懂Git的push、pull、解決一些簡單的衝突命令就好了,事實上Git的功能十分強大,而通過背命令很難熟記每個邏輯。當然不同的ide開發環境都有各種各樣的Git插件,操作方法各不相同,不如直接學個跨平臺,不受ide限制的Git管理工具Sourcetree。不管你做Java,還是Python、Android都可以使用。
  • Git的奇技淫巧
    拒絕存在感缺失的無聊者--同時感謝各位朋友的支持與喜愛前行便是風景…▽ 下面開始正文Git常用命令集合,Fork於git-tips項目Git是一個「分布式版本管理工具」,簡單的理解版本管理工具:大家在寫東西的時候都用過「回撤」這個功能,但是回撤只能回撤幾步,假如想要找回我三天之前的修改,光用
  • 用 Python 還能玩 Git?
    用 Shell 做複雜的邏輯運算與流程控制就是一個災難。所以,用 Python 來實現是一個愉快的選擇。這時,就需要在 Python 中操作 Git 的庫。0.命令需要額外安裝。方法是:使用你的 everything 搜索 git-daemon.exe 在哪個目錄下,複製這個路徑設置到 PATH 裡去。在 Linux 下,需要先執行:./init-tests-after-clone.sh,配置一下,那麼這個文件從哪來呢?在 Github 上:https://github.com/gitpython-developers/GitPython2.
  • 小姐姐用動畫圖解 Git 的 10 大命令,這也太秀了吧!
    我覺得創建一些最常用且最有用的 Git 命令的可視化示例會是一個完美的用例!下面我將介紹的很多命令都有可選參數——你可以使用這些參數來改變對應命令的行為。而我的示例只會涵蓋命令的默認行為,而不會添加(或添加太多)可選配置!
  • Linux 命令行下的好東西
    就這個角度而言絕大多數 Linux 命令行的推廣簡直是爛透了。繁多 Linux 有用極了的命令行工具就靜靜的躺在你發行版默認安裝的包裹裡,很多時候只有當你碰到什麼問題的時候網上搜一圈才能知道。更蛋疼的是這裡面很多東西你一旦知道了就會想我靠原來沒這個到底是怎麼過的下去。所以這裡我會列出一些我用過的一些,大部分發行版默認就有,或者能用包裹管理工具輕鬆獲取的東西。
  • Git-給發行版籤名
    $ git tag -a maintainer-pgp-pub 659ef797d181633c87ec71ac3f9ba29fe5775b92在運行git push --tags命令之後,maintainer-pgp-pub標籤就會公布給所有人。
  • 這才是真正的Git——Git內部原理揭秘!
    我們時常有一種「我會用這個技術、這個框架」的錯覺,等到真正遇到問題,才發現事情沒有那麼簡單。而Git也是一個大部分人都知道如何去使用它,知道有哪些命令,卻只有少部分人知道具體原理的東西。了解一些底層的東西,可以更好的幫你理清思路,知道你真正在操作什麼,不會迷失在Git大量的指令和參數上面。
  • 如何恢復丟棄的 git stash 數據
    不要讓 git 命令中的錯誤抹去你數天的工作今天我的同事幾乎失去了他在四天工作中所做的一切。
  • 自從用上命令行神器「thefuck」, 再也不用擔心我敲錯命令了
    你是不是經常在終端敲錯命令?敲錯命令,刪掉重敲,很煩有沒有?
  • git 版本控制初學者指南
    幾乎可以肯定都是,Git 在任何職業環境中都會用到,你越早熟悉它,對僱主來說你就越有價值。此外,這將使團隊的項目工作變得更容易管理。你是否曾經將你的代碼搞得一團糟,甚至覺得從頭開始會更容易?有了版本控制,你可以返回到之前的某一個版本,而不需要在凌晨 2 點從頭再來。
  • 常用maven命令 - CSDN
    是不是像這樣:mvn archetype:create -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.ryanote -Dartifact=common  如果你還再用的話,那你就out了,現代人都用mvn archetype:generate了,它將創建項目這件枯燥的事更加人性化,你再也不需要記那麼多的
  • linux常用命令總結
    ) historyctrl + l(清屏,與clear命令作用相同)方向箭頭 上 下 可以查看執行過的命令ctrl + a 行首 ctrl + e 行尾ctrl + k 清除 ctrl+ w 清除單詞
  • 18 段代碼帶你玩轉 18 個機器學習必備交互工具
    sudo pip3 install jupyterJupyter Notebook使用起來既簡單又強大。你只需將它下載到本地計算機(它是帶有* .ipynb擴展名的文件),打開命令/終端Shell窗口,導航到該文件夾,然後運行「notebook」命令(代碼清單2)。此命令將打開一個網頁,顯示它從中啟動的文件夾的內容(圖3)。
  • 18段代碼帶你玩轉18個機器學習必備交互工具
    sudo pip3 install jupyterJupyter Notebook使用起來既簡單又強大。你只需將它下載到本地計算機(它是帶有* .ipynb擴展名的文件),打開命令/終端Shell窗口,導航到該文件夾,然後運行「notebook」命令(代碼清單2)。此命令將打開一個網頁,顯示它從中啟動的文件夾的內容(圖3)。
  • Linux編輯器中vi常用命令
    vi是Linux中功能強大的編輯器,下面是vi常用命令介紹vi 編輯器中有三種模式,分別為:命令模式、編輯模式和末行模式. ,且在替換前顯示提示符讓用戶確認(常用)命令模式刪除、複製與粘貼x ,XX為向後刪除一個字符,X為向前刪除一個字符(常用)nx向後刪除n個字符dd刪除光標所在那一整行(常用)ndd刪除光標所在行的向下n行(常用)d1G刪除光標所在行到第1行的所有數據dG刪除光標所在行到最後一行的所有數據yy複製光標所在的行(常用)nyy複製光標所在的行向下n行(常用)y1G複製光標所在的行到第一行的所有數據yG複製光標所在的行到最後一行的所有數據
  • 【Linux】常用命令:rm 高級用法簡單講
    作者:不愛孤獨愛戰爭來源:微信公眾號 光榮之路(ID:gloryroadtrain)Linux常用命令第五集包含命令:rm一、命令簡介刪除一個目錄中的一個或多個文件或目錄,如果沒有使用- r選項,則rm不會刪除目錄。
  • 學會這些 shell 小技巧,我就愛上 Linux 了
    three3你看,花括號中的每個字符都可以和之後(或之前)的字符串進行組合拼接,注意花括號和其中的逗號不可以用空格分隔,否則會被認為是普通的字符串對待。比如按下Ctrl+R之後,輸入sudo,bash 就會搜索出最近一次包含sudo的命令,你回車之後就可以運行該命令了:(reverse-i-search)`sudo': sudo apt install git但是這個方法有缺點:首先,該功能似乎只有 bash 支持,我用的 zsh 作為 shell 終端,就用不了;第二,只能查找出一個(最近的
  • CAD一鍵到底:關於「A」開頭的命令你都會用嗎?
    如果我問你,在CAD中,字母「A」開頭的命令有多少個,你能準確告訴我一個數字嗎?據不完全統計,在命令行輸入A,下拉命令就有82個(大家不會真的去數吧),說實話,對很多小夥伴來說,A開頭的很多命令都不能清晰分辨,更別說怎樣去使用了。