適合初次使用git的詳細教程和idea的結合使用
溫馨提醒:本教程巨長,最好跟著做,單看不跟著練習操作容易睡著(新手來說)
一:上傳專案到github
首先是git軟體的安裝,git 官網下載連結 ,然後是安裝,全部下一步下一步就好了。這裡就不贅述了
在idea上面配置好你的git,files->settings->Version Control->Git->Path to Git executable: 設定為安裝git中所安裝的git.exe
碼接下來為github設定賬號密碼:files->settings->Version Control->GitHub->Create API Token
設定好了之後,IDEA的git準備工作就做好了。
然後在github上面新建一個倉庫
建立完成後如下
接下來我們用idea建立一個hellogit的Java project,如果不會,那麼請自行百度用idea建立一個簡單的Java Project
建立完成後,點選VCS--import into Verdion Control--Create Git Repository。
選擇你的專案hellogit
填入 你的github剛剛建立的地址
就是這個
然後右擊你的專案,找到git然後點選 +add 然後你會發現你的檔案變綠色了,接下來就點選Commit Diretory
接下來就去github上面看看你的專案是不是已經上傳了
二:接下來我們不依賴idea的git工具,我們用git命令的方式。
git安裝好了之後,在c盤或者其他碟符建立一個資料夾,比如git
然後在git資料夾裡面右擊滑鼠git bash here
好了接下來就是重點了。
三:初級應用
【1】下載專案
你的專案github上的下載地址圖示
git clone https://github.com/JohnBarrowman65/hellogit.git(你的githubi專案https下載連結)
然後git 目錄下就能看到你在github上的專案已經被下載下來了。
定位到hellogit資料夾右擊git bash here
【2】檢視日誌
git log
檢視到我們在上傳專案的時候的提交日誌,記住git log 後的第一行提示資訊,有一個commit 後面一串字串(SHA-1 校驗和) 後面跟著括號,括號裡面的HEAD ->master這些資訊。。後面有講到這些都是什麼東西。
【3】在src目錄下隨便新建一個檔案,比如新建一個gitcommit.java檔案,然後查詢
git status
status是用來查詢當前工作目錄的狀態的,如圖
“皇家“資訊翻譯:
(1)On branch master --說明你是在一個叫master 的branch(分支)上。我們新建專案的時候,預設都是有一條主線master(也叫主分支)的。
(2)Untracked files --未追蹤的檔案gitcommit.java,git還給你一個溫馨提示git add <file>可以把檔案加入到暫緩區
【4】新增入staging area 區
git add .
#如果是你刪除了一個檔案,用這個
git rm .
看清楚了後面有個點,enter後再git status看下,發現new file:xxx.java了,說明檔案已經被記錄進了 staging area(暫存區)
【5】提交
git commit -m ‘備註資訊’
然後再git log一下,可以看到我們剛剛commit的記錄資訊
這個時候commit只是commit到我們本地的倉庫,遠端倉庫你去看還是沒有提交的。
這裡涉及到git這個分散式中央倉庫的理論基礎知識,也是跟svn這些單中央倉庫一個很大的不同的地方。git你clone專案的時候不僅是下載下遠端倉庫的東西,還會在你自己電腦本地建立一個本地倉庫,你無需聯網就可以自己寫自己的東西,由於可以提交到本地,所以你可以分步提交程式碼,把程式碼提交做得更細,而不是一個提交包含很多程式碼,難以 review 也難以回溯。
【6】push到中央倉庫
git push
這個時候github上就能看到我們的提交的東西了
【7】上面的情況是單單一個人的,然後一個專案往往都是好幾個人一同操作的,所以我們本地模擬下你的同事
切換回git主目錄再clone下一個專案並另起一個名字區別假裝是你的同事。注意 不用怕衝突,因為git是以檔案為區分管理的
git clone https://github.com/JohnBarrowman65/hellogit.git anotherhellogit(同事的檔名)
切換進入anotherhellogit資料夾,開啟git bash here,接下來還是一頓簡單的操作新增檔案然後提交最後push
同時github上面能看到剛剛同事上傳的檔案了
接下來就是你要下載下同事的檔案下來了,切換回你的目錄
git pull
然後你可以看到你的資料夾裡面也已經有同事提交的東西了。
【8】push衝突了
(1)寫完所有的commit後,不用考慮中央倉庫是否有新的提交,直接push
(2)如果 push
失敗,就用 pull
把本地倉庫的提交和中央倉庫的提交進行合併,然後再 push
一次
到此為止,這個工作模型已經是一個最簡單的可用的工作模型了。這個工作模型已經可以讓團隊用來合作開發了。
------------------------------------------------------------分割線--------------------------------------------------------------------------
三:接下來探討下我們前面留下的坑,HEAD->master,commit,等具體的實際意思
【9】HEAD當前commit的引用,你的一次更新改動commit到倉庫後就算一次commit,每當有新的commit後,HEAD自動與其對應,commit本身有後面一串很長的SHA-1來標識。總之,當前commit在哪裡,HEAD
就在哪裡,這是一個永遠自動指向當前commit的引用,所以你永遠可以用HEAD來操作當前commit。
【10】branch分支,mseter也是一個分支,不過是指主分支,git上預設分支就是master
新建分支叫做branch1並切換到branch1的分支
git checkout -b branch1
注意master和branch1是平等的
刪除分支,刪除遠端倉庫分支
#刪除分支
git branch -d branch1
#刪除遠端倉庫分支
git origin -d branch1
【11】merge合併分支到主線上。
上面我們剛剛建立了一個branch1的分支,假如我們在這個分支裡面新增了檔案,還是一頓操作
然後再上傳分支到git遠端倉庫上面
git push origin branch1
接下來注意先切換回master主線,這個時候最好git pull一下(這其實是pull操作的一種經典情形:本地的master沒有新提交,而遠端倉庫中有同事提交了新內容到master),然後再合併分支branch1
git checkout master #切換到master主線
git pull #更新下
git merge branch1 #合併分支
最後就是git push上去就可以了,這個時候我們就可以在github上面看到我們剛剛新增的branch1分支中新增的東西了
【12】merge衝突
當你在合併分支的時候有可能回出現衝突,比如你在這個分支中修改了a,另一個分支中修改了b,那麼合併後就是既改 A 也改 B,這個動作會自動完成;如果兩個分支都改了同一個檔案,但一個改的是第 1 行,另一個改的是第 2 行,那麼合併後就是第 1 行和第 2 行都改,也是自動完成。但是你的兩個分支改了相同的內容,Git 不知道應該以哪個為準,如果在merge的時候發生了這種情況,Git 就會把問題交給你來決定。那麼你現在需要做兩件事:解決掉衝突然後手動commit一下放棄解決衝突。
取消merge用的命令是git merge -abort
-------------------------------------------------------分割線--------------------------------------------------------------------------
接下來說下最常用的工作流模型,也是很多公司用的(聽說)
這種工作流的核心內容可以總結為兩點:
任何新的功能(feature)或 bug 修復全都新建一個 分支來寫;分支寫完後,合併到主線,然後刪掉這個分支。
打個比方,對於hellogit這個專案,你需要完成裡面的論壇功能,那麼你就自己新建一個bbs的branch,寫好後提交到中央倉庫,給經理或者其他同事看下確認沒問題了,你再最後確認合併到主線上。
【13】Feature Branching工作流
#建立分支
git checkout -b xxx
#提交東西
git add .
git commit -m xxx(提交備註說明)
#上傳分支
git push origin xxx
#切換分支
git checkout master
#更新本地倉庫跟中央倉庫的master一致
git pull
#合併分支
git merge xxx
#提交到中央倉庫
git push
#刪除本地分支
git branch -d xxx
#刪除遠端倉庫分支
git push origin -d xxx
這個時候可以通知你的同事或者上級查收下你的程式碼,我們切換到一開始建立的你的”同事“
git pull
git chekcout bbs
如圖就是我上傳的bbs功能,你同事那裡也能看到了,確認沒問題後,你就再合併分支然後上傳到中央倉庫
git merge bbs
git push
git branch -d bbs
git push origin -d bbs
這個時候可以上去看看github上面是不是已經存在bbs的功能程式碼了
同時為了不必要留下很多分支,建議你同時刪除本地和中央倉庫的bbs分支
用這種方案去工作還有個好處就是多工的支援,很多時候你的任務時一起來的,你就可以同時建立多個分支,這個做完可以切換到另一個繼續做。
-------------------------------------------------分割線-------------------------------------------------------------------------------
四:高階應用
【14】merge換成rebase的操作
#新建並切換到新增的分支
git checkout -b rebasebranch
#這裡就寫你的功能啦.......
#變基(衍合)
git rebase master
#在rebase之後,切回master再merge一下,把master移到最新的commit
#切換分支
git checkout master
#合併分支
git merge rebasebranch
如圖:先新增了分支,然後提交到了中央倉庫
然後使用rebase合併分支,最後push上到專案中。這樣也能實現分支的合併
注意:一般不要從master向其他branch執行rebase操作
五:高階應用修改commit
先在本地對需要修改的檔案進行修改
--git add xxx(修改了的檔名)
--git commit -amend
commit-amend是用在修改當前commit的,那要是發生在前一個commit呢?用rebase
首先先定位到你需要修改的commit前,用
git log
如上圖,我想修改的提交備註為”修改gitcommit檔案“那一行的commit
那麼我可以這樣
git rebase -i HEAD^^
在彈出的編譯頁面選擇你需要修改的commit,把最前面的pick改為edit退出後就停留在你需要修改的commit了
這個時候就能繼續你的修改東西的操作了
git add xxx(修改了的檔名)
git commit -amend
在修復完成之後,就可以用git rebase --continue來繼續rebase過程,把後面的commit直接重新連線起來並應用上去。
最後寫好了也可以push上去到中央倉庫。
六:高階應用撤銷commit
git reset --hard HEAD^
前面的操作也是用於撤銷最新的commit的,但是如果是前面幾個,那麼reset--hard就用不了,這個時候用互動式rebase撤銷commit
git rebase -i HEAD^^
這個時候又彈出一個編輯框了,你只需要刪除你想要撤銷的commit上的那一行就可以了。
當然是發生在前面所有的前提都是在內容未push前的。如果是push後的,並且是在你自己未合併到master主線上的分支,那麼你也可以更改然後強制push上去
git push origin branch1 -f。
記住假如你的分支已經合併到master那麼千萬彆強制push了,不然覆蓋掉之前人家提交的,你會被打的。這個時候你就要用revert了。它的用法很簡單,你希望撤銷哪個commit,就把它填在後面:
git revert HEAD^
本地做完提交後再push就可以了
七:高階應用stash
臨時存放工作目錄的改動,當你某個功能還沒寫好沒commit的時候,你不必急急忙忙commit上去,再去切換分支做別的緊急的事情,可以直接
git stash -u
做完緊急的事情後你再返回來做你的功能
git stash pop
這樣你之前儲存的東西又都回來了!
八:高階應用reflog
找回誤刪除的分支
git reflog
這個命令可以找到HEAD的移動記錄,找到你想要找回的分支當時commit,切換到它,比如說branch1我要找回它
那麼我就切換到它
git checkout branch1
git checkou -b branch1
這樣你剛刪除的分支branch1就找回來了。
九:高階應用排除不想被管理的檔案和目錄
.gitignore檔案
建立倉庫的時候github上面有模板讓你選擇,自動生成相應的.gitignore檔案
寫這個教程花了我整整一天的時候,各位看官如果覺得有幫助請點個贊謝謝,文中如果有出錯的地方,歡迎有老司機指正