package util import ( "errors" "os" "os/exec" "strings" ) // GitPull 拉取代码,丢弃本地修改 func GitPull() error { workDir, err := os.Getwd() if err != nil { return err } // 先强制重置本地更改 resetCmd := exec.Command("git", "reset", "--hard", "HEAD") resetCmd.Dir = workDir resetOutput, err := resetCmd.CombinedOutput() if err != nil { return errors.New(string(resetOutput) + err.Error()) } // 获取当前分支名 branchCmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD") branchCmd.Dir = workDir branchOutput, err := branchCmd.CombinedOutput() if err != nil { return errors.New(string(branchOutput) + err.Error()) } currentBranch := strings.TrimSpace(string(branchOutput)) // 移除换行符和空格 // 获取远程仓库名,通常是origin remoteCmd := exec.Command("git", "remote") remoteCmd.Dir = workDir remoteOutput, err := remoteCmd.CombinedOutput() if err != nil { return errors.New(string(remoteOutput) + err.Error()) } remoteName := "origin" // 默认使用origin,如果没有远程仓库则使用默认值 if len(remoteOutput) > 0 { remoteName = strings.TrimSpace(string(remoteOutput)) } // 先获取所有远程分支最新信息 fetchCmd := exec.Command("git", "fetch", "--all") fetchCmd.Dir = workDir fetchOutput, err := fetchCmd.CombinedOutput() if err != nil { return errors.New(string(fetchOutput) + err.Error()) } // 构建远程分支引用 remoteBranch := remoteName + "/" + currentBranch // 检查远程分支是否存在 checkRemoteCmd := exec.Command("git", "rev-parse", "--verify", remoteBranch) checkRemoteCmd.Dir = workDir if checkRemoteErr := checkRemoteCmd.Run(); checkRemoteErr != nil { // 远程分支不存在,只进行本地重置 return nil } // 强制重置当前分支到远程分支(处理远程分支被force push的情况) forceResetCmd := exec.Command("git", "reset", "--hard", remoteBranch) forceResetCmd.Dir = workDir forceResetOutput, err := forceResetCmd.CombinedOutput() if err != nil { return errors.New(string(forceResetOutput) + err.Error()) } return nil }