diff --git a/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProviderRepository.java b/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProviderRepository.java
index 52fc267..0608a66 100644
--- a/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProviderRepository.java
+++ b/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProviderRepository.java
@@ -32,6 +32,8 @@ public abstract class ScmProviderRepository
 
     private boolean persistCheckout = false;
 
+    private boolean pushChanges = true;
+
     /**
      * @return The user.
      */
@@ -69,6 +71,22 @@ public abstract class ScmProviderRepository
     }
 
     /**
+     * Should distributed changes be pushed to the central repository?
+     * For many distributed SCMs like Git, a change like a commit 
+     * is only stored in your local copy of the repository.  Pushing
+     * the change allows your to more easily share it with other users.
+     */
+    public boolean isPushChanges() 
+    {
+        return pushChanges;
+    }
+
+    public void setPushChanges(boolean pushChanges) 
+    {
+        this.pushChanges = pushChanges;
+    }
+
+    /**
      * Will checkouts using this repository be persisted so they can
      * be refreshed in the future?  This property is of concern to SCMs
      * like Perforce and Clearcase where the server must track where a
diff --git a/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/AbstractScmMojo.java b/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/AbstractScmMojo.java
index 11e4665..1144fd2 100644
--- a/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/AbstractScmMojo.java
+++ b/maven-scm-plugin/src/main/java/org/apache/maven/scm/plugin/AbstractScmMojo.java
@@ -163,6 +163,16 @@ public abstract class AbstractScmMojo
      * @parameter
      */
     private Map providerImplementations;
+    
+    /**
+     * Should distributed changes be pushed to the central repository?
+     * For many distributed SCMs like Git, a change like a commit 
+     * is only stored in your local copy of the repository.  Pushing
+     * the change allows your to more easily share it with other users.
+     * 
+     * @parameter expression="${pushChanges}" default-value="true"
+     */
+    private boolean pushChanges;
 
     /** {@inheritDoc} */
     public void execute()
@@ -271,6 +281,8 @@ public abstract class AbstractScmMojo
             repository = getScmManager().makeScmRepository( getConnectionUrl() );
 
             ScmProviderRepository providerRepo = repository.getProviderRepository();
+            
+            providerRepo.setPushChanges(pushChanges);
 
             if ( !StringUtils.isEmpty( username ) )
             {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java
index 8172ddb..9609d2d 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitBranchCommand.java
@@ -74,13 +74,16 @@ public class GitBranchCommand
             return new BranchScmResult( cl.toString(), "The git-branch command failed.", stderr.getOutput(), false );
         }
 
-        // and now push the branch to the origin repository
-        Commandline clPush = createPushCommandLine( repository, fileSet, branch );
-
-        exitCode = GitCommandLineUtils.execute( clPush, stdout, stderr, getLogger() );
-        if ( exitCode != 0 )
+        if( repo.isPushChanges() ) 
         {
-            return new BranchScmResult( clPush.toString(), "The git-push command failed.", stderr.getOutput(), false );
+            // and now push the branch to the origin repository
+            Commandline clPush = createPushCommandLine( repository, fileSet, branch );
+
+            exitCode = GitCommandLineUtils.execute( clPush, stdout, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                return new BranchScmResult( clPush.toString(), "The git-push command failed.", stderr.getOutput(), false );
+            }
         }
 
         // as last action we search for the branched files
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
index 7acb277..919af9c 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
@@ -122,12 +122,15 @@ public class GitCheckInCommand
                                              false );
             }
 
-            Commandline cl = createPushCommandLine( getLogger(), repository, fileSet, version );
-
-            exitCode = GitCommandLineUtils.execute( cl, stdout, stderr, getLogger() );
-            if ( exitCode != 0 )
+            if( repo.isPushChanges() ) 
             {
-                return new CheckInScmResult( cl.toString(), "The git-push command failed.", stderr.getOutput(), false );
+                Commandline cl = createPushCommandLine( getLogger(), repository, fileSet, version );
+
+                exitCode = GitCommandLineUtils.execute( cl, stdout, stderr, getLogger() );
+                if ( exitCode != 0 )
+                {
+                    return new CheckInScmResult( cl.toString(), "The git-push command failed.", stderr.getOutput(), false );
+                }                
             }
 
             List checkedInFiles = new ArrayList( statusConsumer.getChangedFiles().size() );
@@ -156,7 +159,7 @@ public class GitCheckInCommand
                 }
             }
 
-            return new CheckInScmResult( cl.toString(), checkedInFiles );
+            return new CheckInScmResult( clCommit.toString(), checkedInFiles );
         }
         finally
         {
diff --git a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
index 87f0557..0e151b8 100644
--- a/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
+++ b/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
@@ -99,15 +99,18 @@ public class GitTagCommand
                 return new TagScmResult( clTag.toString(), "The git-tag command failed.", stderr.getOutput(), false );
             }
 
-            // and now push the tag to the origin repository
-            Commandline clPush = createPushCommandLine( repository, fileSet, tag );
-
-            exitCode = GitCommandLineUtils.execute( clPush, stdout, stderr, getLogger() );
-            if ( exitCode != 0 )
+            if( repo.isPushChanges() ) 
             {
-                return new TagScmResult( clPush.toString(), "The git-push command failed.", stderr.getOutput(), false );
+                // and now push the tag to the origin repository
+                Commandline clPush = createPushCommandLine( repository, fileSet, tag );
+    
+                exitCode = GitCommandLineUtils.execute( clPush, stdout, stderr, getLogger() );
+                if ( exitCode != 0 )
+                {
+                    return new TagScmResult( clPush.toString(), "The git-push command failed.", stderr.getOutput(), false );
+                }
             }
-
+            
             // plus search for the tagged files
             GitListConsumer listConsumer = new GitListConsumer( getLogger(), fileSet.getBasedir(), ScmFileStatus.TAGGED );
 

