說明
???? 時間過得真快,一轉眼嗎嘍也是好歹工作幾年了,把這些年平時用的git命令整理記錄一下,分幾個文章,囊括了常用的命令,工作日常很多時候都是使用svn,回到宿舍自己的項目才是git,就問你離不離譜。。
好習慣
???? 首先在提交代碼的時候,任何提交注釋都得標準化,格式統一,這樣別人才看的賞心悅目,下面格式提交說明:
1、feat:???????? 新功能(feature)用于提交新功能。例如:feat: 增加用戶注冊功能
2、fix:?? ? ? ? ? 修復 bug用于提交 bug 修復。例如:fix: 修復登錄頁面崩潰的問題
3、refactor:? 代碼重構(既不是新增功能也不是修復bug的代碼更改)用于提交代碼重構。
???????????????????? 例如:refactor: 重構用戶驗證邏輯
4、perf:??????? 性能優化用于提交提升性能的代碼修改。例如:perf: 優化圖片加載速度
5、chore:???? 雜項(構建過程或輔助工具的變動)用于提交構建過程、輔助工具等相關的內
????????????????? ?? 容修改。例如:chore: 更新依賴庫
6、build:?? ? ? 構建系統或外部依賴項的變更用于提交影響構建系統的更改。例如:build: 升級
???????????????? ? ? webpack到版本5
7、ci:??????? ?? 持續集成配置的變更用于提交CI配置文件和腳本的修改。例如:ci: 修改GitHub
????????????????? ?? Actions配置文件
8、revert:? ?? 回滾用于提交回滾之前的提交.
另外還有其他三個相對來說不太常用的:
1、docs: 文檔變更用于提交僅文檔相關的修改。例如:docs: 更新README文件
2、style: 代碼風格變動(不影響代碼邏輯)用于提交僅格式化、標點符號、空白等不影響代碼運行的變更。例如:style: 刪除多余的空行
3、test: 添加或修改測試用于提交測試相關的內容。例如:test: 增加用戶模塊的單元測試
命令
目錄
說明
好習慣
命令
?項目初次運行的配置
記錄每次更新到倉庫
初始化一個倉庫
從第三方平臺克隆倉庫
跟蹤新文件
查看文件狀態
文件具體修改
創建提交
移除文件
指向正確的遠程倉庫地址
遠程分支管理
當前所在分支與遠程分支對應
更新同步最新提交
合并提交
移除文件
查看提交歷史
撤銷操作
取消暫存的文件
恢復到上次提交的內容
單獨撤銷某個文件變動至上次
從遠程倉庫中獲得數據
?項目初次運行的配置
?? 項目初次運行的時候,得檢查config配置,看看配置變量啥的,設置一下user.name和user.email
,1和2都差不多,一個是長選項,一個是短選項,都得掌握
git config --list --show-origin
git config -l
git config --global
git config user.name
git config --global user.name "xxxxxx"
記錄每次更新到倉庫
?? 暫存區和非暫存區,已跟蹤和未跟蹤文件狀態時序圖
初始化一個倉庫
配置并初始化一個倉庫(repository)、開始或停止跟蹤(track)文件、暫存(stage)或提交(commit)更改,創建一個名為 .git
的子目錄,這個子目錄含有初始化的 Git 倉庫中所有的必須文件,這些文件是 Git 倉庫的骨干
git init
從第三方平臺克隆倉庫
??????? 基礎就是git clone 加上克隆git地址
git clone https://github.com/libgit2/libgit2 mylibgit
?????? 如果要克隆指定分支的話, 帶上 -b
git clone -b uniapp_branch https://gitee.com/charlinheng/github_share.git
跟蹤新文件
????????要將你改或者新添加的文件保存在暫存區,那你得標記這個文件,跟蹤這個文件
# 添加一個
git add README.md
??????? 要添加多個,則
git add README.md README2.md
??????? 添加所有
git add .
??? 要查看是否已經被跟蹤,處于暫存狀態,你可以用git status
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: README
???? 只要在 Changes to be committed
這行下面的,就說明是已暫存狀態。 如果此時提交,那么該文件在你運行 git add
時的版本將被留存在后續的歷史記錄中。 你可能會想起之前使用 git init
后就運行了 git add <files>
命令,開始跟蹤當前目錄下的文件。 git add
命令使用文件或目錄的路徑作為參數;如果參數是目錄的路徑,該命令將遞歸地跟蹤該目錄下的所有文件。
注意,如果你不想使用git add . 可以直接使用git commit -a
查看文件狀態
可以用 git status
命令查看哪些文件處于什么狀態。 如果在克隆倉庫后立即使用此命令,會看到類似這樣的輸出:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
git status
命令的輸出十分詳細,但其用語有些繁瑣。 Git 有一個選項可以幫你縮短狀態命令的輸出,這樣可以以簡潔的方式查看更改。 如果你使用 git status -s
命令或 git status --short
命令,你將得到一種格式更為緊湊的輸出。
$ git status -sM README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
新添加的未跟蹤文件前面有
??
標記,新添加到暫存區中的文件前面有
A
標記,修改過的文件前面有
M
標記。
文件具體修改
如果 git status
命令的輸出對于你來說過于簡略,而你想知道具體修改了什么地方,可以用 git diff
命令,但是此命令比較的是工作目錄中當前文件和暫存區域快照之間的差異。 也就是修改之后還沒有暫存起來的變化內容。
git diff [filename?]
若要查看已暫存的將要添加到下次提交里的內容,
可以用 git diff --staged 命令。 這條命令將比對已暫存文件與最后一次提交的文件差異:
git diff --staged
這里要說一下,使用git自帶的烏龜命令行工具看對比的時候,要怎么退出,使用q鍵退出:在git diff中,按下鍵盤上的”q”鍵即可退出
請注意,git diff 本身只顯示尚未暫存的改動,而不是自上次提交以來所做的所有改動。 所以有時候你一下子暫存了所有更新過的文件,運行 git diff 后卻什么也沒有,就是這個原因。
git diff --cached
git diff --cached
查看已經暫存起來的變化( --staged
和 --cached
是同義詞):
創建提交
這個命令執行后會反饋當前是在哪個分支(master
)提交的,本次提交的完整 SHA-1 校驗和是什么(463dc4f
),以及在本次提交中,有多少文件修訂過,多少行添加和刪改過,提交時記錄的是放在暫存區域的快照。 任何還未暫存文件的仍然保持已修改狀態,可以在下次提交時納入版本管理。 每一次運行提交操作,都是對你項目作一次快照,以后可以回到這個狀態,或者進行比較。
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks1 file changed, 5 insertions(+), 0 deletions(-)
普通方式,使用 -m 添加注釋
git commit -m
跳過使用暫存區域
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified: CONTRIBUTING.mdno changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks1 file changed, 5 insertions(+), 0 deletions(-)
移除文件
要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(確切地說,是從暫存區域移除),然后提交。
?可以用 git rm
命令完成此項工作,并連帶從工作目錄中刪除指定的文件,這樣以后就不會出現在未跟蹤文件清單中了。
如果只是簡單地從工作目錄中手工刪除文件,運行 git status
時就會在 “Changes not staged for commit” 部分(也就是 未暫存清單)看到:
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/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: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
如果要刪除之前修改過或已經放到暫存區的文件,則必須使用強制刪除選項 -f
(譯注:即 force 的首字母)。 這是一種安全特性,用于防止誤刪尚未添加到快照的數據,這樣的數據不能被 Git 恢復。
如果要刪除之前修改過或已經放到暫存區的文件,則必須使用強制刪除選項
-f
(譯注:即 force 的首字母)。 這是一種安全特性,用于防止誤刪尚未添加到快照的數據,這樣的數據不能被 Git 恢復。
git rm -f
另外一種情況是,我們想把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。 換句話說,你想讓文件保留在磁盤,但是并不想讓 Git 繼續跟蹤。 當你忘記添加 .gitignore
文件,不小心把一個很大的日志文件或一堆 .a
這樣的編譯生成文件添加到暫存區時,這一做法尤其有用。 為達到這一目的,使用 --cached
選項:
就是刪除所有,而且在本地不刪除,保留,就是不要讓git追蹤
$ git rm --cached READMEgit rm 命令后面可以列出文件或者目錄的名字,也可以使用 glob 模式。比如:
$ git rm log/\*.log
注意到星號 * 之前的反斜杠 \, 因為 Git 有它自己的文件模式擴展匹配方式,所以我們不用 shell 來幫忙展開。 此命令刪除 log/ 目錄下擴展名為 .log 的所有文件。 類似的比如:git rm \*~
該命令會刪除所有名字以 ~ 結尾的文件。
指向正確的遠程倉庫地址
確保 origin
指向正確的遠程倉庫地址。你可以用以下命令查看配置:
git remote -v
如果 origin
的 URL 有問題,可以使用下面的命令重新設置:
git remote set-url origin <remote-repository-url>
- 操作類型:
(fetch)
表示當你從遠程倉庫拉取(git fetch
)時會用到這個 URL。(push)
表示當你推送(git push
)到遠程倉庫時會用到這個 URL。
如果你本地看不到遠程分支,用這個更新
git remote add origin
遠程分支管理
確保你要推送的分支存在。如果遠程倉庫中沒有 master
分支,可能需要推送到 main
或其他分支。你可以用以下命令查看遠程分支:
-
git branch:用于查看本地倉庫中的所有分支。執行該命令會顯示一個列表,其中包含當前所有的分支,并且當前所在的分支會用"*"表示。
-
git branch -a:a = all,用于查看本地倉庫和遠程倉庫中的所有分支。執行該命令會顯示一個列表,其中包含本地所有的分支和遠程所有的分支,并且當前所在的分支會用"*"表示。
-
git branch -r:r = remote用于查看遠程倉庫中的所有分支。執行該命令會顯示一個列表,其中包含遠程所有的分支。
git remote add uniapp_branch https://gitee.com/charlinheng/github_share.git
命令 git branch -r
用于列出 遠程分支,也就是說,它顯示的是與遠程倉庫關聯的分支信息。
當前所在分支與遠程分支對應
確保你當前所在的分支與遠程倉庫的分支對應,或者切換到正確的分支:
git checkout <branch-name>
更新同步最新提交
git pull
#如果兩個分支的歷史記錄沒有共同的祖先,仍然進行合并。在正常情況下,Git 會拒絕合并兩個沒有公共祖先的分支,以避免潛在的沖突或問題。使用--allow-unrelated-histories這個選項可以強制 Git 進行合并,通常用在你正在合并兩個完全不同歷史的倉庫或分支時。
git pull master master --allow-unrelated-histories
合并提交
git merge
?#將兩個分支的更改合并在一起。它會將另一個分支的所有更改整合到當前分支,--allow-unrelated-histories
:這個選項告訴 Git 即使這兩個分支的歷史沒有共同的祖先,也要強制進行合并。在沒有這個選項的情況下,Git 會阻止合并兩個完全沒有共同歷史的分支,以避免潛在的沖突或不一致性。
git merge master master --allow-unrelated-histories
移除文件
不像其它的 VCS 系統,Git 并不顯式跟蹤文件移動操作。 如果在 Git 中重命名了某個文件,倉庫中存儲的元數據并不會體現出這是一次改名操作。?
$ git mv file_from file_to
其實,運行 git mv
就相當于運行了下面三條命令:
$ mv README.md README
$ git rm README.md
$ git add README
。不過在使用其他工具重命名文件時,記得在提交前 git rm
刪除舊文件名,再 git add
添加新文件名。
查看提交歷史
$ git log
不傳入任何參數的默認情況下,git log
會按時間先后順序列出所有的提交,最近的更新排在最上面。
git log -p
其中一個比較有用的選項是 -p
或 --patch
,它會顯示每次提交所引入的差異(按 補丁 的格式輸出)。 你也可以限制顯示的日志條目數量,例如使用 -2
選項來只顯示最近的兩次提交:
git log --stat
你也可以為 git log
附帶一系列的總結性選項。 比如你想看到每次提交的簡略統計信息,可以使用 --stat
選項:
git log --pretty oneline|fuller
這個選項可以使用不同于默認格式的方式展示提交歷史。
常用的就是oneline | fuller
git log --pretty=format
最有意思的是 format
,可以定制記錄的顯示格式。 這樣的輸出對后期提取分析格外有用——因為你知道輸出的格式不會隨著 Git 的更新而發生改變:
git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
git log --pretty=format 常用的選項 列出了 format
接受的常用格式占位符的寫法及其代表的意義。?
選項 | 說明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的簡寫哈希值 |
%T | 樹的完整哈希值 |
%t | 樹的簡寫哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的簡寫哈希值 |
%an | 作者名字 |
%ae | 作者的電子郵件地址 |
%ad | 作者修訂日期(可以用 --date=選項 來定制格式) |
%ar | 作者修訂日期,按多久以前的方式顯示 |
%cn | 提交者的名字 |
%ce | 提交者的電子郵件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多長時間) |
%s | 提交說明 |
git log --graph
這種為展示圖表模式
commit b9dd7ef50ea004ffd22cc228089cb05d05164971
| Author: hecheng <144***0705@qq.com>
| Date: Thu Nov 28 15:16:46 2024 +0800
|
| remove com name from class info
|
* commit 601e09de5318c38ff7189065eebb8b601146566c
|\ Merge: 67daed7 0a08959
| | Author: hecheng <144***0705@qq.com>
| | Date: Thu Nov 28 15:08:20 2024 +0800
| |
| | solve merge
| |
| * commit 0a08959307cb241af9dc2a18432c4489b5975cc4
| | Author: CharLinHeng <144***0705@qq.com>
| | Date: Mon Nov 25 07:33:07 2024 +0000
| |
| | add LICENSE.
| |
| | Signed-off-by: CharLinHeng <144***0705@qq.com>
| |
| * commit 2aa519dd1a4f4d41eef9e72d815b389cfe1da027 (master/develop)
| Author: CharLinHeng <144***0705@qq.com>
| Date: Mon Nov 25 07:32:42 2024 +0000
|
| Initial commit
|
* commit 67daed7ab58ac71a5fc01e098f01dd00d0640d51
| Author: hecheng <144***0705@qq.com>
| Date: Thu Nov 28 15:01:43 2024 +0800
|
| test upload
|
撤銷操作
在任何一個階段,你都有可能想要撤消某些操作。 這里,我們將會學習幾個撤消你所做修改的基本工具。 注意,有些撤消操作是不可逆的。 這是在使用 Git 的過程中,會因為操作失誤而導致之前的工作丟失的少有的幾個地方之一。
git commit --amend
有時候我們提交完了才發現漏掉了幾個文件沒有添加,或者提交信息寫錯了。 此時,可以運行帶有 --amend
選項的提交命令來重新提交:
例如,你提交后發現忘記了暫存某些需要的修改,可以像下面這樣操作:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
-- 修正的意思
最終你只會有一個提交——第二次提交將代替第一次提交的結果。
Note | 當你在修補最后的提交時,與其說是修復舊提交,倒不如說是完全用一個 新的提交 替換舊的提交, 理解這一點非常重要。從效果上來說,就像是舊有的提交從未存在過一樣,它并不會出現在倉庫的歷史中。 修補提交最明顯的價值是可以稍微改進你最后的提交,而不會讓“啊,忘了添加一個文件”或者 “小修補,修正筆誤”這種提交信息弄亂你的倉庫歷史。 |
取消暫存的文件
git reset HEAD^ <file-name>
你commmit 了,但是想取消,就用這個,取消單個文件
git reset --hard
丟棄所有未提交的修改,還原最新代碼
恢復到上次提交的內容
git stash
通過git stash ---- 通常用這種方法
git stash
git pull
git stash pop
通過git stash將工作區恢復到上次提交的內容,同時備份本地所做的修改,之后就可以正常git pull了,git pull完成后,執行git stash pop將之前本地做的修改應用到當前工作區。
git stash: 備份當前的工作區的內容,從最近的一次提交中讀取相關內容,讓工作區保證和上次提交的內容一致。同時,將當前的工作區內容保存到Git棧中。
git stash pop: 從Git棧中讀取最近一次保存的內容,恢復工作區的相關內容。由于可能存在多個Stash的內容,所以用棧來管理,pop會從最近的一個stash中讀取內容并恢復。
git stash list: 顯示Git棧內的所有備份,可以利用這個列表來決定從那個地方恢復。
git stash clear: 清空Git棧。此時使用gitg等圖形化工具會發現,原來stash的哪些節點都消失了。
3-2、放棄本地修改的改法
這種方法會丟棄本地修改的代碼,而且不可找回,通常不建議使用這種方式。
?
單獨撤銷某個文件變動至上次
單獨撤銷某個文件的變動,回到上次
git restore xxxx.js
這個跟stash差不多,stash是回滾所有到上次
stash是所有文件
restore是單個文件
從遠程倉庫中獲得數據
git fetch
例子如下: ??????