發表文章

目前顯示的是有「git」標籤的文章

git 挑選特定commit合併

圖片
  前言 目前的專案,git分支,切分為如下: master : 由release併入,發行到PRD release : 由develop併入,發行到QAS develop : 由個別開發者併入。 問題來了! 這兩天併入到release的變更,只想挑最上方那一筆紅框併入到master,其他的綠框不可以併入。如下圖所示: 解決方式 使用cherry-pick 挑選某一筆的commit併入。 使用方式 切換到master 或master checkout另一分支hoftix(本文使用此方式,可以避免操作錯誤,刪除就好) 。 取得該筆的commit ID 8碼。 在hotfix分支執行命令 git cherry-pick e957cc4e 4 . 完成畫面,只有Finished那筆commit併入 最後確認無誤的話,就可以從hotfix併入master 總結 cherry-pick 是一個很好的工具,可以幫助你精確地應用某些 commit,但在使用時需要小心,它不適合複雜的歷史操作,特別是處理依賴關係和衝突的情況。

發行前取得分支併入目前程式

圖片
前言 目前開發的專案,發行工作大部分是由CI來處理,但在某些狀況下,為求快速,會直接在Visual Studio上,發行到測試主機上。天下武功、唯快不破......,但"快"容易打破碗。 今天同事A,在本機發行時,並未取得遠端開發分支來合併,導致同事B在測試時,發生鬼打牆事件。為避免之後還有此情況,在發行檔案內,加了一個發行前,先取得分支來合併的設定。 使用方式 打開.pubxml 增加如下 <PropertyGroup> .......以上略 <PipelineDependsOn> CustomActionsBeforeBuild; $(PipelineDependsOn); </PipelineDependsOn> </PropertyGroup> <Target Name="CustomActionsBeforeBuild" BeforeTargets="BeforeBuild"> <Message Text="********************************** BeforeBuild-發行前 取得遠端Main,合併到目前分支 ***********************************" Importance="high"/> <Exec Command="git merge origin/main"/> </Target> 測試 發行程式,在"輸出"視窗,可以看到在建置時,觸發了commad的訊息。 總結 只要是人為的操作,難免會有操作錯誤的行為,所以可以透過設定自動化來解決的工作,可以省下日後不少麻煩。 相關參考 https://stackoverflow.com/questions/35688836/how-to-redirect-powershell-errors-in-pubxml-file-to-error-window Github  原始檔下載

git 修改最後一次的commit

圖片
  前言 你是否會常commit了變更後,發現少寫了什麼或某段程式寫錯了,然後就會修改後,再commit一次,假設你又跟我一樣常犯傻,剛的情況又來一次的話, history就會長得如下3個commit,多了v2,v3 。 解決方法 針對commit了,又後悔想修改的話,針對幾個情境的解決方式。 1. 修改/新增併入最近的commit 如前言所述,最近的commit為“訂單新增API v3”,如圖,我想再將修改內容,併入v3的commit。 使用方式 將修改的先加入暫存區 (同Visual Studio 加入到stage) git add --all 簽入加上參數 –amend –no-edit git commit --amend --no-edit -–amend: 將暫存區的加入最近一次的commit -–no-eidt: 不需要commit message commit沒有增加,但內容已由v3變成 v3-1 2.修改最近commit的訊息 有時簽入時,才發現訊息寫錯了,想修改該如何做? 本例示範將“訂單新增API v3” 改成“訂單新增API v3 OK ” 使用方式 簽入加上參數 --amend -m 參數 git commit --amend -m “訂單新增API v3 OK” 一樣是3個commit,但最後一個訊息已加上“OK” 注意事項 上述的兩種方式,其實都是撒掉前一次的commit,再換一個新的commit,仔細看的話,ID是不一樣的。在本地的commit可以任意使用,但針對 已push出去的commit ,儘量 不要這樣用 ,以免造成別人在處理衝突的困擾。 總結 以上兩個指令,可以大量減少一些不必要的commit,讓整個歷史記錄更清楚明瞭。 白話文:可以簽了又簽、簽了又簽,還是一個commit。 相關參考 git 修改歷史訊息

AzureDevOps-還原已刪除的Git 分支

圖片
今天同事要找的相關程式碼,前陣子我以為不會再用到,就把它刪除了。試著要在本機的git下reflog,看可不可以找到分支的commit ID來還原,但...已過了期限(預設保留30天),找不到。 本機找不到,就往上找找,幸好AzureDevOps有提供還原已刪除的方式 還原方式 進入Branches,在搜尋輸入已刪除分支的 完整名稱, 找到後就可以還原回來了。 其它參考 https://docs.microsoft.com/zh-tw/azure/devops/repos/git/restore-deleted-branch?view=azure-devops https://gitbook.tw/chapters/branch/restore-deleted-but-unmerged-branch.html

