diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts
index 52a4e68fbcb82337ae47ab4e49c2f10d434d3f04..43ff10a7c359adda2488ca6895fc781d3805b886 100644
--- a/lib/util/git/index.ts
+++ b/lib/util/git/index.ts
@@ -31,6 +31,7 @@ import { checkForPlatformFailure, handleCommitError } from './error';
 import { configSigningKey, writePrivateKey } from './private-key';
 import type {
   CommitFilesConfig,
+  CommitResult,
   CommitSha,
   LocalConfig,
   StatusResult,
@@ -696,15 +697,15 @@ async function handleCommitAuth(localDir: string): Promise<void> {
   await writeGitAuthor();
 }
 
-export async function commitFiles({
+export async function prepareCommit({
   branchName,
   files,
   message,
   force = false,
-}: CommitFilesConfig): Promise<CommitSha | null> {
+}: CommitFilesConfig): Promise<CommitResult | null> {
   const { localDir } = GlobalConfig.get();
   await syncGit();
-  logger.debug(`Committing files to branch ${branchName}`);
+  logger.debug(`Preparing files for commiting to branch ${branchName}`);
   await handleCommitAuth(localDir);
   try {
     await git.reset(ResetMode.HARD);
@@ -796,6 +797,29 @@ export async function commitFiles({
       return null;
     }
 
+    const result: CommitResult = {
+      sha: commit,
+      files: files.filter((fileChange) => {
+        if (fileChange.type === 'deletion') {
+          return deletedFiles.includes(fileChange.path);
+        }
+        return addedModifiedFiles.includes(fileChange.path);
+      }),
+    };
+
+    return result;
+  } catch (err) /* istanbul ignore next */ {
+    return handleCommitError(files, branchName, err);
+  }
+}
+
+export async function pushCommit({
+  branchName,
+  files,
+}: CommitFilesConfig): Promise<void> {
+  await syncGit();
+  logger.debug(`Pushing branch ${branchName}`);
+  try {
     const pushOptions: TaskOptions = {
       '--force-with-lease': null,
       '-u': null,
@@ -811,20 +835,41 @@ export async function commitFiles({
     );
     delete pushRes.repo;
     logger.debug({ result: pushRes }, 'git push');
-    // Fetch it after create
+    incLimitedValue(Limit.Commits);
+  } catch (err) /* istanbul ignore next */ {
+    handleCommitError(files, branchName, err);
+  }
+}
+
+export async function fetchCommit({
+  branchName,
+  files,
+}: CommitFilesConfig): Promise<CommitSha | null> {
+  await syncGit();
+  logger.debug(`Fetching branch ${branchName}`);
+  try {
     const ref = `refs/heads/${branchName}:refs/remotes/origin/${branchName}`;
     await git.fetch(['origin', ref, '--force']);
-    config.branchCommits[branchName] = (
-      await git.revparse([branchName])
-    ).trim();
+    const commit = (await git.revparse([branchName])).trim();
+    config.branchCommits[branchName] = commit;
     config.branchIsModified[branchName] = false;
-    incLimitedValue(Limit.Commits);
     return commit;
   } catch (err) /* istanbul ignore next */ {
     return handleCommitError(files, branchName, err);
   }
 }
 
+export async function commitFiles(
+  config: CommitFilesConfig
+): Promise<CommitSha | null> {
+  const commitResult = await prepareCommit(config);
+  if (!commitResult) {
+    return null;
+  }
+  await pushCommit(config);
+  return fetchCommit(config);
+}
+
 export function getUrl({
   protocol,
   auth,
diff --git a/lib/util/git/types.ts b/lib/util/git/types.ts
index d1f2537f2d4c6ab02404dd90c04fa125d8324b83..1b309f2d3697fbb69870bb92ec8c5a1a2973603a 100644
--- a/lib/util/git/types.ts
+++ b/lib/util/git/types.ts
@@ -76,3 +76,8 @@ export interface CommitFilesConfig {
   message: string;
   force?: boolean;
 }
+
+export interface CommitResult {
+  sha: string;
+  files: FileChange[];
+}