Git學習筆記 -- 安裝git、創建版本庫、時光穿梭、遠程倉庫

一、Git的安裝

  1. 在window系統上安裝:從https://git-for-windows.github.io下載,然後按默認選項安裝即可;

  2. 安裝完成後,在“桌面”上右擊,在彈出的菜單中選擇“Git Bash”;

  3. 在蹦出一個類似命令行窗口的東西里面輸入git命令:

    $ git --version   //查看git安裝版本
    
    
  4. 安裝完成後,還需要最後一步設置,在命令行輸入:

    $ git config --global user.name "Your Name"
    $ git config --global user.email "[email protected]"
    
    //因爲Git是分佈式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。
    

    注意git config命令的–global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。

    $ git config user. name "yourname"
    $ git config user. email "[email protected] example. com"
    
  5. 通過使用 git config -l 列出在所有配置文件裏共同查找的所有變量的設置值。

  6. 可以通過–unset選項來移除設置具體的配置項

    $ git config --unset --global user.name
    

二、創建版本庫

什麼是版本庫

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

創建版本庫的步驟:
  1. 選擇一個合適的地方,新建一個目錄
    $ mkdir learnGit      //創建目錄
    $ cd learnGit     //進入該目錄
    $ pwd     //命令用於顯示當前目錄
    
  2. 通過git init命令把這個目錄變成Git可以管理的倉庫
    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
    //初始化一個空的git倉庫在...目錄下
    
    
    此時,learngit目錄下有隱藏的.git目錄,可以通過 ls -ah 命令,來查看learngit目錄下所有文件(隱藏和未隱藏的)
把文件放到版本庫
  • 把文件放到版本庫的操作情境如下:

    在learngit目錄裏面新建一個文件,文件名爲readme.txt,txt文件的內容如下:

    Git is a version control system.
    Git is free software.
    
  1. 第一步,用命令git add告訴Git,把文件添加到倉庫

    $ git add readme.txt
    
  2. 用命令git commit告訴Git,把文件提交到倉庫

    $ git commit -m "wrote a readme file"
    

    運行結果如下:

    [master (root-commit) cb926e7] wrote a readme file
    1 file changed, 2 insertions(+)
    create mode 100644 readme.txt
    
    //git commit命令執行成功後會告訴你,1個文件被改動(我們新添加的readme.txt文件),插入了兩行內容(readme.txt有兩行內容)。
    
    • git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄

    • commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files."
    
    

三、修改版本庫文件

修改文件之後:

  • git status //查看倉庫當前的狀態
  • git diff “指定文件名”
  • git diff HEAD – “指定文件名” //查看指定文件的修改內容(修改前、修改後文件內容對比)

查看修改的文件內容後,該改改,該加加,最後再提交文件(add和commit)

像這樣,你不斷對文件進行修改,然後不斷提交修改到版本庫裏,就好比玩RPG遊戲時,每通過一關就會自動把遊戲狀態存盤,如果某一關沒過去,你還可以選擇讀取前一關的狀態。有些時候,在打Boss之前,你會手動存盤,以便萬一打Boss失敗了,可以從最近的地方重新開始。Git也是一樣,每當你覺得文件修改到一定程度的時候,就可以“保存一個快照”,這個快照在Git中被稱爲commit。一旦你把文件改亂了,或者誤刪了文件,還可以從最近的一個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。

四、版本回退

查看提交歷史記錄
  • git log //查看提交歷史
  • git log --pretty=oneline //–pretty=oneline參數 只顯示commit id(版本號)

一大串類似3628164…882e1e0的是commit id(版本號),和SVN不一樣,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個非常大的數字,用十六進制表示,而且你看到的commit id和我的肯定不一樣,以你自己的爲準。爲什麼commit id需要用這麼一大串數字表示呢?因爲Git是分佈式的版本控制系統,後面我們還要研究多人在同一個版本庫裏工作,如果大家都用1,2,3……作爲版本號,那肯定就衝突了。

