Git分支基本命令+coding webhook+lnmp

  • 查看當前項目的遠程地址:
    • git remote -v
  • 查看遠程地址全部分支:
    • git branch -a 或者 git branch -r
  • 查看本地分支與遠程分支的映射關係:
    • git branch -vv
 
新建分支和建立映射的方式:
一:
  • 新建分支:
    • git branch  xxx 
    • git checkout xxx
  • 新建分支,並切換到該分支:git checkout -b issue1
  • 當前分支與遠程分支建立映射關係(文件跟蹤):
    • git branch -u origin/addFile  或者 
    • git branch --set-upstream-to origin/issue1
  • 解除映射關係:git branch --unset-upstream
  •  
  • PS : 本地分支與遠程分支能夠不一樣名
二:
  • 在本地新建分支,並自動切換到該分支;創建本地分支和遠程分支的映射關係:
    • git checkout -b 本地分支名x origin/遠程分支名x       
三:
  • 在本地新建分支,不切換到該分支;不創建遠程映射關係:
    • git fetch origin  遠程分支名x:本地分支名x
 
分支的修改提交:
  • git add
  • git commit -m "註釋"
  • 以上兩個命令的合併寫法:git commit -a -m "註釋"
 
分支的推送:
  • git push origin 本地分支x:遠程分支x
  • 分支已有映射關係:git push
 
合併分支:
  • 切換到主分支或者測試分支(master或者develop)
    • git checkout develop
    • git merge hotfix
 
解決合併多個分支時的衝突:
  • 主分支中執行:
    • 獲取當前分支狀態:
      • git status
    • 選擇解決衝突原始工具:
      • git mergetool
      • vimdiff (工具解決衝突保存完成層後,確認已解決,自動存入緩存區)或者使用IDE解決衝突後,主動添加到緩存區(git add ./)
    • 衝突解決完成後,提交文件:
      • git commit 
 
IDE解決衝突,phpstorm爲例:
 
 
分支完成開發使命後的刪除:
  • 刪除本地分支:
    • git branch -d xxx
    • 強制刪除:git branch -D XXX
  • 刪除遠程分支:
    • git push origin --delete hotfix
    • git push origin :br  (origin 後面有空格)
  • 刪除a目錄下的2.txt文件
    • git rm -r --cached a/2.txt
  • 刪除a目錄
    • git rm -r --cached a
    • git commit -m "刪除a目錄下的2.txt文件" 
    • git push
  • Note: 用-r參數刪除目錄, git rm --cached a.txt 刪除的是本地倉庫中的文件,且本地工做區的文件會保留且再也不與遠程倉庫發生跟蹤關係,若是本地倉庫中的文件也要刪除則用git rm a.txt
 
分支代碼回滾:
  • 本地代碼庫分支回滾:
    • git reset --hard commit-id :回滾到commit-id,講commit-id以後提交的commit都去除
    • git reset --hard HEAD~3:將最近3次的提交回滾
  • 遠程代碼庫回滾:
    • 這個是重點要說的內容,過程比本地回滾要複雜
    • 應用場景:自動部署系統發佈後發現問題,須要回滾到某一個commit,再從新發布
    • 原理:先將本地分支退回到某個commit,刪除遠程分支,再從新push本地分支
    • 操做步驟:
    • git checkout the_branch
    • git pull
    • git branch the_branch_backup //備份一下這個分支當前的狀況
    • git reset --hard the_commit_id //把the_branch本地回滾到the_commit_id
    • git push origin :the_branch //刪除遠程 the_branch
    • git push origin the_branch //用回滾後的本地分支從新創建遠程分支
    • git push origin :the_branch_backup //若是前面都成功了,刪除這個備份分支
    • 若是使用了gerrit作遠程代碼中心庫和code review平臺,須要確保操做git的用戶具有分支的push權限,而且選擇了 Force Push選項(在push權限設置裏有這個選項)
 
 
服務器上部署Git 並建立 webhook:
    • 使用php執行webhook,注意事項:
      • linux下php的執行用戶,權限;
      • 切記hook操做的目標文件,不要用高權限用戶修改或者pull等操做(例root),不然會形成hook失效,後面再思考是否能夠避免這樣的狀況。
      • 作鉤子大可能是走 ssh 協議, 須要coding 裏配置部署公鑰
        • hook前期的配置工做:
          • 生成 當前設備、php執行用戶 公鑰,配置至coding的應用公鑰和部署公鑰中,可參考coding - ssh公鑰生成文檔 https://coding.net/help/doc/git/ssh-key.html#i-4
          • clone git倉庫ssh地址(容許後續hook文件的免密拉取代碼操做)
            • BTW:若是項目一開始採用https協議克隆代碼,可經過: git remote set-url origin <ssh地址>   將https轉化成ssh
            • 若是使用tortoise git等三方工具,則需替換默認ssh工具到Git執行文件,以tortoise git爲例:
Setting->network->SSH
C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe
替換爲本地Git執行文件路徑
X:\Program Files\Git\usr\bin\ssh.exe
          • 編寫webhook文件,給一個簡單的示例:
<?php
error_reporting(1);
$output = shell_exec('id -a');//判斷是不是www:www在執行
$action_user = "<pre>$output</pre>";
file_put_contents('./log/user_action.log',"USER_ACTION::".$action_user.$output. PHP_EOL , FILE_APPEND);
 
$target = '/usr/local/nginx/html/git_work/forecast_admin/forecast'; // 測試環境web目錄
$token = 'forecast'; //token校驗暫不啓用
$wwwUser = 'www';
$wwwGroup = 'www';
 
 
$json = json_decode(file_get_contents('php://input'), true);
file_put_contents('./log/user_action.log',"HOOK_DATA::".file_get_contents('php://input'). PHP_EOL , FILE_APPEND);
 
 
$cmds = array(
    "cd $target && git pull origin develop",
    "chown -R {$wwwUser}:{$wwwGroup} $target/", 
);
 
 
foreach ($cmds as $cmd) {
    $shellExec = shell_exec($cmd);
 
    if($shellExec == NULL) {
        file_put_contents('./log/test_try2.log', 'shell success'.$cmd, FILE_APPEND);
    } else {
        file_put_contents('./log/test_try_error.log', 'shell false'.$cmd, FILE_APPEND);
    }
}
        • 根據實際狀況,按照以上git分支的方法操做本地和遠程分支,就ok噠
 
 
此外,關於git webhook和php發佈 待了解的兩個公共包:

1.composer  cpliakas/git-wrapperphp

2.composer  deploy
相關文章
相關標籤/搜索