mirror of
https://github.com/pcottle/learnGitBranching.git
synced 2025-07-18 17:56:24 +02:00
levels starting
This commit is contained in:
parent
27498419c9
commit
903b537fda
10 changed files with 270 additions and 29 deletions
179
build/bundle.js
179
build/bundle.js
|
@ -6423,15 +6423,15 @@ var Level = Sandbox.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
initName: function(options) {
|
initName: function(options) {
|
||||||
this.levelName = options.levelName;
|
this.name = options.name;
|
||||||
this.levelID = options.levelID;
|
this.id = options.id;
|
||||||
if (!this.levelName || !this.levelID) {
|
if (!this.name || !this.id) {
|
||||||
this.levelName = 'Rebase Classic';
|
this.name = 'Rebase Classic';
|
||||||
console.warn('REALLY BAD FORM need ids and names');
|
console.warn('REALLY BAD FORM need ids and names');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.levelToolbar = new LevelToolbar({
|
this.levelToolbar = new LevelToolbar({
|
||||||
levelName: this.levelName
|
name: this.name
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -6469,9 +6469,6 @@ var Level = Sandbox.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
initVisualization: function(options) {
|
initVisualization: function(options) {
|
||||||
if (!options.level.startTree) {
|
|
||||||
console.warn('No start tree specified for this level!!! using default...');
|
|
||||||
}
|
|
||||||
this.mainVis = new Visualization({
|
this.mainVis = new Visualization({
|
||||||
el: options.el || this.getDefaultVisEl(),
|
el: options.el || this.getDefaultVisEl(),
|
||||||
treeString: options.level.startTree
|
treeString: options.level.startTree
|
||||||
|
@ -9807,7 +9804,7 @@ var LevelToolbar = BaseView.extend({
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
this.JSON = {
|
this.JSON = {
|
||||||
levelName: options.levelName || 'Some level! (unknown name)'
|
name: options.name || 'Some level! (unknown name)'
|
||||||
};
|
};
|
||||||
|
|
||||||
this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]);
|
this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]);
|
||||||
|
@ -15454,6 +15451,46 @@ require.define("/src/js/util/mock.js",function(require,module,exports,__dirname,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
require.define("/src/levels/intro/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
require.define("/src/levels/intro/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
require.define("/src/levels/rebase/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
require.define("/src/js/git/headless.js",function(require,module,exports,__dirname,__filename,process,global){var _ = require('underscore');
|
require.define("/src/js/git/headless.js",function(require,module,exports,__dirname,__filename,process,global){var _ = require('underscore');
|
||||||
|
@ -17849,7 +17886,70 @@ exports.TreeCompare = TreeCompare;
|
||||||
});
|
});
|
||||||
require("/src/js/git/treeCompare.js");
|
require("/src/js/git/treeCompare.js");
|
||||||
|
|
||||||
require.define("/src/js/level/arbiter.js",function(require,module,exports,__dirname,__filename,process,global){
|
require.define("/src/js/level/arbiter.js",function(require,module,exports,__dirname,__filename,process,global){var _ = require('underscore');
|
||||||
|
var Backbone = require('backbone');
|
||||||
|
|
||||||
|
// Each level is part of a "sequence;" levels within
|
||||||
|
// a sequence proceed in order.
|
||||||
|
|
||||||
|
var levelSequences = {
|
||||||
|
intro: [
|
||||||
|
require('../../levels/intro/1'),
|
||||||
|
require('../../levels/intro/2')
|
||||||
|
],
|
||||||
|
rebase: [
|
||||||
|
require('../../levels/rebase/1'),
|
||||||
|
require('../../levels/rebase/2')
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
function LevelArbiter() {
|
||||||
|
this.levelMap = {};
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
LevelArbiter.prototype.init = function() {
|
||||||
|
|
||||||
|
var previousLevelID;
|
||||||
|
_.each(levelSequences, function(levels, levelSequenceName) {
|
||||||
|
// for this particular sequence...
|
||||||
|
_.each(levels, function(level) {
|
||||||
|
this.validateLevel(level);
|
||||||
|
this.levelMap[level.id] = level;
|
||||||
|
|
||||||
|
// build up the chaining between levels
|
||||||
|
if (previousLevelID) {
|
||||||
|
this.levelMap[previousLevelID]['nextLevelID'] = level.id;
|
||||||
|
}
|
||||||
|
previousLevelID = level.id;
|
||||||
|
}, this);
|
||||||
|
}, this);
|
||||||
|
};
|
||||||
|
|
||||||
|
LevelArbiter.prototype.validateLevel = function(level) {
|
||||||
|
level = level || {};
|
||||||
|
var requiredFields = [
|
||||||
|
'id',
|
||||||
|
'name',
|
||||||
|
'goalTree',
|
||||||
|
'solutionCommand'
|
||||||
|
];
|
||||||
|
|
||||||
|
var optionalFields = [
|
||||||
|
'hint',
|
||||||
|
'disabledMap'
|
||||||
|
];
|
||||||
|
|
||||||
|
_.each(requiredFields, function(field) {
|
||||||
|
if (level[field] === undefined) {
|
||||||
|
throw new Error('I need this field for a level: ' + field);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.LevelArbiter = LevelArbiter;
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
require("/src/js/level/arbiter.js");
|
require("/src/js/level/arbiter.js");
|
||||||
|
|
||||||
|
@ -17972,15 +18072,15 @@ var Level = Sandbox.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
initName: function(options) {
|
initName: function(options) {
|
||||||
this.levelName = options.levelName;
|
this.name = options.name;
|
||||||
this.levelID = options.levelID;
|
this.id = options.id;
|
||||||
if (!this.levelName || !this.levelID) {
|
if (!this.name || !this.id) {
|
||||||
this.levelName = 'Rebase Classic';
|
this.name = 'Rebase Classic';
|
||||||
console.warn('REALLY BAD FORM need ids and names');
|
console.warn('REALLY BAD FORM need ids and names');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.levelToolbar = new LevelToolbar({
|
this.levelToolbar = new LevelToolbar({
|
||||||
levelName: this.levelName
|
name: this.name
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -18018,9 +18118,6 @@ var Level = Sandbox.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
initVisualization: function(options) {
|
initVisualization: function(options) {
|
||||||
if (!options.level.startTree) {
|
|
||||||
console.warn('No start tree specified for this level!!! using default...');
|
|
||||||
}
|
|
||||||
this.mainVis = new Visualization({
|
this.mainVis = new Visualization({
|
||||||
el: options.el || this.getDefaultVisEl(),
|
el: options.el || this.getDefaultVisEl(),
|
||||||
treeString: options.level.startTree
|
treeString: options.level.startTree
|
||||||
|
@ -20140,7 +20237,7 @@ var LevelToolbar = BaseView.extend({
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
this.JSON = {
|
this.JSON = {
|
||||||
levelName: options.levelName || 'Some level! (unknown name)'
|
name: options.name || 'Some level! (unknown name)'
|
||||||
};
|
};
|
||||||
|
|
||||||
this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]);
|
this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]);
|
||||||
|
@ -23000,4 +23097,48 @@ exports.Visualization = Visualization;
|
||||||
});
|
});
|
||||||
require("/src/js/visuals/visualization.js");
|
require("/src/js/visuals/visualization.js");
|
||||||
|
|
||||||
|
require.define("/src/levels/intro/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
require("/src/levels/intro/1.js");
|
||||||
|
|
||||||
|
require.define("/src/levels/intro/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
require("/src/levels/intro/2.js");
|
||||||
|
|
||||||
|
require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
require("/src/levels/rebase/1.js");
|
||||||
|
|
||||||
|
require.define("/src/levels/rebase/2.js",function(require,module,exports,__dirname,__filename,process,global){exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
require("/src/levels/rebase/2.js");
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
|
@ -96,7 +96,7 @@
|
||||||
<i class="icon-bolt"></i>
|
<i class="icon-bolt"></i>
|
||||||
Level
|
Level
|
||||||
<span class="levelToolbarSpan">
|
<span class="levelToolbarSpan">
|
||||||
<%= levelName %>
|
<%= name %>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
var _ = require('underscore');
|
||||||
|
var Backbone = require('backbone');
|
||||||
|
|
||||||
|
// Each level is part of a "sequence;" levels within
|
||||||
|
// a sequence proceed in order.
|
||||||
|
|
||||||
|
var levelSequences = {
|
||||||
|
intro: [
|
||||||
|
require('../../levels/intro/1'),
|
||||||
|
require('../../levels/intro/2')
|
||||||
|
],
|
||||||
|
rebase: [
|
||||||
|
require('../../levels/rebase/1'),
|
||||||
|
require('../../levels/rebase/2')
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
function LevelArbiter() {
|
||||||
|
this.levelMap = {};
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
LevelArbiter.prototype.init = function() {
|
||||||
|
|
||||||
|
var previousLevelID;
|
||||||
|
_.each(levelSequences, function(levels, levelSequenceName) {
|
||||||
|
// for this particular sequence...
|
||||||
|
_.each(levels, function(level) {
|
||||||
|
this.validateLevel(level);
|
||||||
|
this.levelMap[level.id] = level;
|
||||||
|
|
||||||
|
// build up the chaining between levels
|
||||||
|
if (previousLevelID) {
|
||||||
|
this.levelMap[previousLevelID]['nextLevelID'] = level.id;
|
||||||
|
}
|
||||||
|
previousLevelID = level.id;
|
||||||
|
}, this);
|
||||||
|
}, this);
|
||||||
|
};
|
||||||
|
|
||||||
|
LevelArbiter.prototype.validateLevel = function(level) {
|
||||||
|
level = level || {};
|
||||||
|
var requiredFields = [
|
||||||
|
'id',
|
||||||
|
'name',
|
||||||
|
'goalTree',
|
||||||
|
'solutionCommand'
|
||||||
|
];
|
||||||
|
|
||||||
|
var optionalFields = [
|
||||||
|
'hint',
|
||||||
|
'disabledMap'
|
||||||
|
];
|
||||||
|
|
||||||
|
_.each(requiredFields, function(field) {
|
||||||
|
if (level[field] === undefined) {
|
||||||
|
throw new Error('I need this field for a level: ' + field);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.LevelArbiter = LevelArbiter;
|
||||||
|
|
|
@ -43,15 +43,15 @@ var Level = Sandbox.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
initName: function(options) {
|
initName: function(options) {
|
||||||
this.levelName = options.levelName;
|
this.name = options.name;
|
||||||
this.levelID = options.levelID;
|
this.id = options.id;
|
||||||
if (!this.levelName || !this.levelID) {
|
if (!this.name || !this.id) {
|
||||||
this.levelName = 'Rebase Classic';
|
this.name = 'Rebase Classic';
|
||||||
console.warn('REALLY BAD FORM need ids and names');
|
console.warn('REALLY BAD FORM need ids and names');
|
||||||
}
|
}
|
||||||
|
|
||||||
this.levelToolbar = new LevelToolbar({
|
this.levelToolbar = new LevelToolbar({
|
||||||
levelName: this.levelName
|
name: this.name
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -89,9 +89,6 @@ var Level = Sandbox.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
initVisualization: function(options) {
|
initVisualization: function(options) {
|
||||||
if (!options.level.startTree) {
|
|
||||||
console.warn('No start tree specified for this level!!! using default...');
|
|
||||||
}
|
|
||||||
this.mainVis = new Visualization({
|
this.mainVis = new Visualization({
|
||||||
el: options.el || this.getDefaultVisEl(),
|
el: options.el || this.getDefaultVisEl(),
|
||||||
treeString: options.level.startTree
|
treeString: options.level.startTree
|
||||||
|
|
12
src/js/views/gitDemonstrationView.js
Normal file
12
src/js/views/gitDemonstrationView.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
var _ = require('underscore');
|
||||||
|
var Q = require('q');
|
||||||
|
// horrible hack to get localStorage Backbone plugin
|
||||||
|
var Backbone = (!require('../util').isBrowser()) ? require('backbone') : window.Backbone;
|
||||||
|
|
||||||
|
var ModalTerminal = require('../views').ModalTerminal;
|
||||||
|
var ContainedBase = require('../views').ContainedBase;
|
||||||
|
var ConfirmCancelView = require('../views').ConfirmCancelView;
|
||||||
|
var LeftRightView = require('../views').LeftRightView;
|
||||||
|
var ModalAlert = require('../views').ModalAlert;
|
||||||
|
var KeyboardListener = require('../util/keyboard').KeyboardListener;
|
||||||
|
|
|
@ -348,7 +348,7 @@ var LevelToolbar = BaseView.extend({
|
||||||
initialize: function(options) {
|
initialize: function(options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
this.JSON = {
|
this.JSON = {
|
||||||
levelName: options.levelName || 'Some level! (unknown name)'
|
name: options.name || 'Some level! (unknown name)'
|
||||||
};
|
};
|
||||||
|
|
||||||
this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]);
|
this.beforeDestination = $($('#commandLineHistory div.toolbar')[0]);
|
||||||
|
|
7
src/levels/intro/1.js
Normal file
7
src/levels/intro/1.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
7
src/levels/intro/2.js
Normal file
7
src/levels/intro/2.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
7
src/levels/rebase/1.js
Normal file
7
src/levels/rebase/1.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
7
src/levels/rebase/2.js
Normal file
7
src/levels/rebase/2.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
exports = {
|
||||||
|
id: 'intro1',
|
||||||
|
name: 'Introduction #1',
|
||||||
|
goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}',
|
||||||
|
solutionCommand: 'git checkout -b win; git commit',
|
||||||
|
hint: 'Try checking out a branch named after Charlie Sheen'
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue