文章目錄
- Git的使用
-
- Git的由來
- git的安裝
- git的存儲圖解
- git的使用
-
- 常用操作
- 1.初始化一個版本庫
- 2. 添加檔案到版本庫中
- Git的檔案分類
- 檔案的生命周期
- git的送出
- 增補
- diff比較差異
- HEAD
- 檢出checkout和重置
- 移動和删除
- 配置本地使用者名和郵箱
- push到遠端伺服器
- 從遠端庫克隆
-
- SSH遠端連結庫克隆
- 分支管理
Git的使用
Git的由來
Linux核心代碼需要版本管理工具管理代碼,2002年開始,使用的是BitMover公司的BitKeeper這個商用軟體。但 是Linux社群崇尚的是自由軟體相悖。
2005年,Andrew Tridgell對BitKeeper的協定進行逆向工程,BitKeeper作者決定收回無償使用授權。磋商無果, Linus又找不到合适的版本管理工具,決定自行開發分布式版本管理工具,一個月後,Linux核心代碼被Git接管。
2008年,基于WEB使用Git進行版本控制的軟體托管服務的網站GitHub上線。
2016年5月9日,11年後,BitKeeper開源,釋出在了GitHub上。
2018年6月4日,微軟宣布,通過75億美元的股票交易收購代碼托管平台GitHub。
git的安裝
https://git-scm.com/downloads下載下傳對應作業系統的git用戶端版本
- Linux上安裝
- 從RHEL上安裝非常簡單
yum install git
- 從RHEL上安裝非常簡單
- windows上安裝
- 下載下傳對應版本的32位或64位版本,點選安裝即可
- windows上安裝後點選滑鼠右鍵菜單中的
可以在目前目錄打開git操作指令視窗。Git Bash Here
- 使用
可以檢視目前git的版本資訊git --version
git的存儲圖解
說明:
名稱 | 意義 | 解釋 |
---|---|---|
Remote | 遠端版本庫 | 網絡上的另一個版本庫,可以和本地庫互動 |
Repository | 創庫、版本庫 | git初始化後,會在目前目錄生成一個.git目錄,這就是版本庫 |
index | 索引 | 介于工作區和版本庫之間,暫存修改的,(暫存區) |
Workspace | 工作空間、版本庫 | .git檔案所在的目錄就是工作區,一般是項目的根目錄 |
- git init,可以為目前目錄建構git版本管理
- 在版本庫中,建立一個檔案,那麼這個檔案在Workspace(工作區)中
- 使用
将filename檔案添加到index(暫存區)中git add filename
- 使用
将filename檔案從index(暫存區)添加到創庫(Repository)中。git commit filename
- 使用
将本地倉庫(Repository)添加到遠端倉庫Remote中。git push
git的使用
- 操作類
指令 | 意義 |
---|---|
| 初始化目前目錄,為目前目錄添加版本管理(初始化一個版本庫) |
| 将filename檔案加入版本管理 |
| 将filename從index(暫存區)添加一個到本地廠庫(Repository)中。-m 可選參數,為目前操作添加注解。 |
| 将本地倉庫(Repository)添加到遠端倉庫Remote中。 |
- 檢視資訊類
指令 | 意義 |
---|---|
| 檢視狀态, -s段格式輸出 |
| 檢視版本庫裡面送出的曆史記錄 |
| 顯示commit的資訊,隻要HEAD發生變化,就可以在這裡看到 |
| 檢視分支結構示意圖 |
常用操作
git add filename
#單個檔案添加
* 這一步是吧檔案的目前變化增加到索引中,也就是以後這個檔案需要版本庫來跟蹤管理。注意這不是送出。此時,檔案還可以繼續修改,還可以添加新的被跟蹤檔案。一定要add才能把這些改變加入到索引中
git add .
#批量添加檔案
* .點号,代表目前目錄,這條指令将遞歸添加目前目錄及其子目錄所有檔案
* 隻要是目錄,就會遞歸添加該目錄下的檔案和子目錄。
git status
#檢視狀态
* -s,–short #段格式輸出
git commit -m "為本次送出添加備注"
#送出更改到版本庫
* -m 填寫本次日志消息,必須寫。工作中,程式員應該對每一次送出寫明做了什麼改動
1.初始化一個版本庫
- 使用指令
可以初始化一個版本庫git init
- 會在目前目錄中增加一個.git目錄,不要自行修改這個目錄裡面的檔案。目前目錄一般是項目的根目錄。
- 選擇一個目錄在該目錄下代開
,輸入指令Git Bash Here
可以為該目錄添版本管理git init
2. 添加檔案到版本庫中
- 注意,如果已經添加檔案到版本庫後,如果檔案再次被修改,需要再次add添加和再次commit
- 在管理目錄下面建立一個檔案abc.html
touch abc.html
- 檢視狀态
git status
- 添加abc.html到管理目錄中,再次檢視可以看到檔案字元顔色為綠色,前面描述為new file
git add abc.html
- 添加abc.html到本地創庫中
git commit abc.html -m “1. 第一次送出”
Git的檔案分類
- 使用git status可以檢視git管理的目錄狀态,通常有如下特征:
- 紅色,前面沒檔案描述:表示檔案未添加到git管理庫中,即檔案未管理
- new file(綠色):表示該檔案為一個新檔案,在index索引庫中。還未送出到Repository倉庫
- Untracked files:沒有跟蹤的檔案
- 追蹤的Tracked,已經加入版本庫的檔案
- 未追蹤的Untracked,未加入到版本庫的未被管理的檔案
- 忽略的ignored,git不在關注的檔案,例如一些臨時檔案
注意:如果在版本管理目錄中需要對一些檔案不做版本管理,生成一個
.gitignore
檔案在管理目錄的根目錄下。檔案内容為不需要管理的檔案。(如果需要對某個目錄不做版本管理,目錄以/結尾)
*.ipynb
__pycache__/
.python-version
- python項目中常用的忽略檔案下載下傳位址https://github.com/github/gitignore/blob/master/Python.gitignore
- 其它語言的在這裡找 https://github.com/github/gitignore
檔案的生命周期
- 檔案add後,就成為可跟蹤檔案的未修改狀态unmodified。
- 修改後,檔案就變成modified狀态。
- 再次add後,将變化送出到索引,狀态變為staged。
- commit後,送出成功,檔案狀态從staged變回unmodifiled
git的送出
- git的送出分為兩個步驟:
- 暫存變更:add作用是把新檔案或者檔案新的改動添加到一個暫存區stage,也就是加入到index中
- 送出變更:commit送出的是暫存區中的改動,而不是實體檔案目前的改動,送出到目前分支,預設是master分支
git的送出過程中,也可以直接使用commit将兩步合成一步。
git commit index.html
如果改動了一批檔案,一個個寫名字很麻煩,使用下面指令
git commit -a
-a,-all參數,會把所有跟蹤的檔案的該東自動暫存,然後commit。上面指令未送出message,會出現一個類似vi指令的操作界面,需要編寫message之後,才行。也可以使用下面的指令,把message資訊一并填寫了
git commit -a -m “message”
增補
假如第一次送出後,忘記加入一個檔案about.html
$ touch about.htm
$ git add about.htm
$ git commit --amend
[master 40dcd33] Second Commit amend
Committer: python <[email protected](none)>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email [email protected]
If the identity used for this commit is wrong, you can fix it with:
git commit --amend --author='Your Name <[email protected]>'
1 files changed, 1 insertions(+), 1 deletions(-)
create mode 100644 about.htm
-
--amend
修改,通過建立一個新的commit來replace目前分支的頂部。
注意:也可以在指令中繼續使用-m選項直接送出message。
-
檢視一下版本庫裡面送出的曆史記錄,可以看見修改amend後之前的上一次送出記錄不見了。git log
-
可以看到真實的操作記錄。git reflog
diff比較差異
檢視各種差異
指令 | 說明 |
---|---|
| #檢視被跟蹤檔案未暫存的修改,比較暫存區和工作區 |
| #檢視被跟蹤檔案暫存的修改,比較暫存區和上一次commit的差異 |
| #檢視被跟蹤檔案,比較工作區和上一次commit的差異。HEAD指代最後一次commit(實質是HEAD指針所指向的版本位置) |
示例代碼:
HEAD
- HEAD可以看做是一個遊标,一般是指向目前分支最後一次送出。
- HEAD的值存儲在.git/HEAD檔案中。是個ID
- HEAD,指代最後一次commit
- HEAD^,指代上一次送出
- HEAD^^,指代上上一次送出
- 上n次送出,表示為HEAD-n
檢出checkout和重置
checkout 用于切換分支,或恢複工作區檔案。
注意:checkout會重寫工作區,這個指令還是較為危險的。
指令 | 說明 |
---|---|
| 列出暫存區可以被檢出的檔案 |
| 從暫存區檢出檔案到工作區,就是覆寫工作區檔案,可以指定檢出的檔案。但是不清除stage |
| 檢出某個commit的指定檔案到暫存區和工作區 |
| 檢出暫存區的所有檔案到工作區 |
- 簡單示例:
指令 | 說明 |
---|---|
| 列出将被reset的檔案 |
| 重置檔案的暫存區,和上一次commit一緻,工作區不影響 |
| 重置暫存區與工作區,上一次commit保持一緻 |
指令 | 說明 |
---|---|
| 顯示commit的資訊,隻要HEAD發生變化,就可以在這裡看到 |
| 重置目前分支的HEAD為指定commit,同時重置暫存區,但工作區不變 |
| 重置目前分支的HEAD為指定commit,同時重置暫存區和工作區,與指定commit一緻 |
| 重置目前HEAD為指定commit,但保持暫存區和工作區不變 |
- reset操作,要慎重。
移動和删除
指令 | 說明 |
---|---|
| 改名,直接把改名的改動放入暫存區 |
| 會同時在版本庫和工作目錄中删除檔案,真删除 |
| 将檔案從暫存轉成未暫存,從版本庫中删除,但不删除工作目錄的該檔案,即檔案恢複成不追蹤狀态 |
- 注意:以上都算是改動,必須commit才算真的改動了
- mv操作
-
操作rm --cached
- rm操作
配置本地使用者名和郵箱
指令 | 說明 |
---|---|
| 配置全局的使用者名資訊為name |
| 配置全局的使用者郵箱為email |
| 顯示user.name資訊 |
| 顯示user.email資訊 |
- 注意:上面指令配置的資訊會存放在目前使用者家目錄下面~/.gitconfig檔案中記錄
push到遠端伺服器
- 使用前提
- 自己搭建一個gogs搭建一個github私服,模拟GitHub,或者直接使用github的遠端倉庫。
- 本地gogos的廠庫為:http://192.168.61.108:3888/xdd/mypython.git
指令 | 說明 |
---|---|
| 列出本地記錄的所有遠端倉庫 |
| 詳細列出本地記錄的所有遠端廠庫 |
| 在本地記錄一個名稱指向遠端倉庫 |
| 在/ect/gitconfig檔案中讀寫配置檔案 |
| 在~/.gitconfig檔案中讀寫配置檔案 |
-
推送相關指令
|指令|說明|
|:—|:—|
|指定推送到遠端主機和分支git push origin master
|指定目前分支推送到的遠端主機和對應分支git push origin
git push -u origin master
|指定遠端預設主機和分支
-u 第一次遠端推送的時候加上,以後就可以不使用-u參數,就可以
,也可以git push orgin master
都使用預設。git push
|simple方式,預設隻推送目前分支到預設關聯的遠端倉庫git push
- 注意:
- 遠端版本庫名一般定義為origin,這是一個習慣的用法,将建立origin和後面url的映射。
- 遠端廠庫一般會記錄在工作目錄下.git/config檔案中,一般資訊儲存在.git/config檔案的新的短[remote “origin”]中。
- .git/config這檔案時版本庫級别設定檔案。這裡的設定具有最高優先級
git remote add origin http://192.168.61.108:3888/xdd/mypython.git
注意:
http://[email protected]:3888/xdd/mypython.git
上加上使用者名,否則push會報401錯誤
- 修改origin中的url配置
git remote set-url origin http://[email protected]:3888/xdd/mypython.git
- 推送資料
[email protected] MINGW64 /d/MyPythonUse/其他/test2 (master)
$ git push -u origin master
Password:
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 8 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (14/14), 1.20 KiB | 122.00 KiB/s, done.
Total 14 (delta 0), reused 0 (delta 0)
To http://192.168.61.108:3888/xdd/mypython.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
第一次推送,需要輸入遠端倉庫密碼。輸入密碼就可以連接配接到遠端倉庫了。
推送完成後可以登入遠端廠庫,看到推送的檔案:
- 私有的倉庫,必須登入,隻能使用者自己看,為了友善,修改為公有的。
從遠端庫克隆
本次使用git協定連結遠端庫。
- 配置本地使用者名和郵箱
- 為本地生成ssh密鑰
ssh-keygen -t rsa -C "[email protected]"
- -t指定一個加密算法
- -C comment描述資訊。注解
- 注意:生成的密鑰檔案為:
和id_rsa
在目前使用者的家目錄下面.ssh檔案夾下id_rsa.pub
-
為生成的私鑰id_rsa
-
為生成的公鑰id_rsa.pub
-
使用web代開遠端git平台,操作如下:
操作完成後可以看到添加成功
那麼SSH登入的使用者使用的連結如圖下:
SSH遠端連結庫克隆
在windows上找一個空目錄,執行下面克隆指令。(注意:第一次使用ssh連結有提示,輸入yes即可)
git clone [email protected]:xdd/mypython.git ./
克隆成功,下面就可以使用這個初始的項目檔案開發了。
分支管理
指令 | 說明 |
---|---|
| 檢視所有分支(被*号标明的是目前使用分支) |
| 建立dev分支 |
| 切換到dev分支 |
| 建立dev分支,并切換到dev分支 |
| 合并dev分支到目前分支(預設為Fast forward快進模式合并,不會真的合并檔案到目前分支,隻是建構個連結) |
| 合并目前分支到dev分支,禁用Fast forward。(會真的合并檔案到目前分支上) |
| 删除dev分支 |
| 強行删除dev分支 |