Git學習筆記(一)初遇

圖像具有強大的威力git

引言

那是我在作畢業設計的時候,使用IDEA做爲開發工具,我對系統作了比較大的改動,而後系統又跑不起來了,當時在宿舍寫代碼的我只想扇我本身的臉,我就想到了能不能將系統回退到正常運行的版本呢,可是我又沒有使用版本控制工具,不過還好IDEA自帶了一個文件歷史記錄,我又回退正常版本了。我想這就是版本控制工具的第一個功能吧,版本回退。

image.png

除了版本控制以外,Git仍是一個團隊協做工具,什麼意思呢?在企業的開發過程當中,咱們都是不一樣的人開發不一樣的功能,可是這又是一個系統上面的東西,咱們不可能使用U盤這種初級的方式將本身開發完成的功能拷到主系統上去。咱們就可使用Git將開發完成的代碼提交到正在開發的系統中。

是啥

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.程序員

Git是一個免費開源的分佈式版本控制系統,被設計用來管理小型到大型的項目。

分佈式 VS 集中式

  • 集中式版本控制工具須要一箇中央服務器。代碼最終被提交這裏。
  • 分佈式版本控制系統沒有"中央服務器的概念"。每一個人電腦都有一個完整的版本庫。

    那可能有人就會問了,那個人代碼提交到哪裏呢? 只存在本地嗎?github

既然是多人協做,咱們就須要指定一臺服務器做爲總倉庫。每一個人將本身所作的提交到這個服務器上,天天從這個服務器上拉取別人的修改。算法

那GitHub是?

GitHub是一個代碼託管網站。開發者將本身的代碼放到GitHub上。

有啥用

  咱們想象一下,開發團隊不使用版本控制工具或者沒有版本控制工具會怎麼樣呢? bash

  一個團隊不一樣的人開發的功能,該怎麼整合在一塊兒呢?好,你經過複製,而後開發人員如何獲取最新的代碼呢? 服務器

   假定公司設定了這麼一個崗位專門用來合併代碼,咱們稱之爲代碼合併官吧! 代碼合併官天天早上把最新的代碼經過郵件再發給各個開發者。而後開發者再把用郵件中的最新代碼覆蓋本身的。分佈式

  而後某天,CTO(首席技術官)改錯了一個東西,想一想看最新的代碼,而後想看看以前的是什麼樣的。代碼合併官表示,不用擔憂,你發的代碼我都按天建文件夾,稍等一下,我給你找找。工具

  上面的場景一想就很恐怖。程序員們不會讓上面的場景出現,由於上面的工做是重複的,要知道複用但是咱們的追求。開發工具

  版本控制工具能夠作到,將開發者的代碼聚集在一塊兒,讓開發者天天拉取到最新的代碼。還能夠記錄文件歷史,假如的誤操做,把正確的代碼改爲錯了,你就能夠回退到正常的版本。又好比吧,項目經理決定兵分兩路,一路接着開發新的功能,一路修復bug。你就能夠作一個分支,在一個分支上開發新的功能,在另外一個分支上修復bug。修的差很少了,而後把兩個分支合併在一塊兒。測試

總結一下版本控制工具備啥用:
  • 整合代碼(將各個開發者的代碼聚集在一塊兒),高級一點的名字叫團隊協。
  • 記錄文件歷史(讓你有後悔藥能夠吃)。版本控制
  • 作分支(branch),分支大致上有下兩個做用:

    • 一路修bug,一路作新的功能。
    • 代碼要區分爲我的版、企業版。我的版和企業版相同功能作完以後,作一個分支出來,團隊就被切分爲兩組,不一樣的團隊在不一樣的分支上開發。

怎麼用?

要想用,你須要首先要下載Git。下載安裝不作介紹。網上有詳細的教程。

git基礎概念

在學怎麼用以前,咱們首先介紹Git的一些基礎概念。

  • 工做區(workspace): 就是你存放代碼的地方。(要執行Git init指令,產生.git文件夾以後)
  • 暫存區(index): 工做區未被Git所控制的文件,在被控制以後就轉到暫存區
  • 本地倉庫: 暫存區的文件,假定爲a.txt,執行git commit a.txt -m'測試',就轉入本地倉庫
  • 遠程倉庫: 處於本地倉庫的文件, 執行git push -u 推送到遠程倉庫

image.png

在流程圖中已經出現了一些Git的命令:

  • git add
  • git commit
  • git checkOut
  • git pull
  • git push
  • git fetch/clone

後文會將對這些命令進行詳細的介紹.

git的基本操做

帳號配置

設置郵箱、帳戶名:

範圍: 
  --global              use global config file  (給整個計算機一次設置,給當前計算機上的全部用戶)
  --system              use system config file  (經常使用,給當前用戶一次性設置)
  --local               use repository config file (給當前項目一次性設置) 

從範圍上看,global > system > local  
可是小範圍的會覆蓋掉大範圍的。

爲何要設置呢?

記錄文件的提交歷史,誰提交的,何時提交的。 咱們稱之爲日誌。
注意只有將文件從暫存區推動本地倉庫纔會有日誌。

怎麼設置呢?

git config --範圍 user.name '你的用戶名'
  git config --範圍 user.email '你的郵箱'

例子:

git config --system user.name  'fish' 
 git config --system user.email 'fish@qq.com'

在哪裏能夠看見設置的帳戶和郵箱呢?

local 範圍 :

在.git 文件夾下的config文件中。

system

進入根目錄下, 打開 git bash here 後, 執行cd ~命令.
下面會有一個.gitconfig 文件。
裏面就記錄了你設置的帳戶和密碼

