手把手教你如何進階成公司 Git 小能手(常見問題總結)


手把手教你如何進階成公司 Git 小能手(常見問題總結)

作者: koalaCoding 程序員成長指北

轉發鏈接:https://mp.weixin.qq.com/s/t88cQv7IPgZr4PANpSpssg

前言

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

更多的Git學習相關文章,請見文章底部

Git 經典圖

手把手教你如何進階成公司 Git 小能手(常見問題總結)

<code>一張經典的 Git 流程圖(來源阮一峰老師的博客)/<code>

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

  1. Workspace: 工作區
  2. Index / Stage: 暫存區
  3. Repository: 本地倉庫
  4. Remote: 遠程倉庫

git 提交可能遇到的一些問題

git 提交到本地倉庫有問題怎麼辦?

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

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

<code>git add 我是修改內容.txt
git commit --amend/<code>

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

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

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

剛剛寫的提交信息有問題,想修改怎麼辦?

<code>git commit --amend -m "新的提交信息"/<code>

剛剛提交完代碼發現,我有個文件沒保存,漏了提交上去怎麼辦?

最簡單的方式,再次 commit:

<code>git  commit -m "提交信息"/<code>

另一種方式,使用--no-edit,它表示提交信息不會更改,在 git 上僅為一次提交。

<code>git add changgeFile // changeFile 剛剛漏了提交的文件
git commit --amend --no-edit/<code>

情況二:最新提交的代碼沒問題,它上一次提交的有問題怎麼辦?

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

<code>git rebase -i/<code>

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

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

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

手把手教你如何進階成公司 Git 小能手(常見問題總結)

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

會顯示如下信息。

手把手教你如何進階成公司 Git 小能手(常見問題總結)

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

<code>git add .
git commit --amend/<code>

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

<code>git rabase --continue/<code>

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

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

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

<code>git reset --hard HEAD^/<code>

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

Git 代碼已經 push 上去發現有問題

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

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

<code>git push origin branch1 -f/<code>

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

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

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

<code>git revert HEAD^/<code>

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

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

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

Git 關於暫存的問題

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

  • 添加緩存棧: git stash
  • 查看緩存棧: git stash list
  • 推出緩存棧: git stash pop
  • 取出特定緩存內容:git stash apply stash@{1}

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

Git 分支相關問題

分支中的常用命令:

  • git 拉取指定分支的代碼:git clone -b 分支名稱 地址
  • 查看當前分支:git branch
  • 查看遠程分支:git branch -a
  • 創建並切換分支:git checkout -b add_orderdesc
  • 切換分支:git checkout 分支名稱
  • 查看當前的本地分支與遠程分支的關聯關係:git branch -vv
  • 合併當前分支代碼到master:

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

  1. 我現在遠程建了一個分支 nodescript,我本地也有這麼一個分支,名字和遠程的分支名稱還不一樣。首先,我把我本地的分支名稱修改成和遠程分支相同。
  2. 將本地新建分支 push 到自己的本地遠程 origin 上,因為只在本地創建了一個新的分支,遠程origin 上還沒有該分支
<code>git push origin nodescript/<code>
  1. 把本地分支與遠程 origin 的分支進行關聯處理(通過 --set-upstream-to 命令)
<code>git branch --set-upstream-to=origin/add_orderdesc/<code>
  1. 再次通過 git branch -vv 查看分支的關聯關係,可見本地分支已於 origin 的分支建立上了關聯關係,之後我們每次 push 或者 pull 的時候,只需要輸入git push 或者git pull

git 用戶名密碼郵箱相關問題

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

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

<code>// 設置查看 git 用戶名和郵箱
git config user.name   --查看git當前配置用戶名
git config user.email  --查看git當前配置的郵箱
git config user.name 名稱 設置用戶名
git config user.email 郵箱 設置git郵箱/<code>

全局命令設置

<code> git config  --global user.name 你的目標用戶名;

 git config  --global user.email 你的目標郵箱名;/<code>

在項目中也可以查看這些信息

<code>vi ~/.gitconfig;/<code>

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

git 提交規範

這裡只列舉我常用的提交格式類型

  • feat:新功能(feature)
  • fix:修補bug
  • docs:文檔(documentation)
  • style:格式(不影響代碼運行的變動)
  • refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
  • test:增加測試
  • chore:其他修改,比如構建過程或輔助工具的變動

git 更詳細的提交規範可以看一下阮一峰老師的這篇文章,非常棒Commit message 和 Change log 編寫指南

Git 工具

網上一些 Git 工具很多,推薦一個 SourceThree,但是個人還是比較喜歡用 Git 命令,不然你會發現這項技能慢慢蛻化了,而且一些工具提交時總是帶一些我不懂的參數。平時工具和 Git 命令配個使用,用它的可視化圖表看提交是否有問題,當然也有公司覺得用命令沒有工具安全的,自己選擇就好了,嘿嘿。

SourceThree 下載地址:https://www.sourcetreeapp.com/

vim 常用命令

使用 Git 的時候,偶爾會對 Vim 中對 shell 腳本進行簡單操作,為了節約時間,列出幾個常用的 vim 快捷命令。

  • a,i,r,o,A,I,R,O 進入編輯模式
  • :q 一般退出
  • :q! 退出不保存
  • :wq 保存退出
  • yy 複製當前行的內容
  • ZZ 保存離開
  • dd 刪除光標當前行

總結

本文對 Git 使用過程中常出現的問題進行了一個總結,後面還會更新衝突解決的一些問題,最後建議大家在記憶的時候圍繞文初的圖片,多使用!希望本文能幫助到小夥伴們。

推薦Git學習相關文章

給自己點時間再記記這200條Git命令

手把手教你詳細圖文深入git 高級用法【實踐】

詳細講解高頻使用的 Git 命令

程序員都要掌握的 Git 使用技巧【實踐】

工作流一目瞭然,看小姐姐用動圖展示 10 大 Git 命令【圖文】

「轉」Svn和Git比較系列教程大綱彙總-值得收藏

作者: koalaCoding 程序員成長指北

轉發鏈接:https://mp.weixin.qq.com/s/t88cQv7IPgZr4PANpSpssg


分享到:


相關文章: