安裝一個git ,別問我git是什么,自己百度,然后找到項目鏈接,直接 git clone 鏈接,或者你ssh 鏈接(這個你還是算了你不會的。),然后就拉下來了,然后就是git pull ,git add路徑(git add .是所有項目文件)然后git commit -m "你要說的話",然后 git push 就行了,私聊我給一個腳本你,只需要 sh 就行了。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、濟水街道網(wǎng)站維護、網(wǎng)站推廣。
git沖突的場景與其他SCM工具一樣,我在這邊修改了文件a,同事也修改了文件a。同事比我先提交到倉庫中,那么我pull代碼時就會報錯:
$ git pull
remote: Counting objects: 39, done.
remote: Compressing objects: 100% (30/30), done.
remote: Total 39 (delta 13), reused 0 (delta 0)
Unpacking objects: 100% (39/39), done.
From
d3b2814..5578b8c master - origin/master
Updating d3b2814..5578b8c
error: Your local changes to the following files would be overwritten by merge:
app/src/main/AndroidManifest.xml
app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
Please, commit your changes or stash them before you can merge.
Aborting
1234567891011121314
而此時我又不顧這個錯誤,將我的代碼add并commit,然后push時報如下錯:
To
! [rejected] master - master (non-fast-forward)
error: failed to push some refs to ''
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
12345678
然后我有執(zhí)行了git pull:
$ git pull
Auto-merging app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
CONFLICT (content): Merge conflict in app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
Auto-merging app/src/main/AndroidManifest.xml
CONFLICT (content): Merge conflict in app/src/main/AndroidManifest.xml
Automatic merge failed; fix conflicts and then commit the result.123456
那么既然兩個文件沖突,我就可以借助mergetool來搞定它。我安裝了meld作為代碼比對工具,那么它理所當然也就成為我的mergetool了。
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
Merging:
app/src/main/AndroidManifest.xml
app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java
Normal merge conflict for 'app/src/main/AndroidManifest.xml':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
Normal merge conflict for 'app/src/main/java/com/linc/skill/screenswitch/ScreenSwichActivity.java':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
1234567891011121314151617181920
merge完成后,執(zhí)行g(shù)it status發(fā)現(xiàn)有些文件做了修改,那么把這些文件提交 吧,就把這次commit作為一次merge操作吧。
$ git commit -m "merge"
[master 978aa1f] merge
$ git push
Counting objects: 64, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (25/25), done.
Writing objects: 100% (33/33), 3.81 KiB | 0 bytes/s, done.
Total 33 (delta 15), reused 0 (delta 0)
To
5578b8c..978aa1f master - master
$ git pull
Already up-to-date.123456789101112
至此,本次沖突解決完畢。
如果希望保留生產(chǎn)服務(wù)器上所做的改動,僅僅并入新配置項, 處理方法如下:
git stash
git pull
git stash pop
String localRepoGitConfig = "D:/test/.git"; //路徑
Git git = Git.open(new File(localRepoGitConfig));
git.log().call().forEach(i-System.out.println(i.getFullMessage()));
如果你達到一個重要的階段,并希望永遠記住那個特別的提交快照,你可以使用 git tag 給它打上標簽。
比如說,我們想為我們的 runoob 項目發(fā)布一個"1.0"版本。 我們可以用 git tag -a v1.0 命令給最新一次提交打上(HEAD)"v1.0"的標簽。
-a 選項意為"創(chuàng)建一個帶注解的標簽"。 不用 -a 選項也可以執(zhí)行的,但它不會記錄這標簽是啥時候打的,誰打的,也不會讓你添加個標簽的注解。 我推薦一直創(chuàng)建帶注解的標簽。
$ git tag -a v1.0
當你執(zhí)行 git tag -a 命令時,Git 會打開你的編輯器,讓你寫一句標簽注解,就像你給提交寫注解一樣。
現(xiàn)在,注意當我們執(zhí)行 git log --decorate 時,我們可以看到我們的標簽了:
$ git log --oneline --decorate --graph* 88afe0e (HEAD, tag: v1.0, master) Merge branch 'change_site'|\
| * d7e7346 (change_site) changed the site* | 14b4dca 新增加一行|/ * 556f0a0 removed test2.txt* 2e082b7 add test2.txt* 048598f add test.txt* 85fc7e7 test comment from runoob.com
如果我們忘了給某個提交打標簽,又將它發(fā)布了,我們可以給它追加標簽。
拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
git pull:從其他的版本庫(既可以是遠程的也可以是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能類似于SVN的update
一、使用Git拉取項目到本地
1、團隊實際開發(fā)Git概況
在實際開發(fā)的項目中,一個項目會有 三種版本分支:master版本分支、dev版本分支、自定義版本分支
master版本分支: 正式運行環(huán)境中的程序代碼,運行環(huán)境會定期自動或按計劃手動從該master版本分支中獲取代碼并重新編譯和運行,不允許隨意修改,一旦出錯將對系統(tǒng)造成嚴重后果。所以開發(fā)人員不會被項目管理員授予:在Master上創(chuàng)建分支、直接提交代碼到Master分支上、使用Master分支合并其他分支的權(quán)限。
dev版本分支: 測試環(huán)境中運行的代碼,master版本分支會定期合并該dev版本版本分支的代碼,也不允許隨意修改,如果想要修改,必須先新建一個自定義版本分支,編寫好代碼之后同步到云端倉庫,在云端使用Git向該項目的管理員發(fā)出合并請求(merge),項目管理員同意之后才能在dev分支中看到自己寫好的代碼。所以開發(fā)人員也不會被授予:直接提交代碼到dev分支、使用dev合并其他分支的權(quán)限;但是擁有在dev分支上新建自定義分支的權(quán)限。
自定義版本分支: 自己定義的版本分支,有兩種情況。
情況1: 一般情況下,開發(fā)人員使用git clone命令、使用IDEA或GitHub Desktop等其他圖形化工具從云端復制項目到本地的是當前時間的master版本,開發(fā)人員需要在本地新建一個分支(可以命名為dev)關(guān)聯(lián)到云端的dev分支,再在本地dev分支上新建一個自定義版本分支。
情況2: 還有一種情況是先在云端的dev上新建一個自己的分支,再使用命令行自定義拉取信息,拉取剛才新建的分支到本地。
當開發(fā)人員在自定義分支上開發(fā)完了自己的代碼之后,將當前自定義版本分支同步到云端,這時候請求合并到dev分支,管理員或者被授權(quán)合并權(quán)限的人員就可以審核開發(fā)人員的代碼并進行合并了,如果測試不通過則不予合并,如果在合并之后出現(xiàn)問題,則將dev分支回退到之前的版本。
2、Git拉取項目:就是復制項目到本地。
本文介紹使用IDEA從云端拉取項目,默認拉取的是master分支的快照,相當于在本地新建一個master分支,再把當前master分支的代碼復制到本地master分支。
(1)新建項目,從版本控制系統(tǒng)拉取。
(2)從云端查看要被拉去的項目路徑,在IDEA中輸入項目路徑
在這里復制
在這里輸入
然后確認即可
3、用IDEA打開或者導入剛才的項目,項目為git-test
打開或者導入都可以,以下是打開
信任項目選擇信任
此時項目就已經(jīng)下載到本地并且作為一個項目文件存在了,但是還是不能直接運行,因為大型項目往往需要配置運行環(huán)境。
二、本地運行
克隆好的SpringBoot項目用IDEA打開自動會根據(jù)maven加載項目依賴,并配置啟動類。
IDEA右上角菜單欄出現(xiàn)下圖所示的情況表示加載成功。
由于項目是團隊開發(fā),所以項目的src\main\resource目錄下會有對應(yīng)多個狀態(tài)的properties配置文件,如下圖:
application.properties、application-dev.properties、application-prod.properties分別對應(yīng)總體配置、測試開發(fā)環(huán)境配置、運行環(huán)境配置。需要這些配置的原因是:測試環(huán)境(dev)和生產(chǎn)環(huán)境(prod)的數(shù)據(jù)庫或者資源不一致,測試環(huán)境的數(shù)據(jù)庫是生產(chǎn)環(huán)境的一個副本,生產(chǎn)環(huán)境數(shù)據(jù)庫只允許增加和查看,修改和刪除需要嚴格控制。
由于我們當前是在開發(fā)環(huán)境之下,所以需要加載使用dev環(huán)境的配置。但是加載和使用dev環(huán)境的配置不能在代碼中設(shè)置,如果上線到運行環(huán)境運行到這部分代碼就會出錯,所以需要在運行時設(shè)置VM Options參數(shù):-Dspring.profiles.active = dev,如下圖:
三、本地測試
正常情況下本地測試:
在Test同路徑下面創(chuàng)建測試類,并在類上添加注解@SpringBootTest;創(chuàng)建方法,并添加注解@Test
代碼如下:
@SpringBootTest
public class SpringBootFunctionTests {
@Autowired
UserService userService;
@Test
public void testMethod1() {
//方法體
}
}
登錄后復制
但是在某些情況下可能會報錯,尤其是在某個地方使用了@WebEnvironmentAutoConfig注解之后,可能需要重新指定測試類的運行環(huán)境。
此時需要
(1)先檢查pom.xml,看是否配置了spring-boot-starter-test
(2)查看import,分別嘗試import org.junit.Test;和import org.junit.jupiter.api.Test;
(3)嘗試修改注解,如:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {OperationApplication.class})
@SpringBootTest
public class SpringBootFunctionTests {
@Autowired
UserService userService;
@Test
public void testMethod1() {
//方法體
}
}
登錄后復制
?
(4)如果此時還是出錯,并且是在未添加@RunWith(SpringRunner.class)注解出現(xiàn)NullPointer錯誤,添加了次注解出現(xiàn)上下文環(huán)境無法加載錯誤(ApplicationContext not found),說明沒有指定測試類的運行環(huán)境配置,就像上文指定開發(fā)運行環(huán)境配置一樣。
指定測試類的運行環(huán)境配置
方法有三種:
(1)一種是給Junit添加VM Options:-Dspring.profiles.active = dev
添加Junit在此項目中的總體運行配置,此時在每一次運行Junit測試的時候,IDEA都會加上此運行配置,一勞永逸。
(2)單個測試方法添加運行配置
此時需要對每個測試方法都添加配置,比較麻煩。
(3)在每個測試類上添加@ActiveProfiles(“dev”)指定運行環(huán)境,并添加@RunWith(SpringRunner.class)
代碼如下:
@RunWith(SpringRunner.class)
@ActiveProfiles("dev")
@SpringBootTest
public class SpringBootFunctionTests {
@Autowired
UserService userService;
@Test
public void testMethod1() {
//方法體
}
}
登錄后復制
也需要對每個測試類都添加這兩個注解。