Git
Install
Settings
git config --global user.name "your username"
git config --global user.email "your email address"
git config --global core.autocrlf true
git config --global core.safecrlf true
打開 Git Bash,輸入底下的指令
Clone Project
GitLab
- 登入 GitLab (http://192.168.31.166)
- 選擇您的專案,查看專案的 URL 網址
Git Clone
- 打開 Git Bash 並至您想放置專案的目錄
- 透過 git clone 下載整個專案內容 (請輸入 GitLab 帳號密碼)
cd git
git clone http://192.168.31.166/nta/brt.git
打開 eclipse 馬上重新 import 專案吧 !
修改議題單流程
One Issue, one Branch
每張議題單或每個獨立修正都必須開不同的 branch
每次在開始著手修改議題單時,先切到 master,並且更新遠端儲存庫的異動至本地端
~/git/$ cd brt
~/git/brt(master)$ git pull --rebase origin master //更新遠端異動至本地
1
One Issue, one Branch
根據議題單編號或修正內容大綱建立 branch
~/git/brt(master)$ git checkout -b 22321-enhance-performace
~/git/brt(22321-enhance-performace)$
2
One Issue, one Branch
開始修改程式......
3
Programing...
app.controller('brt310eController', function($scope, brt310eService, accessControlService,
businessDayService, user, $timeout, alerter, cDateUtils, cStringUtils, $window) {
$scope.model = {};
$scope.gridData = [];
$scope.tab1 = {tempGridData:[]};
One Issue, one Branch
將告一段落的程式 Commit 至本地端
~/git/brt(22321-enhance-performace)$ git add --all
~/git/brt(22321-enhance-performace)$ git commit -m "remove redundant for loop."
4
可藉由 GUI 工具 (SourceTree, TotoiseGit) 幫助 commit 程式碼
One Issue, one Branch
將 Branch Push 至遠端儲存庫
~/git/brt(22321-enhance-performace)$ git push origin 22321-enhance-performance
5
也可以 git push --set-upstream origin 22321-enhance-performance,以後要 push 至同個 branch 就只要打 git push 就好。
One Issue, one Branch
至 GitLab 發 Merge Request,等待將此修正併回遠端 master
6
登入 GitLab,Dashboard 即有 Create Merge Request 的按鈕
One Issue, one Branch
至 GitLab 發 Merge Request,等待將此修正併回遠端 master
6
再次查看修正內容是否正確,並修改 Title 後 Submit.
One Issue, one Branch
查看 Summit 的 Merge Request 是否可以被 Merge
7
底下的說明敘述此 Merge Request 可被 Merge 且不會有衝突
若此 Merge Request 無法被 Merge,代表您所改的內容與目前遠端的 master 內容有衝突。此時必須在本地端
~/git/brt(22321-enhance-performace)$ git pull --rebase origin master
並且修正衝突,再重新 push 至遠端 branch。(請查看修正衝突章節)
One Issue, one Branch
完成議題單後,切回 master 並更新遠端
8
完成議題單並發送 Merge Request 後,此議題單將等待 SA 或 Team Lead review 後併回 master。
若要修改另外一張議題單,先切回 master 更新遠端異動內容後,在開另外一個 branch。
~/git/brt(22321-enhance-performace)$ git checkout master //回到 master
~/git/brt(master)$ git pull --rebase origin master //更新遠端內容
~/git/brt(master)$ git checkout -b 33210-redesign-page //再開另外一張議題單
總結
修改議題單流程
~/git/brt(master)$ git checkout master //回到 master
~/git/brt(master)$ git pull --rebase origin master //更新遠端內容
~/git/brt(master)$ git checkout -b 22321-enhance-performace //開議題單
programing...programing...
~/git/brt(22321-enhance-performace)$ git add --all
~/git/brt(22321-enhance-performace)$ git commit -m "remove redundant for loop." //commit至本地端
~/git/brt(22321-enhance-performace)$ git push origin 22321-enhance-performace //push 至遠端
至 GitLab 發送 Merge Request 等待 merge...
~/git/brt(master)$ git checkout master //再回到 master
~/git/brt(master)$ git pull --rebase origin master //更新遠端內容
~/git/brt(master)$ git checkout -b 33210-redesign-page //再開另外一張議題單
..............
常見問題
已經送出 Merge Request,突然發現還需要修正那怎麼辦?
- 如果此 Merge Request 尚未 merge 至 master,可在本地端切到該 branch,持續修正問題並 commit ,再重新 push 至遠端 branch。此動作遠端的 Merge Request 即會立即更新。
~/git/brt(master)$ git checkout 22321-enhance-performace //回到該議題單
修正修正修正...
~/git/brt(22321-enhance-performace)$ git add --all
~/git/brt(22321-enhance-performace)$ git commit -m "adjust query sql syntax."
~/git/brt(22321-enhance-performace)$ git push origin 22321-enhance-performace
-
如果此 Merge Request 已經 merge 至 master,請重新在本地端開另外一個 branch 修正,並重發另外一個 Merge Request。
常見問題
議題單改到一半,突然需要先修改另外一張緊急的議題單時怎麼辦?
- 將目前修改到一半的內容暫時先 commit,再切到新的議題單 branch。
~/git/brt(22321-enhance-performace)$ git add --all
~/git/brt(22321-enhance-performace)$ git commit -m "[WIP] temp commit." // 先暫時 commit.
~/git/brt(22321-enhance-performace)$ git checkout master
~/git/brt(master)$ git pull --rebase origin master
~/git/brt(master)$ git pull checkout -b 45422-adjust-sql
等新的議題單處理完之後,回到原本議題單的 branch,reset 至暫時 commit 的前一個 commit,此時修改的內容將回到尚未 commit 之前。
~/git/brt(master)$ git checkout 22321-enhance-performace
~/git/brt(22321-enhance-performace)$ git reset HEAD^
//所有之前修改的內容將回到尚未 git add, git commit 前。
繼續修改程式...
- 也可以使用 git stash
其他常用 Git Command
List which files are staged, unstaged, and untracked.
List commit history.
在尚未 git add 前,將修改的檔案恢復到尚未修改的狀態。
將檔案恢復到某個版本。
將 staged 的檔案恢復至 unstaged。
將專案回到某個 commit。
git reset <SHA1> // 將專案回到某個 commit,異動的內容為 unstaged.
git reset --soft <SHA1> // 將專案回到某個 commit,異動的內容為 staged.
git reset --hard <SHA1> // 將專案回到某個 commit,捨棄所有的異動內容.
修改 commit 的歷史紀錄。(參考連結)
回到某個版本日誌。(參考連結)
如何解決衝突
先了解 pull --rebase origin master
先了解 pull --rebase origin master
在本例子當中,若遠端修正的內容與本地端 branch 修正的內容剛好改到同個檔案同一行,則發送的 Merge Request 將會被 GitLab 標示成不能 Auto Merge。
此時就必須要在本地端的 branch 先做 pull --rebase origin master
~/git/brt(22321-enhance-performace)$ git pull --rebase origin master
先了解 pull --rebase origin master
衝突產生拉!
說明:
git rebase --continue //人工解決衝突後,繼續 apply 下一個 commit
git rebase --abort //放棄,回到還沒 pull --rebase 之前
解決衝突
方法一:直接修改 conflict 的檔案
遠端的修正
本地端的修正
修改完之後,將修正的檔案進去 staged (git add),並 git rebase --continue 繼續 apply 下一個 commit.
解決衝突
方法二:使用 TortoiseGit
在專案上按右鍵,選擇 Git Commit 後,將會看到衝突的檔案
解決衝突
方法二:使用 TortoiseGit
在衝突的檔案上按右鍵,選擇 Edit conflicts,開始要來解決衝突
解決衝突
方法二:使用 TortoiseGit
由於 rebase 是先切到 origin/master,再去 apply 本地 branch 上的每一個 commit,所以請特別注意 Theirs 代表本地的 branch,Mine 代表遠端的 master。
解決衝突
方法二:使用 TortoiseGit
解決完每一個衝突,點選綠色勾勾 (Mark as resolved),之後再回到 Git Bash 打入 git rebase --continue 繼續 apply 下一個 commit。
解決衝突
方法二:使用 TortoiseGit
在下面的區塊按右鍵,可用來決定最後解決衝突要使用的版本 (Theirs or Mine),當然也可兩個都不選直接編輯。
參考資源
git
By JengHung Chen
git
- 3,458