IntelliJ Idea git操作指南

wls1036 2021-09-18 16:34:11 阅读数:634

intellij idea git 操作 指南

寫在前面

長期以來,我一直用的是git命令行管理代碼,當只有一個人時,這完全沒問題,但參與團隊協作,命令行就顯得令不從心,這並不是說命令後做不到,只是命令需要記住太多的命令,學習成本太高,而且在解决沖突上面,如果只靠命令後,那種感覺你體驗過一次就再也不想體驗。在花了一兩天時間研究idea的git工具後,我就决定徹底放弃命令行擁抱gui,因此這邊將這兩天的研究成果記錄下來,供大家學習參考。

創建倉庫

創建遠程倉庫

第一步需要在github或者gitee代碼管理平臺創建好倉庫,這裏以github為例

  • 輸入倉庫名稱
  • 選擇倉庫類型,public錶示所有人都可見,private錶示只有授權過才有權限

倉庫創建好後,默認是一個空倉庫,這時候界面會提示如何往倉庫推送代碼

注意到界面上有個倉庫地址,地址有ssh和https,這兩個有什麼區別呢

  • https:通過http協議進行代碼的管理,需要使用用戶名密碼
  • ssh:通過ssh協議進行代碼管理,使用的是密鑰(你可以理解為一個憑證)

推送倉庫的操作後面會詳細說明,這裏就不介紹。

關聯本地倉庫

如果是本地已有項目需要關聯剛創建的遠程倉庫,具體步驟如下

  • 初始化項目

在菜單欄選擇VCS -> Import into Version Control -> Create Git Repository,選擇後會彈出文件夾選擇窗口選擇當前文件夾即可

選擇文件夾後idea會在當前目錄下創建一個.git的文件夾,錶示該項目已經是一個使用git版本控制的項目,如果你的終端是比較友好的終端(如Oh My ZSH),這時候會顯示當前分支,默認是master分支

* git-learning git:(master) *
  • 關聯遠程倉庫

遠程倉庫稱在git中稱為Remote,一個項目可以關聯多個reomte,也就是你的項目可以同時推送到多個遠程倉庫,這個是很有用的,比如我們的代碼既要推送到客戶倉庫進行集成,又要推送到公司的倉庫進行代碼審查,這時候就可以使用多remote進行推送,點擊VCS -> Git -> Remotes添加遠程倉庫,如果是第一倉庫,名稱默認origin,建議不要修改該名稱

這樣我們就完成了本地倉庫和遠程倉庫的關聯,後續就可以進行代碼的提交,分支的創建等操作。

克隆倉庫

如果是別人創建好並提交過代碼的倉庫,你需要同步到本地,那麼就需要對倉庫進行克隆(clone)操作,選擇File -> New -> Project from Version Control,輸入遠程倉庫代碼地址即可

gitignore

在項目中有些工程文件或者程序運行時文件我們不希望提交到倉庫裏,那麼我們就需要准備一個名為.gitignore的文件,將不希望提交的文件都寫到該文件裏,git就不會對這些文件進行提交和管理。

一個.gitignore樣例

/out/
/classes/
.mvn
/node_modules/
.idea
*.iws
*.iml
*.ipr
.DS_Store
/target/

可以在文件或者文件夾上右鍵將其添加到gitignore上

提交代碼

代碼修改後需提交到本地倉庫,這個過程稱為Commit,代碼提交到本地倉庫後就可以將commit提交到遠程倉庫,這個過程稱為push,從遠處倉庫更新代碼的過程稱為pull,這三個git操作是最常用的三個操作,在idea的右上角有這三個操作對應的按鈕

  • ① 更新代碼,pull操作
  • ② 提交到本地倉庫,commit操作
  • ③ 提交到遠程倉庫,push操作

點擊commit圖標就可以提交代碼,提交代碼界面如下