$ git log --pretty=oneline
7f44d6c6601dc6f769991144e322234cc48dbac6 (HEAD -> master, origin/master) append GPL
a11d57e4441b278305d6102263e6fc14534fbf6f readme added distributed info
9dac2d1c05c87943664ccdb1d115a3a34e9e247a edit readme.txt file
6be118b4e1cbd8539abc4191b7572f69d862c962 add other readme.txt
1943eb06c596ed9f7edf33fd2a3223141eac8b8e add a git Note file
af58caf89cc1b573f4e9a09fe299b92406fd6de3 wrote a readme file

回退到指定歷史版本
  • 在Git中,用HEAD表示當前版本,從上面可以看出,最新的提交是 7f44d…c48dbac6

  • 上一個版本就是 HEAD^ ,上上一個版本就是 HEAD^^ , 當然往上100個版本寫100個^比較容易數不過來,所以寫成 HEAD~100

  • git reset //回退到之前版本,兩種方法:

    • $ git reset --hard HEAD^
    • $ git reset --hard commit_id //版本號沒必要寫全,前幾位就可以了

你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?

查看命令歷史
  • git reflog //用來記錄你的每一次命令,查看命令歷史

五、工作區和暫存區

Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念。

工作區(Working Directory)

就是你在電腦裏能看到的目錄,比如我的learngit文件夾就是一個工作區。

版本庫(Repository)

工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區

暫存區就像購物車,沒到付款的時候你都不確定購物車裏的東西全部都是要的。。。每拿一件商品就付一次款。。。那才麻煩大了

image

把文件往Git版本庫裏添加的時候,是分兩步執行的:

  • 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;

  • 第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支

因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

你可以簡單理解爲,需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

  • 例子:對readme.txt做個修改,然後,在工作區新增一個LICENSE文本文件(內容隨便寫)

  • 先用git status查看一下狀態:
    Git非常清楚地告訴我們,readme.txt被修改了,而LICENSE還從來沒有被添加過,所以它的狀態是Untracked

  • 現在,使用兩次命令git add,把readme.txt和LICENSE都添加後,用git status再查看一下

  • 現在,暫存區的狀態就變成這樣了:

image

  • 所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改提交到分支。
  • 現在版本庫變成了這樣,暫存區就沒有任何內容了:

image

六、管理修改

  • Git比其他版本控制系統設計得優秀的點在於:Git跟蹤並管理的是修改,而非文件
  • Git是如何跟蹤修改的:每次修改,如果不add到暫存區,那就不會加入到commit中。

七、撤銷修改

當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時

git checkout 可以丟棄工作區的修改:

  • git checkout – file

    – 很重要,沒有 --,就變成了“切換到另一個分支”的命令

命令 git checkout – readme.txt 意思就是,把readme.txt文件在工作區的修改全部撤銷,這裏有兩種情況:

  • 一種是readme.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
  • 一種是readme.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。

總之,就是讓這個文件回到最近一次git commit或git add時的狀態。

當你不但改亂了工作區某個文件的內容,還添加到了暫存區,想丟棄修改時

分兩步:

  • 第一步用命令git reset HEAD file,就回到了上面一個場景,
  • 第二步按上面一個場景操作。
已經提交了不合適的修改到版本庫時:

想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

八、刪除文件

在Git中,刪除也是一個修改操作

你新建了一個文件(test.txt),提到交了版本庫,然後你把這個文件刪除了:
$ rm test.txt
有兩種刪除的可能:

一種是你真的要刪除,另一種是你誤操作:
真刪除或誤刪前,可通過git status查看下倉庫狀態

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
  • 如果是真要刪除:
    那就用命令git rm刪掉,並且git commit
$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d17efd8] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt
  • 如果是誤刪除:
    那就可以通過git checkout – file 很輕鬆地把誤刪的文件恢復到最新版本
$ git checkout -- test.txt

git checkout 其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”

九、

創建SSH
  1. 打開Git Bash,創建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"

然後一路回車,使用默認值即可;
之後順利的話,能在用戶主目錄裏找到.ssh目錄,裏面有id_rsa和id_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
2. 登陸GitHub,打開“Account settings”,“SSH Keys”頁面:然後,點“Add SSH Key”,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容。

爲什麼GitHub需要SSH Key呢?因爲GitHub需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送。

獲取公有密鑰
cat ~/.ssh/id_rsa.pub
添加遠程庫

