Git 基本概述
Git 是一個(gè)開(kāi)源的分布式版本控制系統(tǒng),用于敏捷高效地處理任何或大或小的項(xiàng)目。
集中式和分布式的區(qū)別?
最常見(jiàn)的集中式版本控制系統(tǒng)是SVN,版本庫(kù)是集中放在中央處理器中的,而干活的時(shí)候,用的都是自己電腦,所以首先要從中央服務(wù)器那里得到最新的版本,然后開(kāi)始干活,干完活后,需要把自己做完的活推送到中央服務(wù)器。而且集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作的,一旦斷網(wǎng),所有人都干不成活了,可想而知,集中式版本控制系統(tǒng)的局限性有多大。
Git是目前世界上最流行的分布式版本控制系統(tǒng),它沒(méi)有中央處理器,每個(gè)人的電腦就是一個(gè)完整的版本庫(kù),這樣,工作的時(shí)候就不需要聯(lián)網(wǎng)了,因?yàn)榘姹径际窃谧约旱碾娔X上,隨時(shí)都可以將自己在工作區(qū)間做的修改提交到本地倉(cāng)庫(kù),最后將自己的本地版本倉(cāng)庫(kù)推動(dòng)到遠(yuǎn)程版本倉(cāng)庫(kù)進(jìn)行合并,效率可想而知是可控的賊高。
Git | SVN | |
---|---|---|
核心區(qū)別 | 分布式 | 集中式 |
存儲(chǔ)方式 | 按元數(shù)據(jù)方式存儲(chǔ) | 按文件方式存儲(chǔ) |
分支 | Git 必殺技能,將 Git 從版本控制系統(tǒng)的家族中區(qū)分出來(lái) | 版本控制系統(tǒng)中的另外一個(gè)目錄 |
全局版本號(hào) | Git 沒(méi)有(目前 Git 跟 SVN 缺少的最大特征) | SVN 有全局版本號(hào) |
內(nèi)容完整性 | Git 內(nèi)容存儲(chǔ)使用的是SHA-1哈希算法,確保代碼內(nèi)容的完整性,確保在遇到磁盤(pán)故障和網(wǎng)絡(luò)問(wèn)題時(shí)降低對(duì)版本庫(kù)的破壞 | 在這方面 SVN 性能是低于 Git |
安全性 | Git 每個(gè)分支都有一個(gè)完整的版本庫(kù),某個(gè)分支的電腦壞掉了,不要緊可以隨便從別人那里賦值一份就可了 | SVN 版本控制系統(tǒng)的中央服務(wù)器一旦掛掉,所有人 all 都么的活干了 |
版本控制系統(tǒng)
版本控制是管理信息修改的藝術(shù),他是一個(gè)開(kāi)發(fā)者最重要的工具之一,由于開(kāi)發(fā)者經(jīng)常性的修改代碼,如果不做出一定的版本控制僅靠注釋掉或者備份的形式進(jìn)行,那么在經(jīng)過(guò)一段時(shí)間后,先不說(shuō)是否能記住更改的地方,能不能還原到想要的版本都是非常困難的。想象一下,一個(gè)高達(dá)幾十上百人的開(kāi)發(fā)團(tuán)隊(duì)并行進(jìn)行工作,需要經(jīng)常性的同時(shí)處理同一個(gè)文件,如果沒(méi)有一定的版本控制機(jī)制,將會(huì)是怎樣的混亂情況。
軟件開(kāi)發(fā)工作往往是多人協(xié)同作業(yè),版本控制系統(tǒng)可以有效地解決版本的同步以及不同開(kāi)發(fā)者之間的開(kāi)發(fā)通信問(wèn)題,提高協(xié)同開(kāi)發(fā)的效率。并行開(kāi)發(fā)中最常見(jiàn)的不同版本軟件的錯(cuò)誤 (Bug) 修正問(wèn)題也可以通過(guò)版本控制中分支與合并的方法有效地解決。
版本控制優(yōu)點(diǎn)
在進(jìn)行軟件開(kāi)發(fā)時(shí)或者一些需要不斷迭代的文檔編寫(xiě)時(shí)出現(xiàn)下圖這種情況,不僅占用磁盤(pán)空間,而且難以進(jìn)行管理,很難知道每個(gè)版本進(jìn)行哪些修改,另外若是在關(guān)鍵時(shí)刻電腦突然死機(jī),這將是災(zāi)難性的,所以一個(gè)優(yōu)雅的備份方式很重要。
備份是一個(gè)版本控制系統(tǒng)(例如 Git)提供的非常好的附帶功能。每一個(gè)團(tuán)隊(duì)成員都會(huì)在他的本地有一個(gè)完整的項(xiàng)目副本,包括整個(gè)項(xiàng)目的歷史記錄。如果你所依賴(lài)的服務(wù)器宕機(jī)了,或者是你的存儲(chǔ)硬盤(pán)壞,所有你需要的恢復(fù)文件都可以在另外的團(tuán)隊(duì)成員的 Git 本地倉(cāng)庫(kù)中得到,版本控制系統(tǒng)還會(huì)對(duì)每個(gè)版本進(jìn)行一定的說(shuō)明(前提是提交者具有很好的提交習(xí)慣),可以根據(jù)提交說(shuō)明知道當(dāng)前版本較之前的版本有何更改,當(dāng)然他還提供對(duì)比功能,可以對(duì)文件進(jìn)行對(duì)比,更加清楚的知道修改的地方。
Git 下載安裝
當(dāng)前節(jié)引自于 Git 詳細(xì)安裝教程博客 : Git 詳細(xì)安裝教程
在使用Git前我們需要先安裝 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平臺(tái)上運(yùn)行。
本篇我們只介紹在 Windows 下安裝 Git,Git 各平臺(tái)安裝包下載地址為:http://git-scm.com/downloads
提示:記得開(kāi) VPN 加速器,否則下載速度實(shí)在太烏龜了。
選擇安裝組件
Check daily for Git for windows updates:是否每天檢查更新
Add a Git Bash Profile to Windows Terminal:在 windows 終端窗口 添加 Git Profile 配置信息
選擇開(kāi)始菜單文件夾
方框內(nèi) Git 可改為其他名字,也可點(diǎn)擊 “Browse…” 選擇其他文件夾或者給"Don’t create a Start Menu folder" 打勾不要文件夾,點(diǎn)擊 [next]。
選擇默認(rèn)的編輯器
Git 安裝程序里面內(nèi)置了 10 種編輯器供你挑選,比如 Atom、Notepad、Notepad++、Sublime Text、Visual Studio Code、Vim 等等,默認(rèn)的是 Vim ,選擇 Vim 后可以直接進(jìn)行到下一步,但是 Vim 是純命令行,操作有點(diǎn)難度,需要學(xué)習(xí)。如果選其他編輯器,則還需要去其官網(wǎng)安裝后才能進(jìn)行下一步。
設(shè)置初始化新項(xiàng)目(倉(cāng)庫(kù))的主干名字
第一種是讓 Git 自己選擇,名字是 master ,但是未來(lái)也有可能會(huì)改為其他名字;第二種是我們自行決定,默認(rèn)是 main,當(dāng)然,你也可以改為其他的名字。一般默認(rèn)第一種,點(diǎn)擊 [next] 到第七步。
注: 第二個(gè)選項(xiàng)下面有個(gè) NEW! ,說(shuō)很多團(tuán)隊(duì)已經(jīng)重命名他們的默認(rèn)主干名為 main . 這是因?yàn)?020 年非裔男子喬治·弗洛伊德因白人警察暴力執(zhí)法慘死而掀起的 Black Lives Matter(黑人的命也是命)運(yùn)動(dòng),很多人認(rèn)為 master 不尊重黑人,呼吁改為 main.
調(diào)整 path 環(huán)境變量
Use Git from Git Bash only
This is the most cautious choice as your PATH will not be modified at all. You w only be able to use the Git command line tools from Git Bash.
僅從 Git Bash 使用 Git
這是最謹(jǐn)慎的選擇,因?yàn)槟?PATH 根本不會(huì)被修改。您將只能使用 Git Bash 中的 Git 命令行工具。
Git from the command line and also from 3rd-party software
(Recommended) This option adds only some minimal Git wrappers to your PATH to avoid cluttering your environment with optional Unix tools.
You will be able to use Git from Git Bash, the Command Prompt and the Windov PowerShell as well as any third-party software looking for Git in PATH.
從命令行以及第三方軟件進(jìn)行 Git
(推薦)此選項(xiàng)僅將一些最小的 Git 包裝器添加到PATH中,以避免使用可選的 Unix 工具使環(huán)境混亂。
您將能夠使用 Git Bash 中的 Git,命令提示符和 Windov PowerShell 以及在 PATH 中尋找 Git 的任何第三方軟件。
Use Git and optional Unix tools from the Command Prompt
Both Git and the optional Unix tools will be added to your PATH.
Warning: This will override Windows tools like "find"and "sort". Only use this option if you understand the implications.
使用命令提示符中的 Git 和可選的 Unix 工具
Git 和可選的 Unix 工具都將添加到您的 PATH 中。
警告:這將覆蓋 Windows 工具,例如 "find" and "sort". 僅在了解其含義后使用此選項(xiàng)。
第一種是僅從 Git Bash 使用 Git。這個(gè)的意思就是你只能通過(guò) Git 安裝后的 Git Bash 來(lái)使用 Git ,其他的什么命令提示符啊等第三方軟件都不行。
第二種是從命令行以及第三方軟件進(jìn)行 Git。這個(gè)就是在第一種基礎(chǔ)上進(jìn)行第三方支持,你將能夠從 Git Bash,命令提示符(cmd) 和 Windows PowerShell 以及可以從 Windows 系統(tǒng)環(huán)境變量中尋找 Git 的任何第三方軟件中使用 Git。推薦使用這個(gè)。
第三種是從命令提示符使用 Git 和可選的 Unix 工具。選擇這種將覆蓋 Windows 工具,如 “ find 和 sort ”。只有在了解其含義后才使用此選項(xiàng)。一句話,適合比較懂的人折騰。
選擇 SSH 執(zhí)行文件
使用捆綁的 OpenSSH:這使用的 ssh.exe 是 Git 自帶的
選擇 HTTPS 后端傳輸
使用 OpenSSL 庫(kù) 服務(wù)器證書(shū)將使用 ca-bundle.crt 文件進(jìn)行驗(yàn)證。
配置行尾符號(hào)轉(zhuǎn)換
P1 簽出 Windows 樣式,提交 Unix 樣式的行結(jié)尾。
P2 按原樣簽出,提交Unix樣式的行結(jié)尾。
P3 按原樣簽出,按原樣提交。
配置終端模擬器和 Git Bash 使用
建議選擇第一種,MinTTY 3功能比 cmd 多,cmd 只不過(guò) 比 MinTTY 更適合處理 Windows 的一些接口問(wèn)題,這個(gè)對(duì) Git 用處不大,除此之外 Windows 的默認(rèn)控制臺(tái)窗口(cmd)有很多劣勢(shì),比如 cmd 具有非常有限的默認(rèn)歷史記錄回滾堆棧和糟糕的字體編碼等等。
相比之下,MinTTY 具有可調(diào)整大小的窗口和其他有用的可配置選項(xiàng),可以通過(guò)右鍵單擊的工具欄來(lái)打開(kāi)它們 git-bash 。
選擇默認(rèn)的 “git pull” 行為
git pull 就是獲取最新的遠(yuǎn)程倉(cāng)庫(kù)分支到本地,并與本地分支合并。
選擇憑證幫助程序
第一個(gè)選項(xiàng)是提供登錄憑證幫助的,Git 有時(shí)需要用戶的憑據(jù)才能執(zhí)行操作;例如,可能需要輸入用戶名和密碼才能通過(guò) HTTP 訪問(wèn)遠(yuǎn)程存儲(chǔ)庫(kù)(GitHub,GItLab 等等)。
配置額外選項(xiàng)
啟用文件系統(tǒng)緩存就是將批量讀取文件系統(tǒng)數(shù)據(jù)并將其緩存在內(nèi)存中以進(jìn)行某些操作,可以顯著提升性能。這個(gè)選項(xiàng)默認(rèn)開(kāi)啟。
啟用符號(hào)鏈接 ,符號(hào)鏈接是一類(lèi)特殊的文件, 其包含有一條以絕對(duì)路徑或者相對(duì)路徑的形式指向其它文件或者目錄的引用,類(lèi)似于 Windows 的快捷方式,不完全等同 類(lèi)Unix(如 Linux) 下的 符號(hào)鏈接。因?yàn)樵摴δ艿闹С中枰恍l件,所以默認(rèn)不開(kāi)啟。
配置實(shí)驗(yàn)性選項(xiàng)
這是實(shí)驗(yàn)性功能,可能會(huì)有一些小錯(cuò)誤之類(lèi)的,建議不用開(kāi)啟。
開(kāi)始安裝 Git
安裝成功 Git
Git Bash、Git CMD、Git FAQs、Git GUI、Git Release Note
使用 Git Bash
Git Bash 是基于CMD的,在CMD的基礎(chǔ)上增添一些新的命令與功能,平時(shí)主要用這個(gè),功能很豐富。
Git Bash 常用命令
命令 | 說(shuō)明 |
---|---|
git init | 初始化 git,只有初始化了以后才可以使用 git 相關(guān)命令。 |
git clone | 獲取遠(yuǎn)程項(xiàng)目,并下載到本地。遠(yuǎn)程庫(kù)的地址在 GITHUB 項(xiàng)目中會(huì)有提供。 |
git status | 查看本地修改與服務(wù)器的差異。 |
git add | 將這些差異文件添加,這樣就可以提交了。 |
git commit –m | “這里是注釋” 提交更改到服務(wù)器。 |
git checkout master | 更改到 master 庫(kù)。 |
git pull | 將服務(wù)器最新的更改獲取到本地。 |
git merge local master | 將本地的 local 合并到遠(yuǎn)程的 master 上。 |
git push origin master | 正式提交到遠(yuǎn)程的 master 服務(wù)器上。 |
初始化 Git
Administrator@DESKTOP-AIMG6N1 MINGW64 ~
$ git init
Initialized empty Git repository in C:/Users/Administrator/.git/
獲取 SSH 密鑰
一路Enter(確認(rèn))就可以了
$ ssh-keygen -t rsa -C xxxxxx@qq.com
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
Created directory '/c/Users/Administrator/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:+f8H6EU5Je+ZNdrhUwOk2YsZjq+SpcUENDm1oKSyeLs xxxxxx@qq.com
The key's randomart image is:
+---[RSA 3072]----+
| ..+o. .. |
| o .+o . +.. .|
| . . . o. + ..= |
|. o oo + =++|
|... S. + ++oO|
| . . =. ..o*.|
| . = .o . ..|
| . + ... .|
| E .. .... |
+----[SHA256]-----+
報(bào)錯(cuò)解決: https://blog.csdn.net/weixin_43888891/article/details/112429980
綁定ssh密鑰
現(xiàn)在你就需要登錄到你的 GitHub 上邊添加這個(gè)密匙
Setting SSH 鏈接地址:https://github.com/settings/ssh/new
將整個(gè)id_rsa.pub內(nèi)容復(fù)制,添加成功結(jié)果如下:
然后回到 Git bash 輸入:ssh -T git@github.com
來(lái)檢查是否成功綁定。如果輸入之后選擇 yes 出來(lái)是這樣說(shuō)明就成功了。
Administrator@DESKTOP-AIMG6N1 MINGW64 ~ (master)
$ ssh -T git@github.com
Hi wristwaking! You've successfully authenticated, but GitHub does not provide shell access.
其他設(shè)置
接下來(lái)還需要簡(jiǎn)單的設(shè)置一些東西
git config --global user.name “git賬號(hào)”
git config --global user.email “git郵箱,注冊(cè)時(shí)候的郵箱”
通過(guò)以上命令基本可以完成賬號(hào)的設(shè)置。但是–global代表什么意思?
git config --local 倉(cāng)庫(kù)級(jí)別的設(shè)置,該設(shè)置只對(duì)當(dāng)前倉(cāng)庫(kù)適用
git config --global 設(shè)置當(dāng)前用戶下的全局用戶名
git config --system 設(shè)置系統(tǒng)級(jí)的用戶名,對(duì)所有用戶適用
代碼克隆 clone
下面就要將你的庫(kù)克隆下來(lái)到本地電腦中,方便以后進(jìn)行上傳代碼。在庫(kù)創(chuàng)建完成之后 會(huì)有一個(gè)網(wǎng)址出現(xiàn)在網(wǎng)頁(yè)中,這個(gè)地址就是代碼地址。git clone
命令會(huì)用的到。
接下來(lái)就開(kāi)始選擇文件存儲(chǔ)地方了。
git clone 地址(這個(gè)地址就是剛剛創(chuàng)建的庫(kù)那個(gè)頁(yè)面上代碼地址)
Administrator@DESKTOP-AIMG6N1 MINGW64 ~/Desktop/HackerWaking/csdn (master)
$ git clone git@github.com:wristwaking/csdn.git
Cloning into 'csdn'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
注意:在執(zhí)行命令過(guò)程有時(shí)候會(huì)讓你輸入賬號(hào)密碼啥的,這個(gè)不要輸錯(cuò)了就行!
測(cè)試提交文件
打開(kāi)本機(jī)剛才創(chuàng)建文件夾的目錄,然后在其中創(chuàng)建一個(gè)任意格式,任意名稱(chēng)的文件。
然后在這個(gè)文件里面右鍵 git bash 進(jìn)黑框框
git add我們新增的文件
git add . (注意 add 與 ‘.’ 之間有一個(gè)空格,此處為添加當(dāng)前文件夾的全部?jī)?nèi)容)
git add xxx (此處為添加當(dāng)前文件下名為 xxx 的文件)
Administrator@DESKTOP-AIMG6N1 MINGW64 ~/Desktop/HackerWaking/csdn/csdn (main)
$ git add project.py
之后輸入然后 git commit -m “備注”
引號(hào)內(nèi)的內(nèi)容可以隨意改動(dòng),這個(gè)語(yǔ)句的意思是 給你剛剛上傳的文件一個(gè)備注,方便查找記憶而已。
$ git commit -m "first test"
[main 514d27d] first test
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 project.py
然后在輸入git push origin master
$ git push origin master
error: src refspec master does not match any
error: failed to push some refs to 'github.com:wristwaking/csdn.git'
問(wèn)題的內(nèi)容是:就是倉(cāng)庫(kù)為空
錯(cuò)誤:SRC ReFSPEC主控器不匹配任何。
錯(cuò)誤:未能將某些引用推到'github.com:wristwaking/csdn.git’
這邊的原因:這邊的主分支是 main,不是 master
解決方案:直接 git push origin main
$ git push origin main
branch 分支
Git 分支是指在版本控制系統(tǒng) Git 中,用于并行開(kāi)發(fā)和管理代碼的一種功能。在 Git 中,每個(gè)分支都相當(dāng)于一個(gè)獨(dú)立的開(kāi)發(fā)線,可以在不影響主線開(kāi)發(fā)的情況下進(jìn)行代碼的修改和提交。
通過(guò)創(chuàng)建分支,可以在不影響主分支的情況下,開(kāi)展新功能的開(kāi)發(fā)、修復(fù)bug以及進(jìn)行實(shí)驗(yàn)性的改動(dòng)。在每個(gè)分支上可以進(jìn)行獨(dú)立的提交和合并操作,這樣可以避免多人同時(shí)對(duì)同一份代碼進(jìn)行修改引發(fā)的沖突問(wèn)題。
常見(jiàn)的 Git 分支有主分支(通常是 master 或 main)和特性分支。主分支用于穩(wěn)定的發(fā)布版本,特性分支則用于開(kāi)發(fā)新功能或修復(fù) bug。分支間可以進(jìn)行合并(merge)操作,將特性分支的修改合并到主分支中。
Git分支的使用可以提高多人協(xié)作開(kāi)發(fā)的效率,并且有助于保留開(kāi)發(fā)歷史和追蹤代碼變更。
查看 branch 分支
使用如下的命令,可以查看當(dāng)前Git倉(cāng)庫(kù)中所有的分支列表:
Administrator@DESKTOP-AIMG6N1 MINGW64 ~/Desktop/HackerWaking/csdn/csdn (main)
$ git branch
* main ## 注意:分支前面的*表示當(dāng)前所處的分支
創(chuàng)建 branch 分支
使用如下的命令,可以基于當(dāng)前分支,創(chuàng)建一個(gè)新的分支,此時(shí),新分支中的代碼和當(dāng)前分支完全一樣:(所以開(kāi)發(fā)時(shí)我們需要在主分支上創(chuàng)建新分支)
git branch 分支名稱(chēng)
切換 branch 分支
使用如下的命令,可以切換到指定的分支上進(jìn)行開(kāi)發(fā):
git checkout 分支名稱(chēng)
## -b 表示創(chuàng)建一個(gè)新分支
## checkout表示切換到剛才新建的分支上
git checkout -b 分支名稱(chēng)
刪除 branch 分支
當(dāng)把功能分支的代碼合并到 master 主分支上以后,就可以使用如下的命令,刪除對(duì)應(yīng)的功能分支:
git branch -d 分支名稱(chēng)
合并 branch 分支
功能分支的代碼開(kāi)發(fā)測(cè)試完畢之后,可以使用如下的命令,將完成后的代碼合并到 master主分支上:
1 切換到 master 分支
2 git checkout master
3 在 master 分支上運(yùn)行 git merge 命令,將要合并分支的代碼合并到 master分支
4 git merge 分支名稱(chēng)
將本地分支推送到遠(yuǎn)程倉(cāng)庫(kù)
如果是第一次將本地分支推送到遠(yuǎn)程倉(cāng)庫(kù),需要運(yùn)行如下的命令:
# -u表示把本地分支和遠(yuǎn)程分支進(jìn)行關(guān)聯(lián),只在第一次推送的時(shí)候需要帶-u 參數(shù)
git push -u 遠(yuǎn)程倉(cāng)庫(kù)的別名 本地分支名稱(chēng):遠(yuǎn)程分支名稱(chēng)
# 實(shí)際案例:
git push -u origin payment: pay
# 如果希望遠(yuǎn)程分支的名稱(chēng)和本地分支名稱(chēng)保持一致,可以對(duì)命令進(jìn)行簡(jiǎn)化:
git push -u origin payment
Github 注冊(cè)
相對(duì)來(lái)說(shuō)注冊(cè)還是很簡(jiǎn)單的,只需要一個(gè)郵箱即可,郵箱寫(xiě)qq郵箱就行了,假如以后忘記密碼了,是可以靠郵箱來(lái)找回密碼的。
Github 官方登錄頁(yè): https://github.com/login
官網(wǎng)全是英文的,目前的話,暫未發(fā)現(xiàn)有中文版的,對(duì)于英語(yǔ)不好的同學(xué)建議使用谷歌瀏覽器,谷歌瀏覽器可以翻譯網(wǎng)頁(yè)變?yōu)橹形氖褂闷饋?lái)十分方便。
創(chuàng)建新的庫(kù) create a new repository
這里無(wú)非需要注意的就是庫(kù)分為兩種,分為了公有的私有的,上面解釋的很清楚了,大家自行選擇即可。
創(chuàng)建完成
在創(chuàng)建完成自己的庫(kù)之后,下面就要讓自己的電腦克隆一個(gè)自己所創(chuàng)建的庫(kù),方面自己電腦上的代碼同步到GitHub你所創(chuàng)建的庫(kù)當(dāng)中。為了實(shí)現(xiàn),就需要安裝一個(gè)軟件,Git Bash。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-700318.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-700318.html
到了這里,關(guān)于2023 最新 Git 分布式版本控制系統(tǒng)介紹和下載安裝使用教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!