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 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