現在的情景是,你已經在本地創建了一個Git倉庫後,又想在GitHub創建一個Git倉庫,並且讓這兩個倉庫進行遠程同步,這樣,GitHub上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作,真是一舉多得。

  1. 登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫

  2. 在Repository name填入learngit,其他保持默認設置,點擊“Create repository”按鈕,就成功地創建了一個新的Git倉庫

  3. 目前,在GitHub上的這個learngit倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的內容推送到GitHub倉庫。

    • 現在我們根據GitHub的提示,在本地的learngit倉庫下運行命令
    $ git remote add origin [email protected]:shiaijuan/learngit.git
    

    添加後,遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫。

    • 把本地庫的所有內容推送到遠程庫上
    $ git push -u origin master
    

    由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。

  4. 從現在起,只要本地作了提交,就可以通過命令

    $ git push origin master
    

注意點:
  1. 如果執行git remote add origin …,出現錯誤:

    fatal: remote origin already exists

    則執行以下語句:

    git remote rm origin

    再往後執行

    git remote add origin … 即可。

  2. 在執行git push origin master時,報錯:

    error:failed to push som refs to…

    則執行以下語句:

    git pull origin master
    //先把遠程服務器github上面的文件拉先來,再push 上去。

    引起該錯誤的原因也可能是目錄中沒有文件,空目錄是不能提交上去的


從遠程庫克隆

假設我們從零開發,那麼最好的方式是先創建遠程庫,然後,從遠程庫克隆。

  1. 在github上建一個倉庫
    • 勾選Initialize this repository with a README,這樣GitHub會自動爲我們創建一個README.md文件。創建完畢後,可以看到README.md文件
  2. 用命令git clone克隆一個本地庫(克隆本地庫之前,你要先確認本地庫位置)
$ git clone [email protected]:shiaijuan/gitskills.git

給已經存在的項目添加git

前提:先去gitlab或github網站上創建一個新項目,完畢後記得添加.ignore;

1、打開終端,cd到已存在項目的目錄,輸入以下命令行,初始化一個本地倉庫:

git init

2、創建 .gitignore 文件,在裏面添加不要上傳的文件的相應的匹配正則

/node_modules
/dist

3、輸入以下命令,把工程所有文件都添加到該倉庫中(千萬別忘記後面的.號!!!):

git add .

4、輸入以下命令,把文件提交到本地倉庫:

git commit -m "Initial commit" //Initial commit是提交代碼的說明文字

如果出現nothing to commit, working directory clean​說明你已經提交好了。

​5、輸入以下命令,添加遠程倉庫地址:

輸入:git remote add origin + 你的倉庫地址

例如:git remote add origin https://git.oschina.net/hhh/GitDemo.git

如果出現fatal: remote origin already exists.說明你已經添加過遠程倉庫了,輸入以下命令刪除遠程倉庫:git remote rm origin,然後再次執行第5步。

6、輸入以下命令,把文件提交到遠程倉庫:

git push -u origin master

然後你就等着它提交完成就完事了。

7、假如第6部失敗的話再執行git pull –rebase origin master命令,然後再執行git push -u origin master即可上傳成功。

8、完事後假如還是不能拉代碼的話再重啓項目執行git branch –set-upstream master origin/master即可。

9、報錯:Updates were rejected because the tip of your current branch is behind

解決方法:
有如下幾種解決方法:

  1. 使用強制push的方法:
$ git push -u origin master -f

這樣會使遠程修改丟失,一般是不可取的,尤其是多人協作開發的時候。

  1. push前先將遠程repository修改pull下來
$ git pull origin master
$ git push -u origin master
  1. 若不想merge遠程和本地修改,可以先創建新的分支:
$ git branch [name]

然後push

$ git push -u origin [name]
小結
  • 要關聯一個遠程庫,使用命令git remote add origin [email protected]:path/repo-name.git;
  • 關聯後,使用命令git push -u origin master第一次推送master分支的所有內容;
  • 此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改

問題

  1. git 報錯—fatal: Not a git repository
    • fatal: Not a git repository (or any of the parent directories): .git。提示說沒有.git這樣一個目錄
    • 解決辦法如下:git init就可以了!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章