注意到①文件前面都有一個複選框,如果是新添加的文件,沒有特殊配置的話是不會自動勾選的,新添加的文件需要手動勾選才能提交,可以直接對頂層文件夾全選即可,commit後需要進行push才能同步到遠程倉庫,點擊push按鈕

push成功後就可以登錄遠程倉庫查看最新的代碼

注意到系統提示我們添加一個README文件,README是一個名稱為README.md的文件,比特於項目根目錄下,一個好的README文件有助於其他人快速了解項目情况,關於如何寫好README文件,可以參考以下文檔

修改代碼後,在提交的界面還會對本地提交和上一次提交進行對比,方便我們查看修改的內容

回滾代碼

git回滾代碼有兩種方式

  • reset
  • revert

這兩種有什麼區別呢,假設我們提交了三次commit

commit1 -> commit2 -> commit3

如果我想會滾到commit2,如果用reset的話,那麼commit2之後的所有修改都會被丟弃,也就是把commit2之後的commit全部砍掉了,revert有點像undo,會把commit2做的操作反做一遍,也就是undo,並且生成一個新的commit,變成

commit1 -> commit2 -> commit3 ->4

具體應用在什麼場景呢,舉個例子,比如我們在調試的時候可能要加一些調試語句,比如system.out,當調試完畢,我們希望能够移除這些調試語句就可以在調試前提交一次commit,調試完畢後reset到該次commit就行,當然你也可以通過分支來實現,調試完畢把分支删掉即可。

我們的系統在不斷的迭代,突然某一天,產品經理說之前已經上線的一個功能不要了,那麼就可以找到該功能對應的commit進行revert,這樣既移除對應的功能又能保留後續的新功能。

reset

在idea地步工具欄,點擊Git工具欄,切換到Log標簽頁,可以看到本地commit日志和遠程commit日志,在指定commit上右鍵選擇Reset Current Branch to Hear就可以以reset的方式回滾到該commit上

有四種回滾的模式

<img src="http://zhengjianfeng.cn/images/R2byAplCbygdWlcNS98tcHuYiflKF4FC.jpg" style="zoom:60%;" />

選擇Hard模式,將會清除本地版本,强制回滾到指定commit狀態,但是通過reset是無法進行push操作,因為本地的版本比遠程版本要低,此時可以强制push到遠程分支

idea默認是禁止在master分支上進行强制push,如果是master分支需要强制push可以在終端使用命令行 git push --force

force push是一種非常不好的習慣,除非你清楚的意識到force push帶來的後果,不然千萬不要執行force push

revert

revert可以將指定的commit所做的修改全部撤銷掉,而不影響其他commit的修改,假設我們有三個文件,分別為file1.txt,file2.txt,file3.txt,現在提交三個commit,三個commit分別為

  • Commit1:向file1.txt中添加內容
  • Commit2:向file2.txt中添加內容
  • Commit3:向file3.txt中添加內容

現在我們在Commit2:文件2修改這個commit上面右鍵選擇Revert Commit,這時候會彈出提交窗口,idea會自動提交一次新的commit,commit後我們發現文件2的內容沒有了,也就是撤銷了commit2修改的內容,commit後執行push操作就能推送到遠程倉庫了,因為是生成了新的commit,所以無需force push就能提交到遠程倉庫

revert操作會經常碰到代碼沖突的情况,這時候就需要手動去解决沖突,解决方法下面也會詳細說明

分支管理

分支是git中非常重要的概念,假設沒有git的情况下,我們系統上線了,在線上穩定運行,這時候你需要開發後續的功能但又想保留目前線上版本的代碼,因為可能線上有緊急bug需要修複,你需要使用當時的版本進行修改,所以你可能會copy一份代碼做備份,等新功能開發完,你還需要將這段時間在備份的代碼上修改的代碼整合過來,如果這個過程是人工進行的,非常容易出錯,所以git提供了分支解决這個問題,線上運行的代碼可以在主分支上,比如master分支,開發新功能可以從master分支切一個分支出來,比如dev分支,修複bug也可以從master分支上切一個分支出來,比如fix分支,當bug修複完畢,將fix分支整合(merge)到master分支上,當新功能開發完畢後,將dev分支整合到master分支,就完成了上述所有的操作。

