本篇文章將對git在作業和學習中需要用到的大部分常用指令作詳細解答,
覺得有用的C友們可以點個贊支持一下,你們的支持就是我最大的動力~
本文總結自廖雪峰老師的檔案
1.git的初步認識
2.git add與git commit
3.git status和git diff
4.版本回退git reset與查看日志git log/git relog
5.撤銷修改git checkout及git reset(再提及)
6.洗掉檔案
7.分支管理 branch與switch
8.標簽的使用 git tag與git show
- 創建標簽
- 查看標簽
- 洗掉標簽
- 推送標簽到遠程庫
9.遠程倉庫的連接
- 與遠程庫建立連接
- 向遠程庫輸出本地庫中的檔案
- 洗掉遠程庫
10.與Github或Gitee建立檔案傳輸機制
1.git的初步認識
首先,Git在本地中具有作業區、暫存區與本地倉庫區
平時我們修改代碼時叫做作業區,當你完成專案到某個進度想保存時,那么便可將代碼存到暫存區,暫存區類似于word檔案中的自動保存功能,當你確認暫存區中的代碼沒問題要保存時,便可將代碼由暫存區轉到本地倉庫區,
那么對于一個目錄,如何將它變成Git可以管理的倉庫呢?(本地倉庫,還不是遠程倉庫)
答案是:在當前目錄下運行git init指令創建一個版本庫,然后這個目錄里面的所有檔案就可以被Git管理起來,每個檔案的修改、洗掉,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”,
可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的檔案,不然改亂了,就把Git倉庫給破壞了,如果你沒有看到.git目錄,那是因為這個目錄默認是隱藏的,

2.git add與git commit
由于Github使用面更廣,后續演示都是針對Github來展開
總體來說,把一個檔案放到本地Git倉庫只需要兩步,
- 第一步,用命令
git add告訴Git,把某個檔案從作業區添加到暫存區, git add <file>
$ git add readme.txt//將readme.txt檔案添加到暫存區
執行上面的命令,如果沒有任何顯示,代表正確運行,

- 第二步,用命令
git commit告訴Git,將暫存區中所有檔案一次性從暫存區添加到本地倉庫區, git commit -m <message>
$ git commit -m "wrote a readme file"//將readme.txt檔案添加到本地倉庫

💥詳解💥
.
簡單解釋一下git commit命令,-m后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄,git commit命令執行成功后會告訴你,1 file changed:1個檔案被改動(我們新添加的readme.txt檔案);2 insertions:插入了兩行內容(readme.txt有兩行內容),
為什么Git添加檔案需要add,commit一共兩步呢?因為commit可以一次提交很多檔案,所以你可以多次add不同的檔案,比如:
$ git add file1.txt
$ git add file2.txt file3.txt//一次add命令可以有多個檔案,用空格分隔
$ git commit -m "add 3 files."
3.git status和git diff
git status命令能查看當前目錄中所有檔案的代碼狀態,如果檔案是紅色那說明檔案被修改過但還沒將此次修改提交,
git diff命令顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式,git diff后面跟檔案名稱是是查看作業區(working tree)與暫存區(index)的差別的
4.版本回退git reset與查看日志git log/git relog
你不斷對檔案進行修改,然后不斷提交修改到版本庫里,就好比玩游戲時,每通過一關就會自動把游戲狀態存盤,如果某一關沒過去,你還可以選擇讀取前一關的狀態,有些時候,在打Boss之前,你會手動存盤,以便萬一打Boss失敗了,可以從最近的地方重新開始,Git也是一樣,每當你覺得檔案修改到一定程度的時候,就可以“保存一個快照”,這個快照在Git中被稱為commit,一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢復,然后繼續作業,而不是把幾個月的作業成果全部丟失,這就是版本回退,
假設對于readme.txt檔案,我已經提交了三個版本的修改,而對于git commit -m <message>,-m后面輸入的本次提交說明如下:
版本1:wrote a readme file
版本2:add distributed
版本3:append GPL(最新版本)
- git log
當然,在實際作業中,我們腦子里怎么可能記得一個幾千行的檔案每次都改了什么內容,不然要版本控制系統Git干什么,版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)//最新的一次修改
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline引數
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL//最新的一次修改
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
💥友情提示:你看到的一大串類似1094adb…的是commit id(版本號),你看到的commit id和我的肯定不一樣,以你自己的為準,為什么commit id需要用這么一大串數字表示呢?因為Git是分布式的版本控制系統,后面我們還要研究多人在同一個版本庫里作業,如果大家都用1,2,3……作為版本號,那肯定就沖突了,版本號沒必要寫全,前幾位就可以了,Git會自動去找
打算把readme.txt回退到上一個版本,也就是add distributed的那個版本,怎么做呢?
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100,
- git reset
現在,我們要把當前版本append GPL回退到上一個版本add distributed,就可以使用git reset
$ git reset --hard HEAD^//去上一個版本
HEAD is now at e475afc add distributed
也可以指定某個commit版本進行還原
$ git reset --hard 1094a//指定commit版本前五位數為1094a的進行還原
HEAD is now at 83b0afe append GPL
如果你忘記了commit版本號,可以通過git reflog來找,git reflog記錄了你的每一次命令
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
💥程序圖示:

