git 詳解及實用指南之一 (本地操做)

後續會持續更新java

1.設置開發者的我的信息

在任何一個系統之中都會存在有多個開發者(多人協做開發),而在 GIT 之中,對於每個開發者(電腦),都須要 開發者本身定義本身的名字與 email 地址,以便進行方便的聯繫,此時須要配置全局信息。git

配置全局用戶名及 email 地址緩存

git config --global user.name 'wzy'
git config --global user.email '449245884@.com'

設置完成以後若是成功不會任何提示信息,能夠經過以下命令查看全局配置信息:工具

git config -l

clipboard.png

能夠發現除了以前配置的用戶名和 email 地址以外,還存在有其它的內容。學習

2.建立倉庫

  • 版本庫 = 倉庫;
  • 在此倉庫中的全部內容都會被git 管理;
  • 在倉庫中的全部文件修改、刪除、更新都會被紀錄下來;
  • 能夠隨時恢復到某一特定狀態;
  • 初始化倉庫: git init

若是要開發項目,那麼首先必須有一個倉庫(能夠簡單的理解爲是一個磁盤上的文件夾)。編碼

mkdir myrpo

此時 mypro 文件夾是一個空的文件夾,沒有任何的內容,只是一個純粹的目錄。spa

將 mypro 文件夾定義爲倉庫, 進入文件夾, 初始化倉庫(將此目錄變爲能夠被GIT管理的倉庫) 3d

clipboard.png

並且此時會提示,在 mypro 文件夾之中建立了一個「.git」的目錄,這個目錄就是倉庫信息,死都不能改。版本控制

3.添加文件

如今倉庫建立完成以後,下面就要進行文件的基本管理了。首先在編寫以前有一個說明:全部的文件必定要使用 UTF-8 編碼,不然有可能會出現問題。指針

創建一個 Hello.js文件

btn.onclick = function() {
   console.log('每一次新增!');
}

察看當前倉庫的狀態

git status

clipboard.png

在 "git status" 狀態查詢操做上能夠發展有以下的幾個提示信息:

  • 如今開發的屬於主分支:On branch master
  • 初始化倉庫的提交:No commits yet
  • 未標記的文件:Untracked files:
  • 隨後給出的一些操做的命令:(use "git add <file>..." to include in what will be committed)
  • 未標記文件的列表,如今只有一個: hello.js

添加文件到倉庫

  • 增長文件到暫存區: git add 文件名稱
  • 提交文件: git commit -m "註釋"

將文件加入到暫存庫之中

git add hello.js

clipboard.png

繼續查詢狀態

clipboard.png

此時有了一個最重要的信息:

clipboard.png

如今的文件並無真正的提交到主分支上(主分支就是咱們真正要運行的程序的全部的代碼)。

注意:全部修改的代碼都會被 GIT 自動的監測到,全部的代碼在使用 commit 提交以前必定要先使用 add 增長進來,不然不會有任何的提交。
若是如今不但願分兩步進行則能夠在運行如下程序時增長一個「-a」的參數,表示先 add 然後 commit(git commit -a -m "註釋")。

提交文件信息

git commit -m "New Js file - Hello.js Create"

在進行每次更新提交的時候通常都會爲其增長上一些註釋數據,因此使用「-m」參數來進行註釋的編寫。

clipboard.png

此時這個「Hello.js」文件就被真正的提交到了主分支上,也就是意味着程序發佈成功了。

查詢狀態

clipboard.png

此時的狀態會提示:沒有任何的信息須要被提交,工做目錄很乾淨。而在 git 工具下用戶每一次進行的提交實際上都 會被日誌紀錄下來。

察看針對於「hello.js」文件的日誌信息

clipboard.png

首先會出現一個提交的信息號 「2e3e7018a965673a4154c84105b5d1a23f13167a」,能夠理解爲是每一次提交的 id 號。若是有屢次提交,那麼這個日誌信息也會愈來愈多。

4.修改倉庫文件

上面代碼已經能夠成功的進行了發佈,可是代碼出現就是爲了修改。因而如今來觀察對於 git 工具如何去控制修改。

