#!/bin/sh # SPDX-License-Identifier: MIT set -eu export TZ=UTC LC_ALL=C export GIT_CONFIG_NOSYSTEM=1 GIT_CONFIG_GLOBAL=/dev/null export GIT_AUTHOR_NAME='Example Author' GIT_AUTHOR_EMAIL='author@example.invalid' export GIT_COMMITTER_NAME='Example Author' GIT_COMMITTER_EMAIL='author@example.invalid' export GIT_AUTHOR_DATE='2026-10-27T12:00:00+00:00' export GIT_COMMITTER_DATE='2026-10-27T12:00:00+00:00' test "$(git version)" = 'git version 2.56.0' mkdir fetch-example cd fetch-example git init --template= --bare -q --initial-branch=main origin.git git init --template= -q --initial-branch=main publisher cd publisher printf 'base\n' > note.txt git add note.txt git commit -qm 'Base' git remote add origin ../origin.git git push -q -u origin main >/dev/null cd .. git clone --template= -q origin.git reader cd publisher printf 'upstream\n' >> note.txt git commit -qam 'Upstream change' git push -q origin main cd ../reader before=$(git rev-parse HEAD) git fetch -q origin test "$(git rev-parse HEAD)" = "$before" test "$(git rev-list --count HEAD..origin/main)" = 1 printf 'Fetch kept HEAD; incoming commits: ' git rev-list --count HEAD..origin/main git pull --ff-only -q origin main >/dev/null test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)" printf 'Fast-forward pull integrated the fetched commit\n' cd .. git clone --template= -q origin.git merge-client git clone --template= -q origin.git rebase-client for client in merge-client rebase-client; do (cd "$client" && printf 'local\n' > local.txt && git add local.txt && git commit -qm 'Local change') done cd publisher printf 'remote\n' > remote.txt git add remote.txt git commit -qm 'Another upstream change' git push -q origin main cd ../merge-client git pull -q --no-rebase --no-edit origin main >/dev/null test "$(git rev-list --parents -n 1 HEAD | wc -w | tr -d ' ')" = 3 printf 'Merge pull created a commit with two parents\n' cd ../rebase-client git pull -q --rebase origin main >/dev/null 2>&1 test "$(git log -1 --format=%s)" = 'Local change' test "$(git log -2 --format=%s | tail -1)" = 'Another upstream change' printf 'Rebase pull replayed the local commit after upstream\n'