Git的使用(一)
Git是目前世界上最先進的分布式版本控制系統,最初的版本由Linux的創造者Linus用c語言完成的,并迅速成為最流行的分布式版本控制系統,此處不對Git的功能做過多的簡介,詳情可以參考Git官網,下面會對Git的使用進行全方位的闡述,干貨滿滿。
Git配置
git config --global user.name "Your Name" 配置全局的用戶名
git config --global user.email "email@example.com" 配置全局的郵箱地址
git config --list 查看git配置列表
初始化版本庫
git init 初始化git版本庫
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit $ git init Initialized empty Git repository in D:/learngit/.git/yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ ls -ah ./ ../ .git/注意:.git目錄為隱藏目錄,使用ls -ah可查看
工作區和暫存區
以readme.txt文件為例,文件所在的目錄就是工作區,當我們執行git add命令時,實際上是把工作區的修改添加到暫存區,然后執行 git commit 命令時,實際上是把暫存區的所有修改都添加到對應的分支上,并生成新的版本,暫存區的存在能夠避免每次修改都提交一個版本,也能夠避免工作區的改動過多但是未提交所產生的風險。
git add
在版本庫目錄下編寫readme.txt文件,內容如下:
hello worldgit add <file> 將工作區中的修改添加到暫存區
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git add readme.txt warning: LF will be replaced by CRLF in readme.txt. The file will have its original line endings in your working directorygit commit
git commit -m "desc" 將暫存區的改動提交到當前分支,生成新的版本
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git commit -m 'first' [master (root-commit) 1b66990] first1 file changed, 1 insertion(+)create mode 100644 readme.txtgit status
git status 查看當前倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch master nothing to commit, working tree cleangit status -s 或 git status --short 查看當前倉庫文件的狀態(簡化輸出)
輸出規則如下:
-
輸出標記會有兩列,第一列是對暫存區域而言,第二列是對工作區而言
-
?? 用來標記文件是新創建的未跟蹤的狀態
-
第一列是 A字母, 用來標記文件是新創建的已跟蹤的狀態
-
第一列是M字母,用來標記文件是有改動的已跟蹤的狀態
-
第二列是M字母,用來標記文件是有改動的未跟蹤的狀態
-
MM表示文件上次改動被跟蹤,當前改動未被跟蹤
接下來我們跟蹤一個文件從創建到提交的整個過程,來觀察git status的輸出
1.版本庫中無文件,我們查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ ls -ah ./ ../ .git/yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch master #在master分支上No commits yet #沒有提交的版本nothing to commit (create/copy files and use "git add" to track) #沒有更改需要提交yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -s執行git status后,可以看到在當前master分支上還沒有提交的版本,執行git status -s 后無輸出信息
2.新創建一個文件readme.txt,touch readme.txt
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch masterNo commits yetUntracked files:(use "git add <file>..." to include in what will be committed)readme.txtnothing added to commit but untracked files present (use "git add" to track)yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -s ?? readme.txt執行git status后,可以看到存在未跟蹤的文件readme.txt,執行git status -s 后,發現readme.txt文件之前第一列和第二列多了兩個問號,表示文件為新增的并且未添加到暫存區中。
3.執行git add readme.txt,再查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: readme.txtyhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -s A readme.txt執行git status后,可以看到存在要提交的更改(新建的文件readme.txt),執行git status -s后,發現readme.txt文件之前第一列多了一個A,表示文件的改動已添加到暫存區。
4.執行git commit -m 'first commit',再查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch master nothing to commit, working tree cleanyhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -s此時暫存區的修改提交到了當前master分支上。
5.我們對readme.txt 文件進行修改,執行vim readme.txt,添加一行hello world,然后查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ 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.txtno changes added to commit (use "git add" and/or "git commit -a")yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -sM readme.txt執行git status后,可以看到文件存在改動并且改動未添加到暫存區(改變的文件readme.txt),執行git status -s后,發現readme.txt文件之前第二列多了一個M,表示工作區的readme.txt文件有改動并且未添加到暫存區。
6.再次執行git add readme.txt,然后查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch master Changes to be committed:(use "git restore --staged <file>..." to unstage)modified: readme.txtyhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -s M readme.txt執行git status后,可以看到存在要提交的更改(改變的文件readme.txt),執行git status -s后,發現readme.txt文件之前第一列多了一個M,表示工作區的readme.txt文件有改動并且已添加到暫存區。
7.此時執行commit命令,則會輸出同第4步的內容,但我們先不提交,而是修改readme.txt,執行vim readme.txt,添加一行git is very good,然后查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status On branch master Changes to be committed:(use "git restore --staged <file>..." to unstage)modified: readme.txtChanges 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.txtyhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -s MM readme.txt執行git status后,我們發現文件即存在要提交的更改,也存在未添加到暫存區的更改,執行git status -s后,發現readme.txt文件前面第一列和第二列分別多了一個M,表示工作區的readme.txt文件的上次改動添加到了暫存區,本次改動未添加到暫存區。
8.我們此時再提交暫存區內的改動,執行commit命令,git commit -m 'second commit',然后查看一下倉庫文件的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ 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.txtno changes added to commit (use "git add" and/or "git commit -a")yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git status -sM readme.txt執行git status后,可以看到文件存在改動并且改動未添加到暫存區(改變的文件readme.txt),執行git status -s后,發現readme.txt文件之前第二列多了一個M,表示工作區的readme.txt文件有改動并且未添加到暫存區。
git diff
git diff <file> 查看指定的工作區的文件和暫存區的不同
git diff head <file> 查看指定的工作區的文件和版本庫中最新版本的不同
我們將readme.txt保證在工作區,暫存區,版本庫中各不相同,然后執行命令查看效果
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git diff readme.txt warning: LF will be replaced by CRLF in readme.txt. The file will have its original line endings in your working directory diff --git a/readme.txt b/readme.txt index 0829798..176bcf6 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,3 @@hello worldgit is very good +i like git very muchyhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git diff head readme.txt warning: LF will be replaced by CRLF in readme.txt. The file will have its original line endings in your working directory diff --git a/readme.txt b/readme.txt index 3b18e51..176bcf6 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1,3 @@hello world +git is very good +i like git very much我們可以看到工作區比暫存區多了一行i like git very much,比版本庫多了一行git is very good,一行i like git very much。
git log
git log 查看歷史版本
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git log commit 6763ec51e6a1f8c6191624ef12013c5b2b0f6dcd (HEAD -> master) Author: yhc <1403125476@qq.com> Date: Thu Mar 11 00:12:26 2021 +0800second commitcommit 400662a418a8f395b22c1a9d7a2183f461677a67 Author: yhc <1403125476@qq.com> Date: Wed Mar 10 21:45:48 2021 +0800first commitgit log --pretty=oneline 查看歷史版本(每個版本精簡為一行)
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git log --pretty=oneline 6763ec51e6a1f8c6191624ef12013c5b2b0f6dcd (HEAD -> master) second commit 400662a418a8f395b22c1a9d7a2183f461677a67 first commitgit reflog
git reflog 查看歷史操作記錄
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git reflog 6763ec5 (HEAD -> master) HEAD@{0}: commit: second commit 400662a HEAD@{1}: commit (initial): first commit版本切換
git reset --hard HEAD^ 回退到上一個版本
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git reset --hard HEAD^ HEAD is now at 1b66990 firstgit reset --hard HEAD^^ 回退到上上一個版本,以此類推
git reset --hard <commit_id> 回退到指定版本,以此類推
注意:--hard的作用為工作區和要切換的版本保持一致,暫存區置為空
撤銷修改
git checkout -- <file> 把指定文件在工作區的修改全部撤銷到暫存區或版本庫的狀態,讓這個文件回到最近一次git commit或git add時的狀態
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git checkout -- readme.txtyhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ cat readme.txt hello world git is very good注意:--必須加,否則就變成了切換分支命令
git reset HEAD <file> 把指定文件的修改從暫存區中撤銷掉
yhc@DESKTOP-MOGNFMV MINGW64 /d/learngit (master) $ git reset HEAD readme.txt Unstaged changes after reset: M readme.txt刪除文件
git rm <file> 把文件從工作區中刪除,并把此修改添加到暫存區(相當于執行rm <file>,然后執行git add <file>)
git rm --cached <file> 工作區的文件保留,但暫存區的文件刪除
總結
- 上一篇: rtp 实时传输协议
- 下一篇: 转:程序员每天该做的事