新建分支

在idea右下角顯示當前分支

點開就可以在當前分支下新建一個分支

你也可以從某個commit切出一個分支,具體做法在commit日志上右鍵New Branch即可

切換分支

如果想要切換到其他分支,點擊要切換的分支,選擇Checkout

切換分支前需要把當前分支的修改提交或者暫存,暫存後續也會提到

分支合並

比如我要把fix分支合並到dev分支上,那麼將當前分支切換到dev上,選擇fix分支Merge into Current

合並過程可能會產生沖突,需要解决完沖突才能完成合並,解决沖突下文也會提到

合並完分支後,建議把fix分支進行删除,避免誤將分支提交到遠程倉庫,導致分支混亂。

rebase

注意到上面菜單中在Merge上面還有一個Rebase Current onto Selected的選擇,合並有兩種方式,一種是merge,一種是rebase,這兩種有什麼區別呢,如下午,1時rebase方式合並,2和3是merge方式合並

  • merge會保留分支提交信息
  • merge會創建一次Merge branch的commit信息
  • 相比merge,rebase會將分支上的commit整合到當前分支上,讓整個代碼周期更為清晰
  • 相比merge,rebase並不會產生多餘的commit信息

具體用rebase和merge,各有各的好處,取决於項目的規範要求。

沖突解决

不管是rebase還是merge,在進行合並時難免會產生沖突,所謂的沖突是指兩個分支上的代碼對同一個地方進行修改,系統無法判斷該保留哪一份代碼,需要人工進行幹預解决沖突的過程。如果有沖突產生,在進行合並時會列出所有沖突的代碼

這時候有三個選項可以選擇

  • Accept Yours:保留當前分支代碼,丟弃被合並的分支代碼
  • Accept Theirs:保留被合並分支代碼,丟失當前分支代碼
  • Merge:手工進行合並

選擇Merge後進入手工合並代碼界面

  • ① 當前分支代碼
  • ② 合並後的代碼
  • ③ 被合並的分支代碼

idea會把兩邊不同的進行高亮顯示,你可以根據實際情况進行合並

合並後會彈出一個確認框,如果所有的沖突都解决完畢,可以點擊Apply Change and Mark Resolved,錶示沖突已解决

標簽管理

創建標簽

一般我們在發布一個新版本時會對項目打一個標簽(tag),以錶示其重要性,在gihub上我們也經常看到項目發布新版本時都會打上標簽

在commit的log上右鍵commit就以為為該commit創建一個標簽,標簽名稱一般為版本號,比如v1.0 v1.1

在push代碼時可以選擇將標簽一起提交至遠程倉庫

這樣我們就能在遠程倉庫中看到標簽,並且系統會自動將標簽對應的commit當時的代碼進行打包歸檔

根據標簽拉取代碼

比如需要對v1.0的代碼進行修複,我們需要拉取v1.0的代碼,並且修複完畢後需要合並到當前分支

  • 根據tag拉取代碼

輸入標簽名稱就可以拉取到代碼,但此時的分支名稱是分支對應的commit編號,說白了就是一個commit,我們需要在該分支上再創建一個分支才能對代碼進行修改,創建的方法和上面一樣,就是點擊分支名稱,New Branch即可,修改後提交,按照正常分支合並即可。

補丁

patch

可以為一個或多個commit創建一個補丁(Patch),idea會創建一個.patch的文件,裏面記錄了文件的變化

在分支上可以將補丁進行導入,VCS -> Apply Patch

打補丁也是一種合並的方式,也需解决代碼沖突問題

cherry-pick

和打補丁類似,cherry-pick可以直接將其他分支的一個或者多個commit應用到當前分支,無需導出patch文件

版权声明:本文为[wls1036]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918163410794g.html