Git Push, Pull & Repository Synchronization: Complete Beginner's Guide with Real Terminal Examples

Master Git push and pull operations with detailed explanations. Learn upstream branches, authentication, pushing changes to GitHub, pulling updates, and handling repository synchronization conflicts.

19 min read

Ready to synchronize your local work with GitHub? After connecting your local repository to GitHub, it's time to learn how to push your changes to the cloud and pull updates from remote repositories. This tutorial follows a real terminal session with detailed explanations of every command and authentication step.

💡

🎯 What You'll Learn: In this comprehensive guide, you'll discover:

  • Understanding upstream branches and tracking relationships
  • Your first push operation with detailed authentication steps
  • Setting up upstream branches with git push -u
  • Understanding GitHub authentication (username/password flow)
  • Reading and interpreting push operation output
  • Making additional commits and pushing updates
  • Pulling changes from remote repositories with git pull
  • Understanding fast-forward merges and conflict resolution
  • Best practices for push/pull workflows and team collaboration

Prerequisites: Local repository connected to GitHub remote

🚀 Understanding Push Operations

What Happens When You Try to Push?

Let's start where we left off - we have a local repository with commits but haven't pushed anything to GitHub yet:

[centos9@vbox seconddemo 23:39:20]$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream hello master

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

What This Error Means:

  • No upstream branch: Your local master branch doesn't know which remote branch to push to
  • Helpful suggestion: Git shows exactly how to fix this with git push --set-upstream
  • Configuration option: Points to a setting that can automate this process

Understanding Upstream Branches

Upstream Branch: A remote branch that your local branch is connected to for push and pull operations.

Why Upstream Matters:

  • Simplified Commands: Once set, you can use just git push and git pull
  • Clear Relationships: Git knows which remote branch corresponds to your local branch
  • Status Information: Git can show if you're ahead or behind the remote
  • Conflict Prevention: Helps prevent pushing to wrong branches

Analogy: Think of upstream like setting a default shipping address. Once configured, you don't need to specify the address every time you ship a package.

🔧 Setting Up Upstream with First Push

The Complete Push Command

Let's push our changes and set up the upstream relationship:

[centos9@vbox seconddemo 23:40:19]$ git push -u hello master
Username for 'https://github.com': owais-io
Password for 'https://owais-io@github.com':
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (7/7), 537 bytes | 268.00 KiB/s, done.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/owais-io/secondproject.git
 * [new branch]      master -> master
branch 'master' set up to track 'hello/master'.

Command Breakdown:

  • git push - The push command
  • -u or --set-upstream - Sets up tracking relationship
  • hello - The remote name (our custom name instead of "origin")
  • master - The local branch we're pushing

Understanding GitHub Authentication

Authentication StepWhat HappensSecurity Note
Username PromptGit asks for your GitHub usernameMust match your GitHub account exactly
Password PromptGit asks for authentication tokenUse Personal Access Token, not account password
Authentication SuccessGit proceeds with the push operationCredentials may be cached for future use
⚠️

⚠️ Important Security Note: As of August 2021, GitHub requires Personal Access Tokens instead of passwords for authentication. The "password" prompt actually expects your Personal Access Token, not your GitHub account password.

Analyzing Push Output

Let's break down what Git tells us during the push:

Output LineMeaningSignificance
Enumerating objects: 7Git identifies all objects to transferIncludes commits, files, and metadata
Counting objects: 100% (7/7)All 7 objects processedProgress indicator for large repositories
Delta compression using up to 4 threadsGit optimizes data transferReduces network bandwidth usage
Compressing objects: 100% (3/3)3 objects were compressedFaster upload and less storage
Writing objects: 537 bytes | 268.00 KiB/sData transfer statisticsShows size and transfer speed
Total 7 (delta 0)7 objects total, 0 delta objectsNo incremental changes (first push)
[new branch] master -> masterCreated new remote branchGitHub now has a master branch
branch 'master' set up to track 'hello/master'Upstream relationship establishedFuture pushes can use just git push

📊 Checking Status After Push

Repository Status with Upstream

Let's see how our repository status has changed:

[centos9@vbox seconddemo 23:40:26]$ git status
On branch master
Your branch is up to date with 'hello/master'.

nothing to commit, working tree clean