add commit

這裏我新建一個文件叫gitstudy,

image.png
image.png

git status: 查看工做區 暫存區的狀態

工做區的文件有如下幾種狀態:

unstatge:  未歸入版本控制,處於工做區
 statge: 加入版本控制,進入暫存區
 commited: 進入本地倉庫

我在gitstudy下新建一個文件,不執行任何指令,那麼該文件就處於unstatge。

例子:

image.png

staged: 歸入版本控制
    在 git bash here 中執行: git add 文件全名 
    表明把指定的文件加入版本控制中,也就是放入暫存區。
    git add . 表明將全部的untracked的文件都加入暫存區。
 
 平時用git bash here用習慣了,Git還提供了圖形化界面,雖然很簡陋。

image.png
image.png

執行git add d.txt 將文件推送至暫存區

image.png

執行git status 查看工做區、暫存區的狀態

image.png

執行git add . 將全部不在暫存區處於工做區的文件推動暫存區

image.png

咱們用git status 查看工做區、暫存區的狀態

image.png

咱們發現untracked files 就沒有了。

image.png

進入暫存區的命令有兩個:

  • git add 文件全名 將處於工做區不在暫存區的指定文件加入到暫存區
  • git add . 將處於工做區不在暫存區的全部文件加入到暫存區

將暫存區的文件推至工做區的命令也有兩個:

  • git commit 文件全名 -m'每次推本地倉庫的註釋'

       將處於暫存區不在本地倉庫的指定文件推動至本地倉庫

  • git commit . -m'每次推動本地倉庫的註釋'

       將處於暫存區不在本地倉庫的全部文件推動至本地倉庫

看日誌

最簡單的命令就是: git log
這個命令列出全部的提交記錄。

image.png

image.png

commit 5663dd0764d5ddd2f645737437f22c447ab772a7

commit 後的字符串是用加密算法(SHA1(不叫sha yi,叫sha one) 算法)產生的,用來標識每一次提交操做。

可能有人要問了,爲何你不用第幾回提交了標識呢?

軟件開發過程當中你們是一塊兒幹活的, 倘若有兩我的的某一次的提交次數是相同的,那遠程倉庫怎麼標識這兩個提交呢.
因此仍是用加密算法產生提交標識更爲穩妥

那可能有人仍是要問了?

我只想看最近幾回。我只想看最近三次該怎麼辦呢?
 git log -次數: 查看最新的三次提交

image.png

git log --graph

image.png

  • 那我一不當心把註釋打錯了怎麼辦?

    不要緊能夠重寫。

git commit --amend -m'註釋信息' 覆蓋最近一次的提交信息

例子:
image.png

push 推送

如何將你的代碼推給別人,或者推到服務器上呢?
  • 假如你是拉公司的代碼,拉下來的代碼中就有.git文件夾。該文件夾中就有遠程服務器的信息。

    你將修改的文件從暫存區推動至本地倉庫。後 git push -u 就能夠了。

  • 假如你想把你的代碼推給別人

    你就須要設定推送的目的地。

執行下面的命令:

git remote add origin 遠程倉庫的地址

個人遠程倉庫地址是:

git@github.com:CXK6013/studyGit.git

因此我執行的是:

git remote add origin  git@github.com:CXK6013/studyGit.git

origin 後面的就表明目的地,最後一塊確定是項目名.git這種形式

一臺計算機上的文件夾不是什麼都不作就成爲了遠程倉庫。
至於怎麼使一臺計算機上的文件夾成爲遠程倉庫。那是後文討論的問題了。

而後執行 git push 就能夠將工做區的代碼推送到遠程倉庫了。

刪除 回退

誤提

假如我誤提交了一個文件呢。 不要緊能夠是刪。

刪除的兩種方式:

直接調用操做系統的刪除。

image.png
image.png

Changes not staged for commit,怎麼理解這句話呢,not staged 沒有暫存。 沒暫存,也就是不在暫存區。還處於工做區。咱們須要將這個刪除命令也進入到暫存區,本地倉庫區.

image.png

changes to be commit: 刪除操做沒有到本地倉庫區。

咱們commit一下,這個文件就被刪除了。

image.png

Your branch is ahead of 'origin/master' by 1 commit. 這句話是說,我本地的分支不一致。我本地的比較新。
建議我執行git push。

調用git命令進行刪除:

image.png
image.png

changes to be commited 也就是說命令已經到暫存區,尚未到工做區。

咱們在執行 git commit . -m'刪除本地倉庫的文件'。工做區、暫存區、本地倉庫區就保持一致了。
image.png

誤刪

那假如我誤刪了呢?

關係不是很大,操做系統上有撤銷操做,版本控制工具上也有後悔藥可吃.

那怎麼吃這個後悔藥呢?

image.png

reset: 調整; 從新設置; 從新安置; 將…恢復原位.

注意這個恢復原位

image.png

執行完 git reset head d.txt

Changes not staged for commit: 說明刪除操做尚未到暫存區。你也能夠認爲是文件從暫存區到工做區了。
而後git認爲你想作如下兩件事情:

  • (use "git add/rm <file>..." to update what will be committed) 能夠

    • 使用 git add 或者 git rm 將你的操做也在暫存區執行一份。
  • (use "git checkout -- <file>..." to discard changes in working directory)

    • 執行git checkout -- 文件全名。 就是你誤刪了某個文件,執行該命令後,丟棄刪除操做,恢復該文件。
相關文章
相關標籤/搜索