之前一直都是自己一個人操作 Git,會的也就是那幾個命令。馬上要去實習了,所以打算將 Git 重新學習并且復盤下,尤其是分支那塊的知識
鏈接:
https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup
https://medium.com/@steveamaza/how-to-write-a-proper-git-commit-message-e028865e5791
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
https://juejin.cn/post/6844903890295455751
使用前配置
簽名的作用是區(qū)分不同操作者身份。用戶的簽名信息在每一個版本的提交信息中能夠看到,以此確認本次提交是誰做的。Git 首次安裝必須設置一下用戶簽名,否則無法提交代碼。這里設置用戶簽名和將來登錄 GitHub(或其他代碼托管中心)的賬號沒有任何關系。 全局配置一般在 ~/.gitconfig 中 git config --global,針對特定項目,一般在 .git/config 文件中 git config --local
git config --global user.name 提交人姓名git config --global user.email 提交人郵箱- 查看 git 配置信息:
git config --list
撤銷
- 文件修改只存在工作區(qū),還沒有被添加到暫存區(qū):
git checkout <file>或者git restore <file> - 文件修改已被添加到暫存區(qū),若想從暫存區(qū)回到工作區(qū)的狀態(tài):
git reset HEAD <file>或者git restore --staged <file>, 之后若想繼續(xù)撤銷工作區(qū)的修改,執(zhí)行git checkout <file>或者git restore <file>即可 - 將文件從暫存區(qū)刪除:
git rm --cached 文件要注意這邊雖然從暫存區(qū)中刪除了,但是工作目錄中還是存在的
版本
HEAD 指針指向哪個版本,當前文件就處于這個版本的狀態(tài)
-
git reflog查看版本信息 -
git log查看版本詳細信息
版本穿梭(回滾)
Git 切換版本,底層其實是移動的 HEAD 指針。假設有 v1,v2,v3三次commit記錄,想從當前的v3回滾到v2,則使用git reset --hard v2版本號。注意回滾之后,如果使用git log 查看的話,v3版本記錄是看不見得,如果想從v2再變?yōu)関3,可以使用git reflog查看到v3的版本號,再使用git reset --hard v3版本號
git reset --hard 版本號-
git reset --hard HEAD^回退一次 -
git reset --hard HEAD^^回退兩次
回滾至之前版本
git log
git reset --hard 版本號
回滾至之后版本
git reflog
git reset --hard 版本號
遠程倉庫
- 查看遠程分支:
git branch -a - 查看當前本地倉庫對應的遠程倉庫:
git remote show一般會顯示 origin - 查看當前本地倉庫對應的遠程倉庫的詳細信息:
git remote show origin - 若在遠程新建分支之后,本地在沒有
git fetch的情況下,直接git checkout 分支名是會報錯沒有被跟蹤的,一般情況下,在遠程新建分之后,本地想要拉取,需要執(zhí)行git fetch后 再執(zhí)行git checkout -b 分支名 origin/分支名 - 若是在直接新clone的倉庫下切換遠程存在分支,那么不需要
git fetch, 因為此刻,本地倉庫與遠程是同步的,git fetch一般用于 mentor 在遠程庫中新建分支,因為此刻你本地代碼肯定是老早clone好的 - 在本地新建分支后,若想推送到遠程,第一次push的時候不要直接
git push origin 分支名,這樣貌似不會直接與遠程該分支建立連接,需要使用git push --set-upstream origin 分支名,在 vscode 中 直接選中 push 不要選擇push to
git stash
在切換分支之前,必須要將當前分支上所有的改動進行提交才能夠切換分支,但更多時候是當前分支上還沒有開發(fā)好,不想commit,但不得不切換到其他分支上改 bug。在 git 中,可以暫時提取分支上所有的改動并存儲,讓開發(fā)人員得到一個干凈的工作副本,臨時轉向其他工作。
- 存儲臨時改動:
git stash - 恢復改動:
git stash pop該命令會將 stash 版本刪除掉,git stash apply會保存
差異對比
-
git diff比較暫存區(qū)與工作區(qū) -
git diff --cached比較版本區(qū)與暫存區(qū)
沖突
沖突產生的原因:合并分支時,兩個分支在同一個文件的同一個位置有兩套完全不同的修改,Git 無法替我們決定使用哪一個,必須人為決定新代碼內容。合并分支只會修改合并的分支,也就是 master 分支,不會修改 dev 分支上的內容
-
<<<<<<< HEAD與=======之間是當前master分支的代碼,=======與>>>>>>> dev之間是 dev 分支的代碼
<<<<<<< HEAD
hello git! master test
hello git!
=======
hello git!
hello git! dev test
>>>>>>> dev
- 產生沖突后,需要人為手動修改沖突,將自己需要的代碼保存下來,如下
hello git! master test
hello git! dev test
- 手動解決沖突后,還需要將文件添加到暫存區(qū)并且提交到本地庫,走 add commit 的流程
git rebase
注意事項
- 不要對master分支執(zhí)行rebase,會引起很多問題
- 一般來說,執(zhí)行rebase的分支都是自己的本地分支,沒有推送到遠程版本庫
- 不要在與別人共享的分支上執(zhí)行 rebase 操作,rebase操作都是在本地與別人沒有共享的分支上執(zhí)行的
- rebase 合并的時候不要把已經提交到遠程庫的記錄合并,要合并那些沒有提交到遠程庫的記錄
- 在 rebase 之后 再進行 merge 命令 就相當于是 fast-forword 操作了
應用場景
將多個記錄合并為一個記錄
git rebase -i HEAD~3 從當前 HEAD 指針所指位置找最近的3條記錄進行合并
將分叉記錄歸并為一條
- 使用merge的時候,是切換到master分支上,執(zhí)行
git merge dev,但是使用rebase的時候,如果想將dev上的提交到master上,要先切回到dev分支,執(zhí)行git rebase master,之后再切回master分支,執(zhí)行git merge dev
拉取遠程產生分叉
git pull origin dev變成git fetch origin dev; get rebase origin/dev - checkout到test分支上之后執(zhí)行
git rebase dev,是以dev為基準,將test分支上的提交合并到dev分支上
零散知識點
- push 和 pull 的時候都需要指定分支,沒有指定的情況是 該分支 已經默認與遠程分支進行關聯(lián)了
- 第一次
git clone只會顯示 master 分支上的內容,其他分支其實也被克隆下來了,只是沒有顯示。如果想獲取到其他分支,可以先用git branch -a查看遠程所有分支,然后用git checkout 分支名就可以獲取到相應的分支 ,遠程倉庫若有這個分支會自動追蹤 - 修改最新commit的message:
git commit --amend -
git cherry-pick一般應用于本地分支上
規(guī)范
-
git commit -m "Git commit message here":commit message 首字母要大寫,限制 50 個單詞之內,不要用句號結束,獨占一行,如需要進一步解釋,則用空行分開摘要和正文,正文每行不超過 72 個單詞,主要解釋這次 commit 解決什么問題,說明代碼變動的動機,以及與以前行為的對比,使用祈使語句,即現(xiàn)在時。