Status Analysis:

  • "Your branch is up to date with 'hello/master'" - This is new! Git now knows about the remote branch
  • Tracking relationship: Git can compare local and remote branches
  • Clean state: Everything is synchronized between local and remote

Checking Remote Information

[centos9@vbox seconddemo 23:48:24]$ git remote show hello
* remote hello
  Fetch URL: https://github.com/owais-io/secondproject.git
  Push  URL: https://github.com/owais-io/secondproject.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

Key Changes from Before:

  • HEAD branch: master - GitHub now has content and a default branch
  • Remote branch: master tracked - Remote branch exists and is being tracked
  • Local branch configured for 'git pull' - Pull operations know where to get updates
  • Local ref configured for 'git push' - Push operations know where to send changes

🔄 Making Additional Changes

Creating More Content

Let's make some changes and push them:

[centos9@vbox seconddemo 23:42:54]$ cat <<EOF >> second.txt
>
> working again
> EOF

[centos9@vbox seconddemo 23:42:56]$ cat second.txt
working

working again

Command Explanation:

  • cat <<EOF >> second.txt - Appends content to existing file
  • >> - Append operator (vs > which overwrites)
  • Result: Adds new content while preserving existing content

Checking Status of Changes

[centos9@vbox seconddemo 23:43:11]$ git status
On branch master
Your branch is up to date with 'hello/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   second.txt

no changes added to commit (use "git add" and/or "git commit -a")

Status Breakdown:

  • "Your branch is up to date with 'hello/master'" - Remote is still synchronized
  • "Changes not staged for commit" - Local changes haven't been added to staging area
  • Modified file: Git detected changes to second.txt

Staging and Committing Changes

[centos9@vbox seconddemo 23:43:15]$ git add .
[centos9@vbox seconddemo 23:43:25]$ git commit -m "updated second.txt"
[master 4a130bb] updated second.txt
 1 file changed, 2 insertions(+)

[centos9@vbox seconddemo 23:43:40]$ git status
On branch master
Your branch is ahead of 'hello/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

New Status Information:

  • "Your branch is ahead of 'hello/master' by 1 commit" - Local has changes that remote doesn't
  • Helpful suggestion: Git tells you to use git push to synchronize
  • Clean working tree: All changes are committed locally

📈 Understanding Branch Relationships

Visualizing Commit History

Let's look at our commit history:

[centos9@vbox seconddemo 23:43:49]$ git log
commit 4a130bb7b63436556220809afcaefe58260d7c45 (HEAD -> master)
Author: Owais Abbasi <owais.abbasi9@gmail.com>
Date:   Tue Sep 30 23:43:25 2025 +0500

    updated second.txt

commit a38542e836ebbc1e75179c3b6b6c064efb72b8cd (hello/master)
Author: Owais Abbasi <owais.abbasi9@gmail.com>
Date:   Tue Sep 30 23:30:38 2025 +0500

    updated first.txt and added second.txt

commit 303fea0985b17714f6f3ed934684a653e11c6578
Author: Owais Abbasi <owais.abbasi9@gmail.com>
Date:   Tue Sep 30 23:28:12 2025 +0500

    added first.txt

Understanding the References:

  • (HEAD -> master) - Your current local position
  • (hello/master) - Last known position of remote branch
  • The gap: One commit exists locally that hasn't been pushed to remote

Visual Representation:

Local (master):     A -- B -- C (HEAD)
Remote (hello/master):  A -- B

Where:
A = "added first.txt"
B = "updated first.txt and added second.txt"
C = "updated second.txt" (only local)

Current State: Local branch has moved forward with commit C, but remote still points to commit B.

🚀 Subsequent Push Operations

Pushing Updates (Now Simplified)

Since we set up upstream tracking, pushing is now simpler:

[centos9@vbox seconddemo 23:44:31]$ git push
Username for 'https://github.com': owais-io
Password for 'https://owais-io@github.com':
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 302 bytes | 302.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To https://github.com/owais-io/secondproject.git
   a38542e..4a130bb  master -> master

Key Differences from First Push:

  • Just git push - No need to specify remote or branch names
  • Fewer objects: Only 3 new objects (the new commit and its changes)
  • Delta range: a38542e..4a130bb shows the range of commits being pushed
  • No "new branch": Updates existing remote branch instead of creating one

Alternative Explicit Push

The session also shows the explicit form still works:

[centos9@vbox seconddemo 23:46:03]$ git push hello master
Username for 'https://github.com': owais-io
Password for 'https://owais-io@github.com':
Everything up-to-date

Why "Everything up-to-date"? Since we just pushed, there are no new changes to send. This confirms that both forms of the command work identically when upstream is configured.

📥 Understanding Pull Operations

Making Changes on GitHub

The session shows making changes directly on GitHub (editing second.txt through the web interface). This simulates what happens when:

  • Team collaboration: Someone else pushes changes
  • Web editing: You make changes directly on GitHub
  • Multiple machines: You push from another computer

Detecting Remote Changes

Let's see how Git detects remote changes:

[centos9@vbox seconddemo 23:48:24]$ git remote show hello
* remote hello
  Fetch URL: https://github.com/owais-io/secondproject.git
  Push  URL: https://github.com/owais-io/secondproject.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

Key Indicator:

  • "master pushes to master (local out of date)" - Git detected the remote has changes that local doesn't have

⬇️ Pulling Remote Changes

The Pull Operation

[centos9@vbox seconddemo 23:49:07]$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 985 bytes | 492.00 KiB/s, done.
From https://github.com/owais-io/secondproject
   4a130bb..8c331ca  master     -> hello/master
Updating 4a130bb..8c331ca
Fast-forward
 second.txt | 2 ++
 1 file changed, 2 insertions(+)

[centos9@vbox seconddemo 23:49:13]$ cat second.txt
working

working again

hello from remote repo on github

Analyzing Pull Output

Output SectionMeaningSignificance
remote: Enumerating objectsGitHub is preparing data to sendShows activity on remote server
Unpacking objectsLocal Git receives and processes dataDownload and integration process
4a130bb..8c331ca master -> hello/masterCommit range being pulledUpdates remote tracking branch
Fast-forwardClean merge without conflictsNo manual intervention needed
second.txt | 2 ++File changes summary2 lines added to second.txt

Understanding Fast-Forward Merges

Fast-Forward Merge: A merge where Git can simply move the local branch pointer forward to include the remote changes, without creating a merge commit.

When Fast-Forward Works:

  • Linear history: Remote changes don't conflict with local changes
  • Same base: Both branches share a common recent ancestor
  • No divergence: Local branch hasn't moved since the common point

Visual Representation:

Before Pull:
Local:   A -- B -- C
Remote:  A -- B -- C -- D

After Pull (Fast-forward):
Local:   A -- B -- C -- D
Remote:  A -- B -- C -- D

🔄 Complete Push-Pull Workflow

Best Practices for Team Collaboration

Workflow StepCommandWhy Important
1. Start Work Sessiongit pullGet latest changes from team
2. Make ChangesEdit files, add featuresDo your actual work
3. Stage Changesgit add .Prepare changes for commit
4. Commit Locallygit commit -m "message"Save snapshot locally
5. Pull Before Pushgit pullCheck for new remote changes
6. Push Changesgit pushShare your work with team

Handling Different Scenarios

ScenarioWhat HappensHow to Handle
No Remote ChangesPull shows "Already up to date"Push directly with confidence
Fast-Forward PossibleRemote changes don't conflictGit automatically merges
Merge ConflictsSame lines changed in bothManual resolution required
Push RejectedRemote has newer commitsPull first, then push

🚨 Common Issues and Solutions

Authentication Problems

Issue: "Authentication failed" or "Permission denied"

Common Causes:

  • Using GitHub password instead of Personal Access Token
  • Incorrect username
  • Token lacks necessary permissions
  • Token has expired

Solutions:

  1. Generate Personal Access Token: GitHub Settings → Developer settings → Personal access tokens
  2. Use token as password: Copy token and paste when prompted for password
  3. Check token permissions: Ensure "repo" scope is enabled
  4. Consider SSH: Set up SSH keys for password-free authentication

Push Rejected Errors

Issue: "Updates were rejected because the remote contains work that you do not have locally"

What this means: Someone else pushed changes while you were working.

Solution:

# Pull the latest changes first
git pull

# If there are no conflicts, push your changes
git push

# If there are conflicts, resolve them and then push

Large File Issues

Issue: Push takes a very long time or fails with large files

GitHub limits:

  • Individual files: 100 MB maximum
  • Repository size: 1 GB recommended limit

Solutions:

  • Use Git LFS (Large File Storage) for big files
  • Add large files to .gitignore
  • Remove large files from history if already committed

🎯 Key Takeaways

✅ Push/Pull Concepts Mastered

  1. Upstream Relationships: Used git push -u to establish tracking between local and remote branches

  2. Authentication Flow: Understood GitHub's token-based authentication system

  3. Push Operations: Learned how to interpret push output and understand object transfer

  4. Status Awareness: Used git status to understand local vs. remote branch states

  5. Pull Operations: Successfully pulled remote changes and understood fast-forward merges

  6. Workflow Best Practices: Learned the pull-before-push workflow for team collaboration

  7. Troubleshooting: Understood common issues and their solutions

  8. Remote Tracking: Mastered checking remote status and branch relationships

🚀 Best Practices Summary

Daily Workflow Best Practices

PracticeWhy ImportantHow To
Pull Before Starting WorkGet latest team changesRun git pull at start of work session
Commit Often, Push DailySmall commits are easier to manageMake logical commits, push at end of day
Meaningful Commit MessagesTeam understands your changesUse present tense, be specific
Check Status RegularlyStay aware of repository stateRun git status before major operations

📋 Push/Pull Commands Cheat Sheet

Essential Push/Pull Commands

# First-time push with upstream setup
git push -u origin main

# Regular push (after upstream is set)
git push

# Explicit push to specific remote and branch
git push origin main

# Pull latest changes from remote
git pull

# Pull from specific remote and branch
git pull origin main

# Check if local is ahead/behind remote
git status

# See detailed remote information
git remote show origin

# Force push (use with extreme caution)
git push --force

# Push all branches
git push --all

# Push tags
git push --tags

Status and Information Commands

# Check repository status
git status

# View commit history with remote references
git log --oneline --graph --all

# Compare local and remote branches
git log origin/main..main        # Local commits not on remote
git log main..origin/main        # Remote commits not local

# See what would be pushed
git log origin/main..HEAD

# Check remote connections
git remote -v

# Detailed remote information
git remote show origin

# Fetch remote changes without merging
git fetch origin

Troubleshooting Commands

# Reset local branch to match remote
git reset --hard origin/main

# Undo last commit (keeping changes)
git reset --soft HEAD~1

# Undo last commit (discarding changes)
git reset --hard HEAD~1

# See what files changed between commits
git diff HEAD~1 HEAD

# Check authentication
git config --global user.name
git config --global user.email

# Update remote URL
git remote set-url origin https://github.com/user/repo.git

🎉 Congratulations! You've successfully mastered:

  • ✅ Setting up upstream branches for streamlined push/pull operations
  • ✅ Understanding GitHub authentication with Personal Access Tokens
  • ✅ Pushing local commits to remote repositories
  • ✅ Pulling remote changes and handling fast-forward merges
  • ✅ Interpreting Git's detailed output during push/pull operations
  • ✅ Implementing best practices for team collaboration workflows

What's Next? You now have the fundamental skills for Git collaboration! Consider exploring advanced topics like branching strategies, merge conflict resolution, and collaborative workflows like Git Flow or GitHub Flow.

💬 Discussion

How did your first push and pull experience go?

  • Did you encounter any authentication challenges with GitHub?
  • Which part of the push/pull workflow was most confusing initially?
  • Have you tried the workflow with a team member or multiple machines?
  • What questions do you have about handling merge conflicts or advanced collaboration scenarios?

Share your Git synchronization experiences and any challenges you've overcome in the comments below!

Owais

Written by Owais

I'm an AIOps Engineer with a passion for AI, Operating Systems, Cloud, and Security—sharing insights that matter in today's tech world.

I completed the UK's Eduqual Level 6 Diploma in AIOps from Al Nafi International College, a globally recognized program that's changing careers worldwide. This diploma is:

  • ✅ Available online in 17+ languages
  • ✅ Includes free student visa guidance for Master's programs in Computer Science fields across the UK, USA, Canada, and more
  • ✅ Comes with job placement support and a 90-day success plan once you land a role
  • ✅ Offers a 1-year internship experience letter while you study—all with no hidden costs

It's not just a diploma—it's a career accelerator.

👉 Start your journey today with a 7-day free trial

Related Articles

Continue exploring with these handpicked articles that complement what you just read

More Reading

One more article you might find interesting