diff --git a/server/git/pull_request_example.go b/server/git/pull_request_example.go
new file mode 100644
index 0000000..5e34dc4
--- /dev/null
+++ b/server/git/pull_request_example.go
@@ -0,0 +1,248 @@
+package git
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"net/http"
+	"time"
+)
+
+// ExamplePullRequestUsage demonstrates how to use the pull request capabilities
+func ExamplePullRequestUsage() {
+	ctx := context.Background()
+
+	// Example 1: GitHub Pull Requests
+	exampleGitHubPullRequests(ctx)
+
+	// Example 2: Gerrit Pull Requests
+	exampleGerritPullRequests(ctx)
+}
+
+func exampleGitHubPullRequests(ctx context.Context) {
+	fmt.Println("=== GitHub Pull Request Example ===")
+
+	// Create GitHub configuration
+	githubConfig := GitHubConfig{
+		Token:      "your-github-token-here",
+		BaseURL:    "https://api.github.com",
+		HTTPClient: &http.Client{Timeout: 30 * time.Second},
+	}
+
+	// Create GitHub pull request provider
+	githubProvider := NewGitHubPullRequestProvider("owner", "repo", githubConfig)
+
+	// Create Git instance with GitHub pull request capabilities
+	git := NewGitWithPullRequests("/path/to/repo", GitConfig{
+		Timeout: 30 * time.Second,
+	}, githubProvider)
+
+	// Create a new pull request
+	prOptions := PullRequestOptions{
+		Title:       "Add new feature",
+		Description: "This PR adds a new feature to the application.",
+		BaseBranch:  "main",
+		HeadBranch:  "feature/new-feature",
+		Labels:      []string{"enhancement", "feature"},
+		Assignees:   []string{"username1", "username2"},
+		Reviewers:   []string{"reviewer1", "reviewer2"},
+		Draft:       false,
+	}
+
+	pr, err := git.CreatePullRequest(ctx, prOptions)
+	if err != nil {
+		log.Printf("Failed to create pull request: %v", err)
+		return
+	}
+
+	fmt.Printf("Created pull request: %s (#%d)\n", pr.Title, pr.Number)
+
+	// List pull requests
+	listOptions := ListPullRequestOptions{
+		State:      "open",
+		Author:     "username",
+		BaseBranch: "main",
+		Limit:      10,
+	}
+
+	prs, err := git.ListPullRequests(ctx, listOptions)
+	if err != nil {
+		log.Printf("Failed to list pull requests: %v", err)
+		return
+	}
+
+	fmt.Printf("Found %d pull requests\n", len(prs))
+
+	// Get a specific pull request
+	pr, err = git.GetPullRequest(ctx, pr.ID)
+	if err != nil {
+		log.Printf("Failed to get pull request: %v", err)
+		return
+	}
+
+	fmt.Printf("Pull request status: %s\n", pr.State)
+
+	// Update a pull request
+	updateOptions := PullRequestOptions{
+		Title:       "Updated title",
+		Description: "Updated description",
+		Labels:      []string{"bug", "urgent"},
+	}
+
+	updatedPR, err := git.UpdatePullRequest(ctx, pr.ID, updateOptions)
+	if err != nil {
+		log.Printf("Failed to update pull request: %v", err)
+		return
+	}
+
+	fmt.Printf("Updated pull request: %s\n", updatedPR.Title)
+
+	// Merge a pull request
+	mergeOptions := MergePullRequestOptions{
+		MergeMethod: "squash",
+		CommitTitle: "Merge pull request #123",
+		CommitMsg:   "This merges the feature branch into main",
+	}
+
+	err = git.MergePullRequest(ctx, pr.ID, mergeOptions)
+	if err != nil {
+		log.Printf("Failed to merge pull request: %v", err)
+		return
+	}
+
+	fmt.Println("Pull request merged successfully")
+}
+
+func exampleGerritPullRequests(ctx context.Context) {
+	fmt.Println("=== Gerrit Pull Request Example ===")
+
+	// Create Gerrit configuration
+	gerritConfig := GerritConfig{
+		Username:   "your-username",
+		Password:   "your-http-password-or-api-token",
+		BaseURL:    "https://gerrit.example.com",
+		HTTPClient: &http.Client{Timeout: 30 * time.Second},
+	}
+
+	// Create Gerrit pull request provider
+	gerritProvider := NewGerritPullRequestProvider("project-name", gerritConfig)
+
+	// Create Git instance with Gerrit pull request capabilities
+	git := NewGitWithPullRequests("/path/to/repo", GitConfig{
+		Timeout: 30 * time.Second,
+	}, gerritProvider)
+
+	// Create a new change (pull request)
+	prOptions := PullRequestOptions{
+		Title:       "Add new feature",
+		Description: "This change adds a new feature to the application.",
+		BaseBranch:  "master",
+		HeadBranch:  "feature/new-feature",
+	}
+
+	pr, err := git.CreatePullRequest(ctx, prOptions)
+	if err != nil {
+		log.Printf("Failed to create change: %v", err)
+		return
+	}
+
+	fmt.Printf("Created change: %s (#%d)\n", pr.Title, pr.Number)
+
+	// List changes
+	listOptions := ListPullRequestOptions{
+		State:      "open",
+		Author:     "username",
+		BaseBranch: "master",
+		Limit:      10,
+	}
+
+	prs, err := git.ListPullRequests(ctx, listOptions)
+	if err != nil {
+		log.Printf("Failed to list changes: %v", err)
+		return
+	}
+
+	fmt.Printf("Found %d changes\n", len(prs))
+
+	// Get a specific change
+	pr, err = git.GetPullRequest(ctx, pr.ID)
+	if err != nil {
+		log.Printf("Failed to get change: %v", err)
+		return
+	}
+
+	fmt.Printf("Change status: %s\n", pr.State)
+
+	// Update a change
+	updateOptions := PullRequestOptions{
+		Title:       "Updated title",
+		Description: "Updated description",
+	}
+
+	updatedPR, err := git.UpdatePullRequest(ctx, pr.ID, updateOptions)
+	if err != nil {
+		log.Printf("Failed to update change: %v", err)
+		return
+	}
+
+	fmt.Printf("Updated change: %s\n", updatedPR.Title)
+
+	// Submit a change (merge)
+	mergeOptions := MergePullRequestOptions{
+		CommitTitle: "Submit change",
+		CommitMsg:   "This submits the change to master",
+	}
+
+	err = git.MergePullRequest(ctx, pr.ID, mergeOptions)
+	if err != nil {
+		log.Printf("Failed to submit change: %v", err)
+		return
+	}
+
+	fmt.Println("Change submitted successfully")
+}
+
+// Example of using both providers in the same application
+func ExampleMultiProviderUsage() {
+	ctx := context.Background()
+
+	// Determine which provider to use based on configuration
+	useGitHub := true // This could come from config
+
+	var git GitInterface
+
+	if useGitHub {
+		// Use GitHub
+		githubConfig := GitHubConfig{
+			Token:   "github-token",
+			BaseURL: "https://api.github.com",
+		}
+		githubProvider := NewGitHubPullRequestProvider("owner", "repo", githubConfig)
+		git = NewGitWithPullRequests("/path/to/repo", GitConfig{}, githubProvider)
+	} else {
+		// Use Gerrit
+		gerritConfig := GerritConfig{
+			Username: "gerrit-username",
+			Password: "gerrit-password",
+			BaseURL:  "https://gerrit.example.com",
+		}
+		gerritProvider := NewGerritPullRequestProvider("project", gerritConfig)
+		git = NewGitWithPullRequests("/path/to/repo", GitConfig{}, gerritProvider)
+	}
+
+	// Use the same interface regardless of provider
+	prOptions := PullRequestOptions{
+		Title:       "Cross-platform PR",
+		Description: "This works with both GitHub and Gerrit",
+		BaseBranch:  "main",
+		HeadBranch:  "feature/cross-platform",
+	}
+
+	pr, err := git.CreatePullRequest(ctx, prOptions)
+	if err != nil {
+		log.Printf("Failed to create pull request: %v", err)
+		return
+	}
+
+	fmt.Printf("Created pull request: %s\n", pr.Title)
+}
