如何進階成公司 Git 小能手

2023-01-24 11:31:31 字數 4564 閱讀 1666

目錄git 關於暫存的問題

git 分支相關問題

git 使用者名稱密碼郵箱相關問題

git 提交規範

git 命令對於程式設計師的你來說再熟悉不過,但是發現好多小夥伴都是會一些基本的提交流程,當遇到問題的時,查到的命令還不敢用,總是請教組裡那幾個精通 git 的小夥伴。本文對 git 使用過程中常出現的問題進行總結並且對 git 的一些誤區概念說明了一些,看完後記得自己嘗試下,希望你也能成為組裡被請教的那 個 git 小能手。

圖中的幾個專用名詞解釋:

情況一:最近一次 commit 的**有問題怎麼辦?

這時候可能有小夥伴說直接修改再提交一次不就好了,這裡說一下優雅的方式,不進行再一次提交,修改這次提交。

git add 我是修改內容.txt

git commit --amend

【amend】修正,會對最新一條 commit 進行修正,會把當前 commit 裡的內容和暫存區(stageing area)裡的內容合併起來後建立一個新的 commit,用這個新的 commit 把當前 commit 替換掉。

輸入上面的命令後,git 會進入提交資訊編輯介面,然後你可以刪除之前的 changeid,並且修改或者保留之前的提交資訊,:wq 儲存按下回車後,你的 commit 就被更新了。

對於 amend 還可能出現幾種小問題,下面列舉下:

git commit --amend -m "新的提交資訊"
git  commit -m "提交資訊"
另一中方式,使用--no-edit,它表示提交資訊不會更改,在 git 上僅為一次提交。

git add changgefile // changefile 剛剛漏了提交的檔案

git commit --amend --no-edit

上面說的是最新一次的提交出了問題,接下來說之前提交的**發現有問題了想修改,應該怎麼辦?需要一個新的命令:

git rebase -i
rebase -i 是 rebase --interactive 的縮寫形式,意為「互動式 rebase」。所謂「互動式 rebase」,就是在 rebase 的操作執行之前,你可以指定要 rebase 的 commit 鏈中的每一個 commit 是否需要進一步修改。

注意點:看 commit 歷史的時候,最新的提交在最下面,剛開始使用時候總是搞錯。

輸入上面的命令後,會進入下面的編輯介面。

根據編輯介面中的提示,我們把要修改的倒數第二個 commit,也就是上面的【修改**格式首行縮排】前面 pick 指令改為 edit。edit的意思編輯器中已給瞭解釋,應用這個commit,但是停下來修正。改完之後,esc退出,:wq 儲存。

會顯示如下資訊。

這個rebase過程已經停在倒數第二個 commit 的位置了,修改完成你要修改的內容,再次提交。

git add .

git commit --amend

然後繼續 rebase 過程,使用 rebase --continue 來繼續 rebase 過程,把後面的 commit 直接應用上去。

git rabase --continue
另外在使用git rebase -i 的時候,裡面帶了不同的指令,都可以對已有的提交進行一些操作,比如 squash 對多個 commit 合併成一個 commit。

情況三:剛剛寫完的提交太爛了,不想改了,想直接丟棄怎麼辦?

你可以用 reset --hard 來撤銷 commit

git reset --hard head^
head 表示 head^ 往回數一個位置的 commit ,head^ 表示你要恢復到哪個 commit。因為你要撤銷最新的一個 commit,所以你需要恢復到它的父 commit ,也就是 head^。那麼在這行之後,你的最新一條就被撤銷了。

情況一:如果出錯內容還在私有分支

這種情況你修改後,再次提交會報錯,由於你在本地對已有的 commit 做了修改,這時你再 push 就會失敗,因為**倉庫包含本地沒有的 commits。這種情況只在你自己的分支 branch1 ,可以使用強制 push 的方式解決衝突。

git push origin branch1 -f
-f 是 --force 的縮寫,意為「忽略衝突,強制 push」

情況2:如果出錯內容已經 push 到了 master 分支

這種情況可以使用 git 的 revert 指令。

git revert head^
上面這行**就會增加一條新的 commit,它的內容和倒數第二個 commit 是相反的,從而和倒數第二個 commit 相互抵消,達到撤銷的效果。

在 revert 完成之後,把新的 commit 再 push 上去,這個 commit 的內容就被撤銷了。

revert 與前面說的 reset 最主要的區別是,這次改動只是被「反轉」了,並沒有在歷史中消失掉,你的歷史中會存在兩條 commit :一個原始 commit ,一個對它的反轉 commit。

假如正在開發手中需求的時候,突然來了個緊急 bug 要修復,這時候需要先 stash 已經寫的部分**,使自己返回到上一個 commit 改完 bug 之後從快取棧中推出之前的**,繼續工作。

注意:沒有被 track 的檔案(即從來沒有被 add 過的檔案不會被 stash 起來,因為 git 會忽略它們。如果想把這些檔案也一起 stash,可以加上 -u 引數,它是 --include-untracked 的簡寫。就像這樣:git stash -u

分支中的常用命令:

檢視當前分支:git branch

檢視遠端分支:git branch -a

建立並切換分支:git checkout -b add_orderdesc

切換分支:git checkout 分支名稱

檢視當前的本地分支與遠端分支的關聯關係:git branch -vv

合併當前分支**到master:

問題一:我想把本地建立的一個分支 koalanode提交到遠端,並且遠端分支名稱要求 nodescript,且還未建立,需要怎能做?

1、我先在遠端建了一個分支 nodescript,我本地也有這麼一個分支,名字和遠端的分支名稱還不一樣。首先,我把我本地的分支名稱修改成和遠端分支相同。

2、將本地新建分支 push 到自己的本地遠端 origin 上,因為只在本地建立了一個新的分支,遠端origin 上還沒有該分支

git push origin nodescript
3、把本地分支與遠端 origin 的分支進行關聯處理(通過 --set-upstream-to 命令)

git branch --set-upstream-to=origin/add_orderdesc
4、再次通過git branch -vv檢視分支的關聯關係,可見本地分支已於 origin 的分支建立上了關聯關係,之後我們每次 push 或者 pull 的時候,只需要輸入git push 或者git pull

公司倉庫有賬號密碼,自己的github有賬戶密碼,兩個不同賬戶,有一次提交發現自己倉庫的郵箱提交成了公司倉庫設定的郵箱,有點尷尬,為什麼會出現這種問題呢?

首先這個你在剛開始安裝一趟的時候應該就用過:

// 設定檢視 git 使用者名稱和郵箱

git config user.name --檢視git當前配置使用者名稱

git config user.email --檢視git當前配置的郵箱

git config user.name 名稱 設定使用者名稱

git config user.email 郵箱 設定git郵箱

全域性命令設定

git config  --global user.name 你的目標使用者名稱;

git config --global user.email 你的目標郵箱名;

在專案中也可以檢視這些資訊

vi ~/.gitconfig;
知道了這些配置修改之後,你可以選擇全域性配置下,在公司電腦,或者提交前自己看下,就不會再出現上面的尷尬問題