diff --git a/lib/workers/branch/index.js b/lib/workers/branch/index.js
index 76eef99ec61617a7a08aa8b94fe516cf3380a29e..6a6b009744764f68abda40369820d6d351b45615 100644
--- a/lib/workers/branch/index.js
+++ b/lib/workers/branch/index.js
@@ -86,6 +86,12 @@ async function processBranch(branchConfig, packageFiles) {
       const branchPr = await platform.getBranchPr(config.branchName);
       if (branchPr) {
         logger.debug('Found existing branch PR');
+        if (branchPr.state !== 'open') {
+          logger.info(
+            'PR has been closed or merged since this run started - aborting'
+          );
+          throw new Error('repository-changed');
+        }
         if (!branchPr.canRebase) {
           const subject = 'PR has been edited';
           logger.info(subject);
diff --git a/test/workers/branch/index.spec.js b/test/workers/branch/index.spec.js
index d296f028a215bcd34393aa810ba64f7d33ab7fa1..5d1c7611e456e14d11f25a7783de12f0c6e885f9 100644
--- a/test/workers/branch/index.spec.js
+++ b/test/workers/branch/index.spec.js
@@ -110,6 +110,17 @@ describe('workers/branch', () => {
       await branchWorker.processBranch(config);
       expect(parent.getParentBranch.mock.calls.length).toBe(0);
     });
+    it('throws error if closed PR found', async () => {
+      schedule.isScheduledNow.mockReturnValueOnce(false);
+      platform.branchExists.mockReturnValueOnce(true);
+      platform.getBranchPr.mockReturnValueOnce({
+        state: 'merged',
+        canRebase: false,
+      });
+      await expect(branchWorker.processBranch(config)).rejects.toThrow(
+        /repository-changed/
+      );
+    });
     it('skips branch if edited PR found', async () => {
       schedule.isScheduledNow.mockReturnValueOnce(false);
       platform.branchExists.mockReturnValueOnce(true);