修改 hello.js 文件

btn.onclick = function() {
   console.log('每一次新增!');
   console.log('第一次修改·!');
}

此時發現文件增長了一行的修改。

查詢一下當前的倉庫狀態

clipboard.png

如今 GIT 直接提示用戶,文件沒有保存到暫存區之中,並且提示有:要麼你選擇文件暫存,要麼你直接進行文件的 恢復,同時給出了已經修改的文件「hello.js」。

察看文件的先後區別

git diff hello.js

clipboard.png

如今能夠發現全部增長的內容都會使用「+」表示,而被刪除的信息都會使用「-」表示。

將修改後的代碼加入到暫存區後進行提交

git commit -a -m "Update hello.js file. Add one lines"

clipboard.png

察看修改日誌

git log hello.js

clipboard.png

經過以上的代碼演示,如今能夠清楚的發現,只要是修改的操做 GIT 均可以進行及時的跟蹤。

5. 工做區與暫存區

工做區與倉庫

工做區: 就是當前電腦的操做目錄(包含 .git);
倉庫:工做區有一個隱藏目錄 .git,這個不算工做區,而是 git 的倉庫,git 版本庫裏保存了不少東西,其中最重要的就是稱爲 stage 的暫存區,還有 git 爲用戶自動建立的主程序分支 master ,以及指向 master 的 head 指針。

clipboard.png

概念解釋:

  • 在以前所編寫的「hello.js」文件保存在用戶工做區之中;
  • 當使用 add 命令以後,實際上就是將全部的文件提交到暫存區(state) 之中;
  • 使用 commit 命令以後,才表示真正的發出了修改,而真正能夠運行的程序都保存在 master 分支上;

6. 工做區上的操做

clipboard.png

修改 Hello.js

btn.onclick = function() {
   console.log('第二次修改·!');
}

增長一個 demo.js 文件

btn2.onclick = function() {
  console.log('demo click');
}

如今的工做區中的代碼已經發生了變化。

用 status 跟蹤

clipboard.png

如今會提示有如下信息:

  • 修改了 Hello.js 文件,而這個文件給出了處理方式;
  • 出現了一個未標記的文件(Demo.js),詢問用戶是否將其加入到暫存區之中。

7. 緩存區上的操做

clipboard.png

使用「git add」將代碼添加到暫存區之中

git add .

本次操做使用了一個「.」,那麼就表示所有加入。修改以後再次觀察狀態。

觀察狀態

clipboard.png

8. 提交修改

數據保存在暫存區以後,下面就要進行代碼的提交,將代碼提交到主分支上。

clipboard.png

當把暫存區的代碼提交到主分支上以後,會自動的清空暫存區之中的內容。

提交修改代碼

git commit -m 'add demo.js file'

clipboard.png

那麼此時再次查詢狀態。

clipboard.png

那麼會直接發現沒有任何的文件修改的提示。

9. 版本回退

每當用戶進行代碼提交的時候都會自動的生成一個 commit id,而這個 commit id 就是進行代碼回退的主要操做方式。

查詢當前修改後的日誌信息

git log --pretty=oneline

clipboard.png

你們能夠發現全部的 commit id 並非順序的 一、二、3 編號,而是由系統生成一個十六進制數據,這一律念就跟 Session ID 相似,由 GIT 本身控制,主要是爲了防止版本號的衝突。

在 master 分之上會有一個 HEAD 指針存在,而這個指針默認狀況下永遠指向最後一次提交的位置。

clipboard.png

當使用回退以後發現 HEAD 指針出現了改變,若是回退一步,那麼以前的操做不會被刪除,可是全部的代碼將回歸到指定位置的狀態。

clipboard.png

**回退一步

git reset --hard HEAD~1

clipboard.png

那麼若是說如今還想恢復最新的狀態呢?那麼就必須找到回退的 commit id。

找到全部的已經刪除的信息 commitid

git reflog

clipboard.png

恢復最後一次提交

git reset --hard cc54c43

10.提示:文件修改問題

在有了暫存區和 master 主分支概念以後,就須要迴避一個問題:只有保存在暫存區之中的內容才能夠被真正的修改, 而不是針對於文件。

clipboard.png

編寫 hello.js 文件

btn.onclick = function() {
   console.log('個人小智');
}

以上是 =hello.js 文件的第一次修改。

將修改的文件增長到暫存區之中

git add.

此時並無提交,然後再次修改 hello.js 文件。

btn.onclick = function() {
     console.log('個人王大冶');
   }

可是這個時候此文件並無使用 add 進行加入。

進行提交(提交的時候只提交暫存區的內容)

git commit -m "change print"

但是這個時候只是提交了第一次修改,而第二次修改並無提交。

查詢狀態

clipboard.png

進行對比

git diff HEAD hello.js

HEAD 是指向最後一次提交的指針,如今的含義是將 HEAD 中的 Hello.java 文件與工做區的 Hello.java 文件進行對比。

clipboard.png

總結:若是一個文件修改屢次了,那麼就須要執行屢次的 add 後才能夠提交,不然在 add 前的修改是不會被提交的。

11. 撤消修改

  • 狀況一:在未增長(git add) 與提交前(git commit) 用戶能夠直接撤消對文件作出的修改操做。

    • 撤消所作出的修改操做: git checkout -- 文件名
  • 狀況二:在已增長(git add)與未提交前(git commit) 用戶能夠直接撤消對文件所作出的修改操做。

    • 撤消暫存區的修改操做:git reset HEAD 文件名稱;
    • 丟掉已經修改的文件內容: git checkout -- 文件名稱;

狀況一:未增長(git add)&提交(git commit)

若是在工做區之中的代碼並無增長到暫存區之中,那麼若是要恢復到原始狀態是很容易的。

如今假設修改了 hello.js

btn.onclick = function() {
   console.log('個人王大冶');
}

就是要改代碼,不幹走人了,老子不吃你這套

可是隻要是文件一修改,那麼 git 就能夠當即跟蹤到狀態。

clipboard.png

可是後來發現,此種修改實在是不該該進行,若是進行了,只能有一個結論:此人腦殼有問題。可是寫代碼的時候 可能不知道上一次修改狀態。

恢復

git checkout -- hello.js

執行以後發現 Hello.java 文件就恢復到了一個原始的狀態(上一次的提交狀態)。

狀況二:已增長( git add )& 未提交( git commit )

如今假設要修改的文件已經提交到了暫存區之中。

將 Hello.java 代碼提交到暫存區中

git add.

當查詢狀態時:

clipboard.png

在狀態查詢的時候已經給出了用戶的提示,即:你能夠根據 HEAD 指針來恢復文件。

從暫存區之中退出

git reset HEAD hello.js

因而再次查詢狀態

clipboard.png

至關於如今已經由暫存區中保存的內容恢復到了工做區,那麼既然在工做區了,就能夠直接恢復原始狀態。

恢復原始

git checkout -- hello.js
我的建議:養成良好的開發習慣,別像演示那樣這麼對待代碼。

12. 刪除文件

如今在倉庫之中存在有 Demo.js 文件,可是假設這個文件今後以後再也不使用了呢?只有一個解決方案:刪除。可是 在 GIT 裏面對於刪除文件這一功能嚴格來說也屬於一個修改操做。

從磁盤上刪除 Demo.js 文件

rm demo.js

當文件刪除以後下面查詢狀態;

clipboard.png

這個時候文件是從當前工做區的磁盤中刪除了,同時也提示文件被刪除。

提交更新

git commit -a -m "Delete Demo.java File"

可是若是說發現文件被刪除錯誤了呢?則應該進行恢復。

恢復文件

git reset --hard bc8e842247b3d78

若是文件被刪除,則只可以利用版本控制的方式進行恢復。

以上主要對總結於李興華老師的課程,你們有興趣能夠去網易去上觀看

你的點贊是我持續分享好東西的動力,歡迎點贊!

一個笨笨的碼農,個人世界只能終身學習!

更多內容請關注公衆號《大遷世界》

相關文章
相關標籤/搜索