總結:
HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令
git reset --hard commit_id,- 穿梭前,用
git log可以查看提交歷史,以便確定要回退到哪個版本, - 要重返未來,用
git reflog查看命令歷史,以便確定要回到未來的哪個版本,
5.撤銷修改git checkout及git reset(再提及)
- 撤銷作業區的修改
當你對作業區檔案完成修改時,你可以選擇git add提交到暫存區,也可以選擇git checkout撤銷此次修改
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
命令git checkout -- readme.txt意思就是,把readme.txt檔案在作業區的修改全部撤銷,
這里有兩種情況:
一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到上次提交到暫存區后的狀態,
總之,就是讓這個檔案回到最近一次git commit或git add時的狀態,
- 撤銷暫存區的修改
當你對作業區檔案完成修改且已經提交到了暫存區,你可以選擇git commit提交到本地倉庫區,也可以選擇git reset把暫存區的修改撤銷掉
$ git reset HEAD readme.txt//前文講過,HEAD代表當前最新版本的檔案
Unstaged changes after reset:
M readme.txt
可知,git reset命令既可以回退版本,也可以把暫存區的修改撤銷到作業區,
- 撤銷本地倉庫區的修改
什么時候需要撤銷本地倉庫區的修改呢?那便是已經git commit到本地倉庫了,那便回到前文的版本回退章節進行查閱,git reset --hard 指定版本即可
6.洗掉檔案
在Git中,洗掉也是一個修改操作
一般情況下,你通常直接在檔案管理器中把沒用的檔案刪了,或者用rm <file>命令刪了
$ rm test.txt
這個時候,Git知道你洗掉了檔案,因此,作業區和版本庫就不一致了
- 如果你只是誤刪檔案,那么可以通過
git checkout指令恢復(撤銷本次修改)
$ git checkout -- test.txt
- 如果你確實要從版本庫中洗掉該檔案,那就用命令
git rm刪掉,再git commit提交本次修改
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
小提示:先手動洗掉檔案,然后使用git rm 和git add效果是一樣的,
7.分支管理 branch與switch
分支在實際中有什么用呢?假設你準備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導致別人不能干活了,如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險,
現在有了分支,就不用怕了,你創建了一個屬于你自己的分支,別人看不到,還繼續在原來的分支上正常作業,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人作業,
💥用branch系列指令進行分支相關操作
- 查看分支
用git branch命令列出本地倉庫中所有分支,當前分支前面會標一個*號
$ git branch
* dev
master
- 創建與合并分支
- 創建
git branch dev創建dev分支
git checkout dev將HEAD指標切換到dev分支
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
git checkout -b dev git checkout命令加上-b引數表示創建并切換,相當于上面兩條命令
先創建dev分支,然后切換到dev分支
$ git checkout -b dev
Switched to a new branch 'dev'
- 合并
當你在dev分支上對readme.txt檔案進行修改后,想將該修改合并到master主分支上時,兩步:
先git checkout 分支名切換到master分支
$ git checkout master
Switched to branch 'master'
再git merge 需要被合并的分支名合并dev分支
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
合并完成后,就可以洗掉dev分支了,相較于git checkout dev添加分支,加個引數-d代表delete
$ git branch -d dev
Deleted branch dev (was b17d20e).
💥用switch系列指令進行分支相關操作
注意到切換分支使用git checkout <branch>,而前面講過的撤銷修改則是git checkout -- <file>,同一個命令,有兩種作用,確實有點令人迷惑,
實際上,切換分支這個動作,用switch更容易理解,因此,最新版本的Git提供了新的git switch命令來切換分支:
創建并切換到新的dev分支,可以使用:
$ git switch -c dev//代替git checkout -b dev
直接切換到已有的master分支,可以使用:
$ git switch master//代替git branch dev
💥總結:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>或者git switch <name>
創建+切換分支:git checkout -b <name>或者git switch -c <name>
合并某分支到當前分支:git merge <name>
洗掉分支:git branch -d <name>
8.標簽的使用 git tag與git show
前言:為什么要使用標簽?
發布一個版本時,我們通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本,將來無論什么時候,取某個標簽的commit版本,就是把那個打標簽的時刻的歷史版本取出來,所以,標簽也是版本庫的一個快照,
Git有commit版本號,為什么還要引入tag?
因為commit版本是類似6a5819e...的一大串字符,不好找、辨別
如果將6a5819e...變成v1.2,就容易了很多
所以,tag就是一個讓人容易記住的有意義的名字,它跟某個commit版本號綁在一起,
創建標簽
git tag <tagname>
git tag -a <tagname> -m "blablabla..."
- 給整個分支打標簽
首先,git branch切換到需要打標簽的分支上
$ git branch
* dev
master
$ git checkout master
Switched to branch 'master'
然后git tag <tagname>打標簽即可
$ git tag v1.0
- 給過去的某個commit版本打標簽
git tag <tagname> <commid id>
默認標簽是打在最新提交的commit上的,歷史的找到歷史提交的commit id,然后打上就可以了
比方說要對add merge這次提交打標簽,它對應的commit id是f52c633
$ git tag v0.9 f52c633
還可以創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字
git tag -a <tagname> -m "blablabla..." <commit id>
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
查看標簽
git tag
可以用命令git tag查看所有標簽
$ git tag
v1.0
git show <tagname>
標簽不是按時間順序列出,而是按字母排序的,可以用git show <tagname>查看標簽資訊:
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800
add merge
diff --git a/readme.txt b/readme.txt
...
洗掉標簽
-
命令
git tag -d <tagname>可以洗掉一個本地標簽; -
命令
git push origin :refs/tags/<tagname>可以洗掉一個遠程標簽,
推送標簽到遠程庫
-
命令
git push origin <tagname>可以推送一個本地標簽; -
命令
git push origin --tags可以推送全部未推送過的本地標簽;
9.遠程倉庫的連接
目前廣為人知的兩個遠程倉庫有Github和Gitee(碼云)
Github:人氣最高,人們普遍使用的一個國際化代碼管理平臺
Gitee:使用GitHub時,國內的用戶經常遇到的問題是訪問速度太慢,有時候還會出現無法連接的情況
如果我們希望體驗Git飛一般的速度,可以使用國內的Git托管服務——Gitee(gitee.com)
目標:
在本地創建了一個Git倉庫后,又想在GitHub創建一個Git倉庫,并且讓這兩個倉庫進行遠程同步,
與遠程庫建立連接
git remote add 遠程倉庫名字 git@github.com:遠程倉庫路徑//遠程倉庫路徑如下圖
$ git remote add origin git@github.com:michaelliao/learngit.git

