Skip to content

Latest commit

 

History

History
153 lines (110 loc) · 6.05 KB

test.md

File metadata and controls

153 lines (110 loc) · 6.05 KB

Decision Document: Ensuring Patch Synchronization Across Branches

Objective

To create a reliable process or GitHub Action to ensure that patches applied to upstream branches (e.g., master, staging, qa) are also present in lower branches. This aims to prevent divergences and maintain consistency across the branch hierarchy.


Approaches

1. Validation-Only Approach

  • What It Does:
    Validates if the lower branch (e.g., development) contains all commits from the upstream branch (e.g., qa), but it does not actively synchronize them.

  • How It Works:

    • Use git merge-base --is-ancestor to verify if the upstream branch's latest commit is an ancestor of the lower branch.
    • Optionally use git diff to compare the branch states.
  • Implementation Example:

    git fetch origin
    git merge-base --is-ancestor origin/<upstream-branch> HEAD || exit 1
  • Pros:

    • Lightweight and efficient for simple branch hierarchies.
    • No risk of unintended merges or changes.
    • Easy to implement with minimal configuration.
  • Cons:

    • Does not ensure synchronization—it only detects inconsistencies.
    • Merge commits or cherry-picked commits can lead to false negatives/positives.
    • Conflicts are detected but not resolved.
  • Best Use Case:
    Teams that prefer to handle patch synchronization manually and want to block PRs that do not include upstream patches.


2. Full-State Validation with git diff

  • What It Does:
    Compares the entire state of the upstream and lower branches to check if they are identical or mergeable.

  • How It Works:

    • Fetch the latest upstream branch and compare its state with the lower branch using git diff --quiet.
  • Implementation Example:

    git fetch origin
    git diff --quiet origin/<upstream-branch> || exit 1
  • Pros:

    • Ensures the exact content of upstream commits is reflected in the lower branch.
    • Handles scenarios where merge commits or cherry-picked commits might otherwise pass validation-only checks.
  • Cons:

    • Slightly more resource-intensive than validation-only.
    • Does not automate synchronization; requires manual intervention for detected differences.
  • Best Use Case:
    Teams that want stricter enforcement of patch consistency without automation.


3. Automatic Synchronization

  • What It Does:
    Automatically merges or pulls changes from the upstream branch into the lower branch, ensuring synchronization.

  • How It Works:

    • Use git merge or git pull to incorporate changes.
    • Handle conflicts manually or with a predefined strategy.
  • Implementation Example:

    git fetch origin
    git merge origin/<upstream-branch> || exit 1
    git push origin HEAD
  • Pros:

    • Guarantees synchronization across branches.
    • Reduces manual effort for developers.
  • Cons:

    • Requires robust conflict resolution processes.
    • Risk of overwriting changes in lower branches if not carefully managed.
    • Adds complexity to CI/CD workflows.
  • Best Use Case:
    Teams with disciplined workflows and confidence in automated conflict handling.


4. GitHub Mergeability API Check

  • What It Does:
    Uses GitHub’s Mergeability API to check if the lower branch can merge cleanly with the upstream branch.

  • How It Works:

    • Query GitHub’s API to test if the upstream branch is mergeable into the lower branch.
  • Implementation Example:

    curl -X GET     -H "Authorization: token <YOUR_GITHUB_TOKEN>"     "https://api.github.com/repos/<owner>/<repo>/merges?base=<lower-branch>&head=<upstream-branch>"
  • Pros:

    • Directly leverages GitHub’s built-in mergeability logic.
    • Integrates seamlessly with GitHub workflows.
  • Cons:

    • Requires API tokens and network access.
    • Limited flexibility compared to local Git commands.
    • Cannot ensure synchronization, only mergeability.
  • Best Use Case:
    Teams with complex branching strategies that frequently rely on GitHub’s PR interface.


Comparison Table

Approach Ensures Sync? Detects Conflicts? Automates Resolution? Complexity Performance Impact
Validation-Only (merge-base) No Yes No Low Low
Full-State Validation (diff) No Yes No Medium Medium
Automatic Synchronization Yes Yes Yes (Partial) High Medium
GitHub Mergeability API No Yes No Medium Low

Recommendations

  1. Primary Option: Validation-Only with merge-base

    • Use this approach for simplicity and efficiency if manual synchronization is acceptable.
    • Ideal for teams that want lightweight checks without automating merges.
  2. Enhanced Option: Full-State Validation with git diff

    • Use this approach for stricter enforcement of branch consistency.
    • Ideal for teams that can tolerate slightly higher resource usage for better accuracy.
  3. Advanced Option: Automatic Synchronization

    • Use this if your team is ready to adopt automated merging and handle potential conflicts proactively.
    • Ideal for teams with mature CI/CD processes and a disciplined branching strategy.
  4. Optional: GitHub Mergeability API

    • Use this as a complementary tool to validate mergeability for PR workflows, especially in GitHub-native teams.

Conclusion

For most teams, starting with validation-only or full-state validation is recommended. As the team and workflow mature, you can consider adopting automatic synchronization or integrating the GitHub Mergeability API for enhanced automation.