每個封包時都會有 header 跟 body,我們會設定封包 header 的狀態碼標準化
以課程的例子
我們設定封包內的資訊
從訂便當中學會封包因此用封包來解釋protocal
主要需要
依據每個封包會有不同的服務,再根據不同的服務把封包傳送
根據不同的服務,可以有不同的格式
像是有些封包是即時性的,不需要做確認,只需要一職傳送即可,送丟沒關係,主要考輛是速度=>這是所謂的UDP封包
協定是一個標準,可以統一格式進而規模化。
HTTP是一個超文本協定,他是一個全球資訊網的資料通訊的基礎
假設我們有兩端,客戶端(電腦、瀏覽器)跟 server (伺服器)端
如果我們要傳送封包時,要給IP位址,才能實際傳送封包,然後我們是透過Domain Name Server (DNS) 來得知 IP 位址
透過DNS 把 domain name 跟 IP 位置的轉換
在mac nslookup
來查詢IP位址
自己電腦的local host: 127.0.0.1
瀏覽器其實也是程式的一種,其實不用瀏覽器的話,我們也可以得知那些資訊,瀏覽器只是幫助我們處理那些事情 => 利用 node.js的一個 library-request。我們可以透過request 得到 server 回傳的 response 的內容 (error, status, body)
而 request 和 respone 都會有 header 以及 body。 Header 主要放一些額外的資訊,而body 放的是主要內容。 分別帶著不同的資訊
在 HTTP request 裡面的動作。
GET: 拿資訊,沒有request body
例如: HTTP 發一個 get request 到 server,server回傳一個 response,發送一個圖片回來
POST:輸入資訊,有request body
例如: HTTP 在一個登入帳號的頁面發一個 post request 到 server,server 回傳結果回來
而 POST 的 request body 裡面放著登入的資訊
HTTP method
HEAD方法請求與 GET
方法相同的回應,但它沒有回應主體(response body),主要應用在只想要知道 response 的資訊
PUT 改變資源並取代原本整個內容,未更動的也會被取代掉
PATCH 與 put 相似,但只更改部分內容,原本未更動到的也還在
DELETE 刪除資源
200 OK: 請求已成功,請求所希望的回應頭或資料體將隨此回應返回。
204 No Content: 發生於可能我們 Delete 資源成功但回傳 204,可能沒有額外的資源可以說
301 Moved Permanently: 永久移到其他的位置
假如我們 Get a.com 這個位置
回傳的狀態是 301 位置是 b.com,而當我們下次再 Get a.com 時,瀏覽器會自動幫我們導到b.com的位置
問一次即可,下次就會自動導入到更改的位置
302 Found: 暫時移到其他的位置
而 302 暫時的,以剛剛例子來說,瀏覽器還是會在問一次要去哪裡諈後才會到b.com裡面
404 Not Found: 這是我們常見的錯誤的狀態碼之一,請求失敗,請求所希望得到的資源未被在伺服器上發現,但允許使用者的後續請求。
500 Internal Server Error: 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。沒有給出具體錯誤資訊。
502 Bad Gateway: 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的回應。
我們可以利用node 內建的 "http" library,根據url來決定我們要改什麼樣的 response ,並且提供一些 header 和 status code
var http = require("http");
var server = http.createServer(handleRequest);
function handleRequest(req, res) {
console.log(req.url);
if (req.url === "/") {
res.write("Welcome");
res.end();
return;
}
if (req.url === "hello") {
res.write("hello");
res.end();
return;
}
if (req.url === "/redirect") {
//瀏覽器會自動幫你轉址到該去的位置
res.writeHead(302, {
Location: "/hello",
});
res.end();
return;
}
res.writeHead(404);
res.end();
}
server.listen(5000);
在網路裡面,一共有分成 7 層,並且每一層都負責不一樣的事情
圖片取自鳥哥鳥哥的 Linux 私房菜
而如果在TCP/IP時 只有四層
應用層 Application : HTTP, HTTPS, FTP,DNS …
傳輸層 Transport : TCP, UDP
網路層 Internet : IPv4, IPv6
鏈結層 Network Access : 乙太網路、Wi-Fi
目前主流來說是以TCP/IP的模型
HTTP 建立在 TCP 上面 ,而 TCP 建立在 IP 上面
圖片取自鳥哥鳥哥的 Linux 私房菜
IP地址的協議又分為 IPV4/IPV6,而其中主要的差別在於IP的地址的不同
每一台電腦都會有一個固定 IP,電腦只會認得由 32 位元所組成的 IP 位址
但除了固定 IP 外,我們每次連接時都會有不一樣的 IP,而那就是浮動 IP,但別人依舊可以連到那個位置。
浮動 IP 好處:假如有一個駭客要攻擊你,但他無法知道你下一次的 IP 位置,因此大部分蠻多的用戶都是浮動IP
裡面的電腦一到電腦三,彼此可以連接彼此,他們在一個內網裡面皆為虛擬 IP,而在公司裏面,會址提供部分的名單可以連接到自家的網路,公司對外有一個固定IP,但對內員工有許多不同的內網 IP。
以虛擬 IP 來說,假如我們要發出一個 request 到 google 的話,對外 google 只看得到數據機給的固定 IP,然後把 respond 回傳回來後,再經由數據機把資料回傳進來。所以彼此中間透過數據機來傳輸
虛擬IP好處: 電信商不用在特定分配一個IP 給每一個人,址需要分配給數據機皆可
通常 192.168.x.x 或者 10.0.x.x 都是虛擬IP,意思是說外面的人連不到這裡面的內網IP
當我們要把資料傳送到一個IP地址時,我們需要給他們特定的port,讓他們傳送到特定的程式
例如: 12.20.77.60:80
HTTP: 80 預設
HTTPS: 443
FTP : 21
如果再測試的時候,常用的Port有: 3000, 4000, 8080, 8000
TCP/UDP 兩個位於傳輸層裡面,TCP為一個可靠的連結(三項交握)而 HTTP/FTP接建立在 TCP 上面。
UDP 就像是直播或是視訊,需要的是快速,不在乎對方有沒有收到,偶爾丟一兩個封包沒關係。
當我們需要從對方存取某個資料的話,需要透過 API 提供一個介面來讓我們存取,而對方可以控制介面那些資料可以給我們那些不行
API 就像是接收要求的信差,然後告訴系統你要什麼,系統再把回應送回給你
例如: 要怎麼知道網路狀況 => 可以利用作業系統提供的 API 來呼叫
例如: 讀取檔案 => 也是依靠底層作業系統提供的 API
例如: 拿到FB的好友資料 => 串接 FB 的 API
例如: 別人如何在我這裡新增資料 => 提供給別人新增資料的API
因此我們可以得知,透過API可以讓雙方交換資料
Web API 是透過 HTTP 協定的 API,我們會發出 request 後得到 對方的 response
SDK: software development kit(把所有的東西都包裝好)
附註: 要記得先安裝request npm i request
const request = require("request");
const process = require("process");
console.log(process.argv);
request("https://reqres.in/api/users/" + process.argv[2], function (
error,
response,
body
) {
console.log(body);
});
How to make HTTP Requests using Node.js Request Module
The Node.js Request Module
用純文字的好處就是可以定義任何想要的格式但壞處也是相對要怎麼處理這格式
狀態: 良好
沒其他社情
if(Response.body.indexOf("狀態:良好") >=0) {
...
}
但一般來說我們會利用XML或者JSON
長相與HTML類似,利用標籤的形式不過近年來用JSON比較多
是一個資料格式,一個基於 JS 物件產生的資料格式,目前看到的資料格式型態都是以 JSON 為主,而且大小又比 XML 小,此外在任何一個程式語言內都可以使用他
const request = require("request");
const process = require("process");
console.log(process.argv);
request("https://reqres.in/api/users/" + process.argv[2], function (
error,
response,
body
) {
const json = JSON.parse(body); // 回傳一個JSON 格式的字串 轉回成一個JS 的物件
console.log(json); // 我們可以讀取我們想要的資料了
console.log(json.data.first_name);
});
const obj = {
name: "hule",
job: "none",
};
console.log(JSON.stringify(obj)); // 把obj物件變成JSON格式的字串
Protocol就是一個定義資料交換的格式
SOAP的資料交換都是偷過XML,不過目前已經很少用了
node.js有一個SOAPlibrary
是一個風格,並非一個協定
刪除用 Delete 是一個習慣但不是規範,並沒有明確規定依定要用 Delete ,所以其實也可以全部都用 POST ,但會造成困擾
因此 RESTful 創造出一個風格,讓我們好使用 HTTP 給的規格
只要符合 RESTful 風格的,我們都會叫他 RESTful API,目前大多數都是屬於 RESTful API ,把網址還有動詞都有個建議的規範在
拿資料 : GET
按照對方一球的格式,丟出一個 request ,根據 response 回來做事情
但我們要注意每個格式,例如UDP格式,或者HTTP格式。因此我們也可以自行根據不同的 Protocol 定義 API 的格式
發一個get 的 request 到我們想要的網址去,並得到 response
指令 curl 網址 > name.html
就可以把裡面的內容下載成HTML黨,然後再開啟就會是我們想要的頁面
curl -I 網址
只要該網址的header,不需要body
ping : 利用丟封包的方式來測試可否連到該網址
telnet: ping 一個指定的port 來看該port 是否開啟,或者用來拿資料
telnet 網址 80
看是否有連到80 port
ptt 就是基於 telnet的協定而製作出來的,預設的 port 為 23
CRUD
C (CREATE) : 新增,對應的就是 POST
R (READ) : 讀取,對應的 GET
U (UPDATE) : 對應的是PUT/PATCH,更新,把原本的資料作修改
D (DELETE) : 對應的就是DELETE,刪除
說明 | Method | path | 參數 | 範例 |
---|---|---|---|---|
回傳所有餐廳資料 | GET | /restuarants | _limit :限制回傳資料數量 |
/restuarants?_limit=5 |
回傳單一餐廳資料 | GET | /restuarants/:id | /restuarants/1 | |
刪除餐廳 | DELETE | /restuarants/:id | /restuarants/4 | |
新增餐廳 | POST | /restuarants | name: 餐廳名 | |
更新餐廳 | PATCH | /restuarants/:id | name: 餐廳名 |
每個封包時都會有 header 跟 body,我們會設定封包 header 的狀態碼標準化
以課程的例子
我們設定封包內的資訊
從訂便當中學會封包因此用封包來解釋protocal
主要需要
依據每個封包會有不同的服務,再根據不同的服務把封包傳送
根據不同的服務,可以有不同的格式
像是有些封包是即時性的,不需要做確認,只需要一職傳送即可,送丟沒關係,主要考輛是速度=>這是所謂的UDP封包
協定是一個標準,可以統一格式進而規模化。
HTTP是一個超文本協定,他是一個全球資訊網的資料通訊的基礎
假設我們有兩端,客戶端(電腦、瀏覽器)跟 server (伺服器)端
如果我們要傳送封包時,要給IP位址,才能實際傳送封包,然後我們是透過Domain Name Server (DNS) 來得知 IP 位址
透過DNS 把 domain name 跟 IP 位置的轉換
在mac nslookup
來查詢IP位址
自己電腦的local host: 127.0.0.1
瀏覽器其實也是程式的一種,其實不用瀏覽器的話,我們也可以得知那些資訊,瀏覽器只是幫助我們處理那些事情 => 利用 node.js的一個 library-request。我們可以透過request 得到 server 回傳的 response 的內容 (error, status, body)
而 request 和 respone 都會有 header 以及 body。 Header 主要放一些額外的資訊,而body 放的是主要內容。 分別帶著不同的資訊
在 HTTP request 裡面的動作。
GET: 拿資訊,沒有request body
例如: HTTP 發一個 get request 到 server,server回傳一個 response,發送一個圖片回來
POST:輸入資訊,有request body
例如: HTTP 在一個登入帳號的頁面發一個 post request 到 server,server 回傳結果回來
而 POST 的 request body 裡面放著登入的資訊
HTTP method
HEAD方法請求與 GET
方法相同的回應,但它沒有回應主體(response body),主要應用在只想要知道 response 的資訊
PUT 改變資源並取代原本整個內容,未更動的也會被取代掉
PATCH 與 put 相似,但只更改部分內容,原本未更動到的也還在
DELETE 刪除資源
200 OK: 請求已成功,請求所希望的回應頭或資料體將隨此回應返回。
204 No Content: 發生於可能我們 Delete 資源成功但回傳 204,可能沒有額外的資源可以說
301 Moved Permanently: 永久移到其他的位置
假如我們 Get a.com 這個位置
回傳的狀態是 301 位置是 b.com,而當我們下次再 Get a.com 時,瀏覽器會自動幫我們導到b.com的位置
問一次即可,下次就會自動導入到更改的位置
302 Found: 暫時移到其他的位置
而 302 暫時的,以剛剛例子來說,瀏覽器還是會在問一次要去哪裡諈後才會到b.com裡面
404 Not Found: 這是我們常見的錯誤的狀態碼之一,請求失敗,請求所希望得到的資源未被在伺服器上發現,但允許使用者的後續請求。
500 Internal Server Error: 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。沒有給出具體錯誤資訊。
502 Bad Gateway: 作為閘道器或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的回應。
我們可以利用node 內建的 "http" library,根據url來決定我們要改什麼樣的 response ,並且提供一些 header 和 status code
var http = require("http");
var server = http.createServer(handleRequest);
function handleRequest(req, res) {
console.log(req.url);
if (req.url === "/") {
res.write("Welcome");
res.end();
return;
}
if (req.url === "hello") {
res.write("hello");
res.end();
return;
}
if (req.url === "/redirect") {
//瀏覽器會自動幫你轉址到該去的位置
res.writeHead(302, {
Location: "/hello",
});
res.end();
return;
}
res.writeHead(404);
res.end();
}
server.listen(5000);
在網路裡面,一共有分成 7 層,並且每一層都負責不一樣的事情
圖片取自鳥哥鳥哥的 Linux 私房菜
而如果在TCP/IP時 只有四層
應用層 Application : HTTP, HTTPS, FTP,DNS …
傳輸層 Transport : TCP, UDP
網路層 Internet : IPv4, IPv6
鏈結層 Network Access : 乙太網路、Wi-Fi
目前主流來說是以TCP/IP的模型
HTTP 建立在 TCP 上面 ,而 TCP 建立在 IP 上面
圖片取自鳥哥鳥哥的 Linux 私房菜
IP地址的協議又分為 IPV4/IPV6,而其中主要的差別在於IP的地址的不同
每一台電腦都會有一個固定 IP,電腦只會認得由 32 位元所組成的 IP 位址
但除了固定 IP 外,我們每次連接時都會有不一樣的 IP,而那就是浮動 IP,但別人依舊可以連到那個位置。
浮動 IP 好處:假如有一個駭客要攻擊你,但他無法知道你下一次的 IP 位置,因此大部分蠻多的用戶都是浮動IP
裡面的電腦一到電腦三,彼此可以連接彼此,他們在一個內網裡面皆為虛擬 IP,而在公司裏面,會址提供部分的名單可以連接到自家的網路,公司對外有一個固定IP,但對內員工有許多不同的內網 IP。
以虛擬 IP 來說,假如我們要發出一個 request 到 google 的話,對外 google 只看得到數據機給的固定 IP,然後把 respond 回傳回來後,再經由數據機把資料回傳進來。所以彼此中間透過數據機來傳輸
虛擬IP好處: 電信商不用在特定分配一個IP 給每一個人,址需要分配給數據機皆可
通常 192.168.x.x 或者 10.0.x.x 都是虛擬IP,意思是說外面的人連不到這裡面的內網IP
當我們要把資料傳送到一個IP地址時,我們需要給他們特定的port,讓他們傳送到特定的程式
例如: 12.20.77.60:80
HTTP: 80 預設
HTTPS: 443
FTP : 21
如果再測試的時候,常用的Port有: 3000, 4000, 8080, 8000
TCP/UDP 兩個位於傳輸層裡面,TCP為一個可靠的連結(三項交握)而 HTTP/FTP接建立在 TCP 上面。
UDP 就像是直播或是視訊,需要的是快速,不在乎對方有沒有收到,偶爾丟一兩個封包沒關係。
當我們需要從對方存取某個資料的話,需要透過 API 提供一個介面來讓我們存取,而對方可以控制介面那些資料可以給我們那些不行
API 就像是接收要求的信差,然後告訴系統你要什麼,系統再把回應送回給你
例如: 要怎麼知道網路狀況 => 可以利用作業系統提供的 API 來呼叫
例如: 讀取檔案 => 也是依靠底層作業系統提供的 API
例如: 拿到FB的好友資料 => 串接 FB 的 API
例如: 別人如何在我這裡新增資料 => 提供給別人新增資料的API
因此我們可以得知,透過API可以讓雙方交換資料
Web API 是透過 HTTP 協定的 API,我們會發出 request 後得到 對方的 response
SDK: software development kit(把所有的東西都包裝好)
附註: 要記得先安裝request npm i request
const request = require("request");
const process = require("process");
console.log(process.argv);
request("https://reqres.in/api/users/" + process.argv[2], function (
error,
response,
body
) {
console.log(body);
});
How to make HTTP Requests using Node.js Request Module
The Node.js Request Module
用純文字的好處就是可以定義任何想要的格式但壞處也是相對要怎麼處理這格式
狀態: 良好
沒其他社情
if(Response.body.indexOf("狀態:良好") >=0) {
...
}
但一般來說我們會利用XML或者JSON
長相與HTML類似,利用標籤的形式不過近年來用JSON比較多
是一個資料格式,一個基於 JS 物件產生的資料格式,目前看到的資料格式型態都是以 JSON 為主,而且大小又比 XML 小,此外在任何一個程式語言內都可以使用他
const request = require("request");
const process = require("process");
console.log(process.argv);
request("https://reqres.in/api/users/" + process.argv[2], function (
error,
response,
body
) {
const json = JSON.parse(body); // 回傳一個JSON 格式的字串 轉回成一個JS 的物件
console.log(json); // 我們可以讀取我們想要的資料了
console.log(json.data.first_name);
});
const obj = {
name: "hule",
job: "none",
};
console.log(JSON.stringify(obj)); // 把obj物件變成JSON格式的字串
Protocol就是一個定義資料交換的格式
SOAP的資料交換都是偷過XML,不過目前已經很少用了
node.js有一個SOAPlibrary
是一個風格,並非一個協定
刪除用 Delete 是一個習慣但不是規範,並沒有明確規定依定要用 Delete ,所以其實也可以全部都用 POST ,但會造成困擾
因此 RESTful 創造出一個風格,讓我們好使用 HTTP 給的規格
只要符合 RESTful 風格的,我們都會叫他 RESTful API,目前大多數都是屬於 RESTful API ,把網址還有動詞都有個建議的規範在
拿資料 : GET
按照對方一球的格式,丟出一個 request ,根據 response 回來做事情
但我們要注意每個格式,例如UDP格式,或者HTTP格式。因此我們也可以自行根據不同的 Protocol 定義 API 的格式
發一個get 的 request 到我們想要的網址去,並得到 response
指令 curl 網址 > name.html
就可以把裡面的內容下載成HTML黨,然後再開啟就會是我們想要的頁面
curl -I 網址
只要該網址的header,不需要body
ping : 利用丟封包的方式來測試可否連到該網址
telnet: ping 一個指定的port 來看該port 是否開啟,或者用來拿資料
telnet 網址 80
看是否有連到80 port
ptt 就是基於 telnet的協定而製作出來的,預設的 port 為 23
CRUD
C (CREATE) : 新增,對應的就是 POST
R (READ) : 讀取,對應的 GET
U (UPDATE) : 對應的是PUT/PATCH,更新,把原本的資料作修改
D (DELETE) : 對應的就是DELETE,刪除
說明 | Method | path | 參數 | 範例 |
---|---|---|---|---|
回傳所有餐廳資料 | GET | /restuarants | _limit :限制回傳資料數量 |
/restuarants?_limit=5 |
回傳單一餐廳資料 | GET | /restuarants/:id | /restuarants/1 | |
刪除餐廳 | DELETE | /restuarants/:id | /restuarants/4 | |
新增餐廳 | POST | /restuarants | name: 餐廳名 | |
更新餐廳 | PATCH | /restuarants/:id | name: 餐廳名 |
Git 是⼀種分散式版本的版本控制系統,就像是我們以前做報告時,會把一份報告根據不同的更改紀錄而有不同的名稱,一個檔案會有不同的版本,我們希望能夠把這些版本都保存起來
我們這樣做會難以照到報告之間的關係是什麼,很難以得知哪一個檔案是根據哪一個為基底去做更改。因此當檔案量很多的話,我們就會希望有一個版本控制的系統來幫助我們使用
在團隊上,一個軟體的開發會有不同的分支,要從某一個版本切出不同的分支,再由這些分支合併
版本控制的流程:
通常我們是開一個新的branch 來做專業,為了保持master的穩定而不直接在master上面操作
對我們的專案使用git這個軟體,主要⽬的是要讓 Git 開始對這個⽬錄進⾏版本控制。
這個指令會在這個⽬錄裡建立⼀個 .git 隱藏⽬錄,整個 Git 的需要的東西都在這個⽬錄裡。
查看目前版本控制的狀態
把我們想要的檔案加入倒版本控制中,而加入的同時我們可以看他們的狀態。如果出現
如果有很多檔案要加入的話,可以輸入 git add .
,就可以一口氣把所有的檔案都加入到版本控制,也可以輸入資料夾名稱,把資料夾的所有檔案都加入版本控制
要記得加入版本控制這個動作是每次都要做一次,才能接下來的git commit
的動作
新建一個版本,就像是新建一個資料夾,而它的名稱就是那一長串的亂碼編號
通常是在於完成一個小進度時再 commit
沒有成功是因為我們沒有 commit message,因此要改為 git commit -m "要輸入的訊息"
再來查看他的狀態是否已經有新的版本
我們可以利用一個合併的語法,把git add
和git commit
合併起來
git commit -am "要輸入的訊息"
就可以把修改的檔案加入倒版本控制並且新建一個版本,但要記得她不會把新的檔案加入倒暫存區裡面
如果我們不小心訊息輸入錯誤的話,則可以利用git commit --amend
來更改訊息
如果不想要這個commit時,想要收回可以利用git reset HEAD^ --hard
就會全部不見(包含改過的檔案)
我們就把它移除了,因此git log的時候剛剛的commit完全不見
如果想要改過的檔案還在的話,可以用git reset HEAD^ --soft
指令
HEAD^
: 上一個的意思,head指最前面的那個
可以用來查看歷史紀錄
git log --oneling
: 可以顯示出比較簡短的歷史紀錄
可以回到過去的版本
git checkout
編碼: 回到那個狀態的檔案
git checkout master
: 可以讓你回到最新的狀態
如果想要把檔案改回到還沒改過的檔案時,可以利用git checkout --檔案名
會回復到你上一個commit的狀態
可以把想要忽略的檔案放在裡面,可以想像這檔案會被排除在資料夾外
像我們之前的例子,有一個檔案 test 是我們不想要放進版本控制內的檔案(利入 log 紀錄檔或者作業系統的檔案,跟此專案本身沒什麼關係),因此我們可以把要忽略的檔案放在.gitignore
裡面,做完後記得這個檔案本身也要加入到版本控制內(因為其他專案的人也要看到是什麼檔案被忽略)
(把test加入進去)
可以看在你 commit 之前,做了哪些事情,看你這一次跟上一次的差別在哪
一條線的開發模式,其實問題很大,因為沒辦罰同時處理很多事情,因為東西都在同一條commit上
引進branch後,大家可以分工各做各的事情,平行開發,最後做完再把它們合併起來
再合併的部分其實就是把branch後面的分支拿下來,因為他們有共同的祖先,然而最麻煩的是兩個branch改道同一個檔案,會不知道要合併哪個檔案=> conflict
就像是複製一個資料夾近來
git branch -v
可以看到目前有哪些branch
再git裡面,master 為主幹(最主要的分支)
如果要建立新的 branch 則輸入git branch 名稱
即可
刪除特定的branch git branch -d 名稱
NOTE:-d
通常都是刪除的意思
如果要改名的話可以用git branch -m 新的名稱
來執行
如果要抓遠端branch的話則可以直接利用 git checkout branch名稱
git就會直接把遠端的branch給抓下來
跟前面的 checkout 用法一樣
git checkout branch-name
我們讓這個分枝有個 commit 新的資料夾
當我們在分支開發完後,需要合併回 master
指令: git merge 名稱
把新的分支合併進去到master
合併完後就可以把之前的那個branch給移除
conflict
假如在處理專案時,與同事同時更改到同一專案時,git會無法判別要使用哪一個檔案
此時需要手動來解決,git會出現衝突並且此時出現的衝突在哪裡,自己可以手動解決,最後再 commit 即完成
Head 代表目前所在位置的檔案,我們必須決定合併完的內容要長怎樣
主要功能可以放 git repository 的地方,讓大家可以多人協作共用一個git的project
issue: 可以當作一個專案的討論區
contributor: 有誰跟你一起協作
pull request: 當有一個 branch 想要合併到另一個 branch 的時候,可以利用它來做審核,直接在上面可以看到有直接在上面可以看到那些檔案改變,並且給予建議以及合併
首先直接點選github裡面的new repository
接著跟著只是
git remote add origin https://github.com/impala8012/test1.git
git push -u origin master
把指令輸進去 就可以順利把檔案上傳進去
Note: 如果要複製貼上的話不能使用一般的Ctrl+c/+v
而是要用
Ctrl+ins 複製
Shift+ins 貼上
利用push指令來把本地最新的改變給傳上去
Github 這邊也上傳成功
此外也可以上傳一個branch
如果有人改變了這個 repository,我們要利用 pull 把這個改變給抓下來
首先假如我們在github裡面有座先更改
接著我們利用git pull origin master
把最新的資料抓下來
可以在 github 的介面裡合併兩個 branch,並且會顯示兩個 file 中的變化
點選 compare & pull request
最後點選 merge,並且可以 delete branch
於是可以發現 master branch 已經把檔案給合併起來了
通常都會在github上面利用pull request合併
假如我們看到別人的repository不錯,我們可以利用git clone 把牠抓下來
可以複製裡面的網址然後輸入git clone 網址
就可以把牠抓下來了
但是我們要注意這個是別人的repository,我們只能本地commit但不能push回去,因為我們沒有權限
如果要push上去的話,需要利用fork,把那個repository複製過來然後再重新clone一次
最後也可以push回去了
github 製造一個免費的靜態網頁的空間,可以讓我們上傳我們的靜態網頁
一個github的流程:
GitLab 與 Bitbucket有其他類似github的服務
在程式裏面的hook則代表發生某件事情的時候會通知我,可以偵測某些指令。例如有人 commit 時通知我或者有人push時通知我等等。
在我們 .git 的資料夾裡面有一個 hook 的資料夾
shell script (程式化腳本),是一個文字介面底下讓我們與系統溝通的一個工具介面,讓我們以更方便,更自動化的方式來執行想要執行的指令。快速的協助使用者 or 管理者大量地執行重複性的動作與指令。
在windows,我們可以利用git bash要執行Shell script
創建一個.sh
的檔案 => touch num.sh
接著可以利用vim文字編輯器在裡面寫入我們要的程式
以Lidemy的作業為例:
寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js
。
這時候我們要利用迴圈的方式來完成
我們可以寫
for((i = 1; i<=$1;i++))
do
touch ${i}.js
done
echo "File created"
用while迴圈的話則會長這樣
i=1
n=$1
while [ $i -le $n ]
do
touch $i.js
((i++))
done
echo "File Created"
注意:讀取參數位置來獲取參數時,需要用 $1 到 $9 獲取第1到第9個的命令行參數。$0為shell名。
參考資料
技術共筆部落格
鳥哥的Linux私房菜
Shell Script 教學
it邦
grep、cut、awk、sed文本处理
sed与awk实例
shell判斷式
Git 是⼀種分散式版本的版本控制系統,就像是我們以前做報告時,會把一份報告根據不同的更改紀錄而有不同的名稱,一個檔案會有不同的版本,我們希望能夠把這些版本都保存起來
我們這樣做會難以照到報告之間的關係是什麼,很難以得知哪一個檔案是根據哪一個為基底去做更改。因此當檔案量很多的話,我們就會希望有一個版本控制的系統來幫助我們使用
在團隊上,一個軟體的開發會有不同的分支,要從某一個版本切出不同的分支,再由這些分支合併
版本控制的流程:
通常我們是開一個新的branch 來做專業,為了保持master的穩定而不直接在master上面操作
對我們的專案使用git這個軟體,主要⽬的是要讓 Git 開始對這個⽬錄進⾏版本控制。
這個指令會在這個⽬錄裡建立⼀個 .git 隱藏⽬錄,整個 Git 的需要的東西都在這個⽬錄裡。
查看目前版本控制的狀態
把我們想要的檔案加入倒版本控制中,而加入的同時我們可以看他們的狀態。如果出現
如果有很多檔案要加入的話,可以輸入 git add .
,就可以一口氣把所有的檔案都加入到版本控制,也可以輸入資料夾名稱,把資料夾的所有檔案都加入版本控制
要記得加入版本控制這個動作是每次都要做一次,才能接下來的git commit
的動作
新建一個版本,就像是新建一個資料夾,而它的名稱就是那一長串的亂碼編號
通常是在於完成一個小進度時再 commit
沒有成功是因為我們沒有 commit message,因此要改為 git commit -m "要輸入的訊息"
再來查看他的狀態是否已經有新的版本
我們可以利用一個合併的語法,把git add
和git commit
合併起來
git commit -am "要輸入的訊息"
就可以把修改的檔案加入倒版本控制並且新建一個版本,但要記得她不會把新的檔案加入倒暫存區裡面
如果我們不小心訊息輸入錯誤的話,則可以利用git commit --amend
來更改訊息
如果不想要這個commit時,想要收回可以利用git reset HEAD^ --hard
就會全部不見(包含改過的檔案)
我們就把它移除了,因此git log的時候剛剛的commit完全不見
如果想要改過的檔案還在的話,可以用git reset HEAD^ --soft
指令
HEAD^
: 上一個的意思,head指最前面的那個
可以用來查看歷史紀錄
git log --oneling
: 可以顯示出比較簡短的歷史紀錄
可以回到過去的版本
git checkout
編碼: 回到那個狀態的檔案
git checkout master
: 可以讓你回到最新的狀態
如果想要把檔案改回到還沒改過的檔案時,可以利用git checkout --檔案名
會回復到你上一個commit的狀態
可以把想要忽略的檔案放在裡面,可以想像這檔案會被排除在資料夾外
像我們之前的例子,有一個檔案 test 是我們不想要放進版本控制內的檔案(利入 log 紀錄檔或者作業系統的檔案,跟此專案本身沒什麼關係),因此我們可以把要忽略的檔案放在.gitignore
裡面,做完後記得這個檔案本身也要加入到版本控制內(因為其他專案的人也要看到是什麼檔案被忽略)
(把test加入進去)
可以看在你 commit 之前,做了哪些事情,看你這一次跟上一次的差別在哪
一條線的開發模式,其實問題很大,因為沒辦罰同時處理很多事情,因為東西都在同一條commit上
引進branch後,大家可以分工各做各的事情,平行開發,最後做完再把它們合併起來
再合併的部分其實就是把branch後面的分支拿下來,因為他們有共同的祖先,然而最麻煩的是兩個branch改道同一個檔案,會不知道要合併哪個檔案=> conflict
就像是複製一個資料夾近來
git branch -v
可以看到目前有哪些branch
再git裡面,master 為主幹(最主要的分支)
如果要建立新的 branch 則輸入git branch 名稱
即可
刪除特定的branch git branch -d 名稱
NOTE:-d
通常都是刪除的意思
如果要改名的話可以用git branch -m 新的名稱
來執行
如果要抓遠端branch的話則可以直接利用 git checkout branch名稱
git就會直接把遠端的branch給抓下來
跟前面的 checkout 用法一樣
git checkout branch-name
我們讓這個分枝有個 commit 新的資料夾
當我們在分支開發完後,需要合併回 master
指令: git merge 名稱
把新的分支合併進去到master
合併完後就可以把之前的那個branch給移除
conflict
假如在處理專案時,與同事同時更改到同一專案時,git會無法判別要使用哪一個檔案
此時需要手動來解決,git會出現衝突並且此時出現的衝突在哪裡,自己可以手動解決,最後再 commit 即完成
Head 代表目前所在位置的檔案,我們必須決定合併完的內容要長怎樣
主要功能可以放 git repository 的地方,讓大家可以多人協作共用一個git的project
issue: 可以當作一個專案的討論區
contributor: 有誰跟你一起協作
pull request: 當有一個 branch 想要合併到另一個 branch 的時候,可以利用它來做審核,直接在上面可以看到有直接在上面可以看到那些檔案改變,並且給予建議以及合併
首先直接點選github裡面的new repository
接著跟著只是
git remote add origin https://github.com/impala8012/test1.git
git push -u origin master
把指令輸進去 就可以順利把檔案上傳進去
Note: 如果要複製貼上的話不能使用一般的Ctrl+c/+v
而是要用
Ctrl+ins 複製
Shift+ins 貼上
利用push指令來把本地最新的改變給傳上去
Github 這邊也上傳成功
此外也可以上傳一個branch
如果有人改變了這個 repository,我們要利用 pull 把這個改變給抓下來
首先假如我們在github裡面有座先更改
接著我們利用git pull origin master
把最新的資料抓下來
可以在 github 的介面裡合併兩個 branch,並且會顯示兩個 file 中的變化
點選 compare & pull request
最後點選 merge,並且可以 delete branch
於是可以發現 master branch 已經把檔案給合併起來了
通常都會在github上面利用pull request合併
假如我們看到別人的repository不錯,我們可以利用git clone 把牠抓下來
可以複製裡面的網址然後輸入git clone 網址
就可以把牠抓下來了
但是我們要注意這個是別人的repository,我們只能本地commit但不能push回去,因為我們沒有權限
如果要push上去的話,需要利用fork,把那個repository複製過來然後再重新clone一次
最後也可以push回去了
github 製造一個免費的靜態網頁的空間,可以讓我們上傳我們的靜態網頁
一個github的流程:
GitLab 與 Bitbucket有其他類似github的服務
在程式裏面的hook則代表發生某件事情的時候會通知我,可以偵測某些指令。例如有人 commit 時通知我或者有人push時通知我等等。
在我們 .git 的資料夾裡面有一個 hook 的資料夾
shell script (程式化腳本),是一個文字介面底下讓我們與系統溝通的一個工具介面,讓我們以更方便,更自動化的方式來執行想要執行的指令。快速的協助使用者 or 管理者大量地執行重複性的動作與指令。
在windows,我們可以利用git bash要執行Shell script
創建一個.sh
的檔案 => touch num.sh
接著可以利用vim文字編輯器在裡面寫入我們要的程式
以Lidemy的作業為例:
寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 {number}.js
。
這時候我們要利用迴圈的方式來完成
我們可以寫
for((i = 1; i<=$1;i++))
do
touch ${i}.js
done
echo "File created"
用while迴圈的話則會長這樣
i=1
n=$1
while [ $i -le $n ]
do
touch $i.js
((i++))
done
echo "File Created"
注意:讀取參數位置來獲取參數時,需要用 $1 到 $9 獲取第1到第9個的命令行參數。$0為shell名。
參考資料
技術共筆部落格
鳥哥的Linux私房菜
Shell Script 教學
it邦
grep、cut、awk、sed文本处理
sed与awk实例
shell判斷式
與電腦溝通的工具,屬於純文字介面,與我們平常熟悉的圖形化使用者介面不同Graphical User Interface(GUI)
在操作方面的話,因為用 windows 作業系統,所以會以 git bash
來作示範執行我們的CLI介面
介紹完基本的介紹後,就來看一下介紹一些常用的指令吧
首先 pwd
他可以告訴我們目前所在位置
印出現在位置的檔案清單
-al
會印出所有的資料例如檔案權限、檔案大小
切換資料夾
cd 資料夾名稱
cd ..
回到上一層指令使用手冊,介紹指令的使用方式
例如: man ls
如果是要針對檔案作操作呢?我們可以使用以下的指令來幫助我們
建立檔案與更改檔案時間
可以刪除我們想要刪除的檔案
如果要刪除資料夾的話在後面加dir
-> rmdir 資料夾名稱
也可以用 rm -r 資料夾名稱
參數-f
則是強制刪除 (小心使用)
建立資料夾
移動檔案或是改名
mv 檔案名稱 ..
把檔案移到上一層
複製檔案或者資料夾
如果要複製資料夾的話則需要多使用一個參數-r
抓取關鍵字
下載檔案
送出 request
我們可以利用curl API網址
,電腦就會利用get方法把respond給展示出來。因此可以用來測試API
利用>
把input/output給重新導向
以這個例子,我們就利用>
把資料重新導向到list_result的這個檔案裏面,並且如果再重新導向到同一個檔案>
會把後面之前的內容全部覆蓋掉
如果我們要新增資料的話則是用兩個箭號 >>
代表append的意思
可以把左邊指令的輸出變成右邊指令的輸入
與電腦溝通的工具,屬於純文字介面,與我們平常熟悉的圖形化使用者介面不同Graphical User Interface(GUI)
在操作方面的話,因為用 windows 作業系統,所以會以 git bash
來作示範執行我們的CLI介面
介紹完基本的介紹後,就來看一下介紹一些常用的指令吧
首先 pwd
他可以告訴我們目前所在位置
印出現在位置的檔案清單
-al
會印出所有的資料例如檔案權限、檔案大小
切換資料夾
cd 資料夾名稱
cd ..
回到上一層指令使用手冊,介紹指令的使用方式
例如: man ls
如果是要針對檔案作操作呢?我們可以使用以下的指令來幫助我們
建立檔案與更改檔案時間
可以刪除我們想要刪除的檔案
如果要刪除資料夾的話在後面加dir
-> rmdir 資料夾名稱
也可以用 rm -r 資料夾名稱
參數-f
則是強制刪除 (小心使用)
建立資料夾
移動檔案或是改名
mv 檔案名稱 ..
把檔案移到上一層
複製檔案或者資料夾
如果要複製資料夾的話則需要多使用一個參數-r
抓取關鍵字
下載檔案
送出 request
我們可以利用curl API網址
,電腦就會利用get方法把respond給展示出來。因此可以用來測試API
利用>
把input/output給重新導向
以這個例子,我們就利用>
把資料重新導向到list_result的這個檔案裏面,並且如果再重新導向到同一個檔案>
會把後面之前的內容全部覆蓋掉
如果我們要新增資料的話則是用兩個箭號 >>
代表append的意思
可以把左邊指令的輸出變成右邊指令的輸入