git 修改歷史訊息

圖片
前言     之前同事有問,如何修改commit的訊息? 當下不會,所以只好使用其他非正統方式處理....。這次換自己有此需求,順便將此技能修成。 如何修改 有2種情況,需使用不同的方式修改。 1.要修改的訊息為最新的一筆commit 使用--amend 修改 git commit --amend -m "third by amend" 修改後,commit 的ID會重新計算一個新的 2.修改歷史記錄的某一筆。 本例:修改紅框的seond2,綠色指標為待會 rebase的 Commit ID git rebase -i 4e1d5be 執行後會跳出Vim 編輯器畫面,將第一行的pick改成reword (修改訊息的命令)    儲存後,關閉會再跳出另一個Vim 編輯器畫面,此時就可以直接修改你要的訊息了,紅框為我本次加入的 再次查看,結果如下 3.修改第一筆commit (init) 第2點的命令無法修改init的commit,只能修改在它之後的commit。解決如下命令,其他動作一樣。 git rebase --onto HEAD HEAD master 其它參考 修改 Commit 紀錄 修改歷史訊息

AzureDevOps-透過Command Merge

環境 AzureDevOps Jenkins git 問題     目前的專案每天中午會透過手動的方式,固定發pull request將develop分支併到relesae。由於是常態性質,大部份是不需要review,所以一來浪費時間,二來有時一忙就會忘了作=.=。 解決方式 經測試後,可以透過command及Jenkins的建置工作來完成每日自動合併,以下為測試後的2種方式 (使用jenkins pipeline) 1.使用merge的方式 withCredentials([usernamePassword(credentialsId: '0f57466e-8dc0-444b-a88a-d56d663d3378', usernameVariable: 'username', passwordVariable: 'password')]){     bat "git pull https://${username}:${password}@xxx.visualstudio.com/KimGitLab/_git/KimGitLab"     bat "git merge origin/develop"     bat "git push https://${username}:${password}@xxx.visualstudio.com/KimGitLab/_git/KimGitLab" } 透過withCredentials取得在Jenins上已儲存的AzureDevOps token pull回來後,merge orgin/devlop到本地的release 在pull到遠端 2.使用Pull Request的方式 前面第1點雖然可以每天合併分支,但缺點是在release分支上無法看出develop每次併回來的commit有哪些。而pull request則可以。 安裝VSTS CLI 裝完後要重開機 VSTS CLI Command Sample withCredentials([...

git SSH學習

圖片
大部份的Git Server都有提供SSH Clone(透過命令Clone)專案的方式,先決條件是本地要先建位好SSH Key,以下為使用github帳號建立 如何建立SSH 1.使用Git bash ssh-keygen -t rsa -b 4096 -C "kimxinfo@gmail.com" 此步驟會要求你輸入2次密碼,保持空值也可以 (目前使用kimxxx) 另外要求你儲存的位置:保持空值的話,預設:C:\Users\Kim\.ssh\id_rsa 2.加入代理 eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa 將SSH Key 加到Github上 1.將產生的key複製到剪貼簿 clip < ~/.ssh/id_rsa.pub 2.新增SSH到Github https://github.com/settings/keys 2.1 若用的Azure DevOps(VSO),到個人帳號/Security/SSH public keys 測試用SSH Clone的方式 到Github任一個Public的專案,在右方的Clone or download切換到SSH 開啟Command,輸入如下,即可以將程式Clone回來 git clone  git@github.com:kimx/SqlLiteLab.git 若你的key有輸入密碼,這裡會提示你要輸入 多組SSH Key 應用情境,例如:Github及AzureOps各建立了一組,當你在Clone時預設會用第一個建立的id_rsa,若要用對應不同的SSH Key,參考如下: 第一個為github.com,第二個則是AzureOps Host github.com     HostName github.com     User kimxinfo@gmail.com     IdentityFile ~/.ssh/id_rsa   ...

Jenkins - AzureDevOps簽入後觸發工作-git

圖片
闗於在Azure DevOps簽入即觸發建置,之前有寫過一篇是使用TFS的方式。最近公司要改成使用git的方式,所以再來演練記錄一下。 Azure DevOps設定 1.Clone repository 取得https的網址 2.建立Personal Access Token 此Token為Jenkins checkout 所使用 3.新增Service hook-簽入及建置工作 Project Settings>Service hooks  選擇要Trigger的Repository及Branch 這邊的User Name 及API Token 使用的是在Jenkins上建立的 ps:Integration Level 要選 Build-in Jenkins API,這應該是自架Jenkins的選項 Jenkins設定 原始檔控制,選擇git並輸入網址及加入剛建立的git Credentials的帳號密碼 參考來源 https://docs.microsoft.com/en-us/azure/devops/service-hooks/services/jenkins?view=vsts