建立好連接后,遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫,
向遠程庫輸出本地庫中的檔案
git push -u 遠程倉庫名稱 要推送的本地分支名稱
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程,
由于遠程庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令,
從現在起,只要本地作了提交,就可以通過命令:
$ git push origin master//origin依舊為遠程庫名稱,master為要推送的分支名稱
洗掉遠程庫
在洗掉前,建議先用git remote -v查看遠程庫資訊
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)
git remote rm <name> 洗掉遠程庫,name為遠程庫名稱
比如洗掉前文創建的名為origin的遠程庫
$ git remote rm origin
溫馨提示:此處的“洗掉”其實是解除了本地和遠程的系結關系,并不是物理上洗掉了遠程庫,遠程庫本身并沒有任何改動,要真正洗掉遠程庫,需要登錄到GitHub,在后臺頁面找到洗掉按鈕再洗掉,
💥總結:
-
要關聯一個遠程庫,使用命令
git remote add 遠程倉庫名字 git@github.com:遠程倉庫路徑 -
關聯一個遠程庫時必須給遠程庫指定一個名字,origin是默認習慣命名;
-
關聯后,使用命令
git push -u 遠程倉庫名稱 要推送的本地分支名稱第一次推送master分支的所有內容; -
此后,每次本地提交后,只要有必要,就可以使用命令
git push -u 遠程倉庫名稱 要推送的本地分支名稱推送最新修改;
10.與Github或Gitee建立檔案傳輸機制
你的本地Git倉庫和GitHub倉庫之間的傳輸方式有兩種,一種是通過https,另一種是通過SSH加密的
HTTPS:使用https url克隆對初學者來說會比較方便,復制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代碼都需要輸入賬號和密碼,這也是https方式的麻煩之處(發現了https免密登錄的方式),
SSH:使用SSH url克隆卻需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的話,你必須是這個專案的擁有者或管理員,否則你是無法添加SSH key的,另外ssh默認是每次fetch和push代碼都不需要輸入賬號和密碼
至于如何將本機與Github和Gitee建立SSH連接,方便推送不用輸入郵箱密碼,請參考下面鏈接:
- Github如何實作SSH加密傳輸:Github平臺的SSH
- Github如何實作SSH加密傳輸:Gitee平臺的SSH
💥💥💥💥
這是我的第一篇萬字博客!希望大家能夠喜歡并從中識訓到知識
如果你覺得本篇文章對你有幫助,不妨關注我并點擊右下角的點贊和收藏!!
你們的支持就是我最大的動力~~
💥💥💥💥
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292614.html
標籤:其他
上一篇:(??ヮ?)?【精品C語言整理】?(?ヮ??)女盆友纏著你讓你教她寫代碼怎么辦?安排,三萬字博文帶你走遍C語言,從此不再害怕編程
