一、Git的安裝
-
在window系統上安裝:從https://git-for-windows.github.io下載,然後按默認選項安裝即可;
-
安裝完成後,在“桌面”上右擊,在彈出的菜單中選擇“Git Bash”;
-
在蹦出一個類似命令行窗口的東西里面輸入git命令:
$ git --version //查看git安裝版本
-
安裝完成後,還需要最後一步設置,在命令行輸入:
$ 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 "xxx@ example. com"
-
通過使用 git config -l 列出在所有配置文件裏共同查找的所有變量的設置值。
-
可以通過–unset選項來移除設置具體的配置項
$ git config --unset --global user.name
二、創建版本庫
什麼是版本庫
版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
創建版本庫的步驟:
- 選擇一個合適的地方,新建一個目錄
$ mkdir learnGit //創建目錄 $ cd learnGit //進入該目錄 $ pwd //命令用於顯示當前目錄
- 通過git init命令把這個目錄變成Git可以管理的倉庫
此時,learngit目錄下有隱藏的.git目錄,可以通過 ls -ah 命令,來查看learngit目錄下所有文件(隱藏和未隱藏的)$ git init Initialized empty Git repository in /Users/michael/learngit/.git/ //初始化一個空的git倉庫在...目錄下
把文件放到版本庫
-
把文件放到版本庫的操作情境如下:
在learngit目錄裏面新建一個文件,文件名爲readme.txt,txt文件的內容如下:
Git is a version control system. Git is free software.
-
第一步,用命令git add告訴Git,把文件添加到倉庫
$ git add readme.txt
-
用命令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)的暫存區
暫存區就像購物車,沒到付款的時候你都不確定購物車裏的東西全部都是要的。。。每拿一件商品就付一次款。。。那才麻煩大了
把文件往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再查看一下
-
現在,暫存區的狀態就變成這樣了:
- 所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改提交到分支。
- 現在版本庫變成了這樣,暫存區就沒有任何內容了:
六、管理修改
- 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
- 打開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上的倉庫既可以作爲備份,又可以讓其他人通過該倉庫來協作,真是一舉多得。
-
登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫
-
在Repository name填入learngit,其他保持默認設置,點擊“Create repository”按鈕,就成功地創建了一個新的Git倉庫
-
目前,在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分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
-
從現在起,只要本地作了提交,就可以通過命令
$ git push origin master
注意點:
-
如果執行git remote add origin …,出現錯誤:
fatal: remote origin already exists
則執行以下語句:
git remote rm origin
再往後執行
git remote add origin … 即可。
-
在執行git push origin master時,報錯:
error:failed to push som refs to…
則執行以下語句:
git pull origin master
//先把遠程服務器github上面的文件拉先來,再push 上去。引起該錯誤的原因也可能是目錄中沒有文件,空目錄是不能提交上去的
從遠程庫克隆
假設我們從零開發,那麼最好的方式是先創建遠程庫,然後,從遠程庫克隆。
- 在github上建一個倉庫
- 勾選Initialize this repository with a README,這樣GitHub會自動爲我們創建一個README.md文件。創建完畢後,可以看到README.md文件
- 用命令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
解決方法:
有如下幾種解決方法:
- 使用強制push的方法:
$ git push -u origin master -f
這樣會使遠程修改丟失,一般是不可取的,尤其是多人協作開發的時候。
- push前先將遠程repository修改pull下來
$ git pull origin master
$ git push -u origin master
- 若不想merge遠程和本地修改,可以先創建新的分支:
$ git branch [name]
然後push
$ git push -u origin [name]
小結
- 要關聯一個遠程庫,使用命令git remote add origin git@server-name:path/repo-name.git;
- 關聯後,使用命令git push -u origin master第一次推送master分支的所有內容;
- 此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改
問題
- git 報錯—fatal: Not a git repository
- fatal: Not a git repository (or any of the parent directories): .git。提示說沒有.git這樣一個目錄
- 解決辦法如下:git init就可以了!