diff --git a/spec/remote.spec.js b/spec/remote.spec.js index ef58f055..c59a1cef 100644 --- a/spec/remote.spec.js +++ b/spec/remote.spec.js @@ -381,5 +381,12 @@ describe('Git Remotes', function() { ); }); + it('uses git force to bypass upstream check', function() { + expectTreeAsync( + 'git clone; git commit; git push; go C1; git branch -f master C1; go master; git commit; git commit; go C1; git checkout -b side; git commit; go master; git merge side; git push --force', + '{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":"o/master"},"o/master":{"target":"C6","id":"o/master","remoteTrackingBranchID":null},"side":{"target":"C5","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"},"originTree":{"branches":{"master":{"target":"C6","id":"master","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C6":{"parents":["C4","C5"],"id":"C6"}},"tags":{},"HEAD":{"target":"master","id":"HEAD"}}}' + ); + }); + }); diff --git a/src/js/git/commands.js b/src/js/git/commands.js index d66948f2..acf1b129 100644 --- a/src/js/git/commands.js +++ b/src/js/git/commands.js @@ -674,6 +674,9 @@ var commandConfig = { push: { regex: /^git +push($|\s)/, + options: [ + '--force' + ], execute: function(engine, command) { if (!engine.hasOrigin()) { throw new GitError({ @@ -685,6 +688,7 @@ var commandConfig = { var destination; var source; var sourceObj; + var commandOptions = command.getOptionsMap(); // git push is pretty complex in terms of // the arguments it wants as well... get ready! @@ -737,7 +741,8 @@ var commandConfig = { // NOTE -- very important! destination and source here // are always, always strings. very important :D destination: destination, - source: source + source: source, + force: !!commandOptions['--force'] }); } }, diff --git a/src/js/git/index.js b/src/js/git/index.js index 985a24f0..6aaccf4f 100644 --- a/src/js/git/index.js +++ b/src/js/git/index.js @@ -1062,13 +1062,15 @@ GitEngine.prototype.push = function(options) { var sourceLocation = this.resolveID(options.source || 'HEAD'); // first check if this is even allowed by checking the sync between - this.checkUpstreamOfSource( - this, - this.origin, - branchOnRemote, - sourceLocation, - intl.str('git-error-origin-push-no-ff') - ); + if (!options.force) { + this.checkUpstreamOfSource( + this, + this.origin, + branchOnRemote, + sourceLocation, + intl.str('git-error-origin-push-no-ff') + ); + } var commitsToMake = this.getTargetGraphDifference( this.origin,