├── public
├── robots.txt
├── logo.png
├── favicon.ico
├── manifest.json
├── index.html
├── git-cheat-sheet.json
└── git-cheat-sheet-index.json
├── .eslintrc
├── src
├── index.css
├── components
│ ├── Buttons
│ │ ├── index.js
│ │ ├── IconButton.css
│ │ └── IconButton.js
│ ├── CheatSheet
│ │ ├── index.js
│ │ ├── CheatSheetHeader.css
│ │ ├── CheatSheetHeader.js
│ │ └── CheatSheet.js
│ ├── Sidebar
│ │ ├── index.js
│ │ ├── SidebarContent.js
│ │ └── SidebarContent.css
│ ├── AnimatedSearchInput
│ │ ├── index.js
│ │ ├── AnimatedSearchInput.js
│ │ └── AnimatedSearchInput.css
│ ├── SearchSuggestions
│ │ ├── index.js
│ │ ├── SearchSuggestionsList.js
│ │ ├── SearchSuggestionsGrid.js
│ │ ├── SuggestionSection.js
│ │ ├── SearchSuggestionsList.css
│ │ └── SearchSuggestionsGrid.css
│ └── Clipboard
│ │ └── index.js
├── App.test.js
├── index.js
├── helpers
│ └── groupBy.js
├── services
│ └── Search
│ │ ├── SearchServiceFactory.js
│ │ └── SearchService.js
├── App.css
├── config
│ └── cheatSheetConfig.js
├── views
│ └── CheatSheetView.js
├── App.js
├── logo.svg
└── registerServiceWorker.js
├── README.md
├── .gitignore
├── LICENSE
├── package.json
├── scripts
└── build-index.js
└── resources
└── git-cheat-sheet.json
/public/robots.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "react-app"
3 | }
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: sans-serif;
5 | }
6 |
--------------------------------------------------------------------------------
/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ziedbentahar/the-awesome-cheat-sheet/HEAD/public/logo.png
--------------------------------------------------------------------------------
/src/components/Buttons/index.js:
--------------------------------------------------------------------------------
1 | import IconButton from './IconButton';
2 | export {IconButton};
3 |
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ziedbentahar/the-awesome-cheat-sheet/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/components/CheatSheet/index.js:
--------------------------------------------------------------------------------
1 | import CheatSheet from "./CheatSheet";
2 | export default CheatSheet;
3 |
--------------------------------------------------------------------------------
/src/components/Sidebar/index.js:
--------------------------------------------------------------------------------
1 | import SidebarContent from './SidebarContent';
2 | export {SidebarContent};
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | A tiny git cheat sheet viewer written in ReactJs
2 |
3 | TODO: Writing this README obviously ;)
4 |
--------------------------------------------------------------------------------
/src/components/AnimatedSearchInput/index.js:
--------------------------------------------------------------------------------
1 | import AnimatedSearchInput from './AnimatedSearchInput';
2 | export default AnimatedSearchInput;
--------------------------------------------------------------------------------
/src/components/SearchSuggestions/index.js:
--------------------------------------------------------------------------------
1 | import SearchSuggestionsList from './SearchSuggestionsList';
2 | import SearchSuggestionsGrid from './SearchSuggestionsGrid';
3 | export {SearchSuggestionsList, SearchSuggestionsGrid}
4 |
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render( , div);
8 | });
9 |
--------------------------------------------------------------------------------
/src/components/Buttons/IconButton.css:
--------------------------------------------------------------------------------
1 | .roundButton {
2 | font-size: 20px;
3 | color: #9B9B9B;
4 | cursor: pointer;
5 | width: 40px;
6 | height: 40px;
7 | border-radius: 50%;
8 | border: 1px solid #9B9B9B;
9 | text-align: center;
10 | }
11 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import "./index.css";
4 | import App from "./App";
5 | import registerServiceWorker from "./registerServiceWorker";
6 |
7 | ReactDOM.render( , document.getElementById("root"));
8 | registerServiceWorker();
9 |
--------------------------------------------------------------------------------
/src/helpers/groupBy.js:
--------------------------------------------------------------------------------
1 | export default function groupBy(arr, key) {
2 | return arr.reduce((sum, item) => {
3 | const groupByVal = item[key];
4 | let groupedItems = sum.get(groupByVal) || [];
5 | groupedItems.push(item);
6 | return sum.set(groupByVal, groupedItems);
7 | }, new Map());
8 | }
9 |
--------------------------------------------------------------------------------
/src/services/Search/SearchServiceFactory.js:
--------------------------------------------------------------------------------
1 | import SearchService from "./SearchService";
2 |
3 | class SearchServiceFactory {
4 | createNew({ documentsFileName, indexFileName }) {
5 | return new SearchService({ documentsFileName, indexFileName });
6 | }
7 | }
8 |
9 | export default new SearchServiceFactory();
10 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Git me",
3 | "name": "Git cheat sheet",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | }
10 | ],
11 | "start_url": "./index.html",
12 | "display": "standalone",
13 | "theme_color": "#f14e32",
14 | "background_color": "#ffffff"
15 | }
16 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Montserrat');
2 | @import url('https://fonts.googleapis.com/css?family=Inconsolata');
3 | body {
4 | background-color: #333333;
5 | font-family: 'Montserrat', sans-serif;
6 | }
7 |
8 | html {
9 | box-sizing: border-box;
10 | }
11 |
12 | *,
13 | *:before,
14 | *:after {
15 | box-sizing: inherit;
16 | }
17 |
18 |
19 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env.local
15 | .env.development.local
16 | .env.test.local
17 | .env.production.local
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
23 | #application related
24 |
25 | /public/documents.json
26 | /public/documents-idx.json
--------------------------------------------------------------------------------
/src/components/CheatSheet/CheatSheetHeader.css:
--------------------------------------------------------------------------------
1 | .cheat-sheet-nav {
2 | display: flex;
3 | }
4 |
5 | .cheat-sheet-nav .button {
6 | padding-top: 47px;
7 | flex: 1;
8 | display: flex;
9 | }
10 |
11 | .cheat-sheet-nav .left {
12 | justify-content: flex-start;
13 | width: 10%;
14 |
15 | }
16 |
17 |
18 | .cheat-sheet-nav .right {
19 | justify-content: flex-end;
20 | width: 10%;
21 | transition: all 0.3s;
22 | }
23 |
24 | .cheat-sheet-nav .center {
25 | flex: 1;
26 | display: flex;
27 | justify-content: center;
28 | flex-basis: 100%;
29 | }
--------------------------------------------------------------------------------
/src/components/Buttons/IconButton.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import "./IconButton.css";
4 |
5 | const IconButton = ({ style, icon, withBorder, onClick }) => {
6 | const inlineStyle = {
7 | borderWidth: withBorder ? 1 : 0,
8 | ...style
9 | };
10 |
11 | return (
12 |
onClick()} className="roundButton" style={inlineStyle}>
13 |
14 |
15 | );
16 | };
17 |
18 | IconButton.propTypes = {
19 | style: PropTypes.object,
20 | onClick: PropTypes.func.isRequired,
21 | withBorder: PropTypes.bool.isRequired,
22 | icon: PropTypes.string.isRequired
23 | };
24 |
25 | export default IconButton;
26 |
--------------------------------------------------------------------------------
/src/components/SearchSuggestions/SearchSuggestionsList.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import { SuggestionSection } from "./SuggestionSection";
4 | import "./SearchSuggestionsList.css";
5 |
6 | const SearchSuggestionsList = ({ suggestions }) => {
7 | const suggestionItems = [...suggestions].map(([key, value]) => (
8 |
9 | ));
10 |
11 | return (
12 | suggestions && {suggestionItems}
13 | );
14 | };
15 |
16 | SearchSuggestionsList.propTypes = {
17 | suggestions: PropTypes.object,
18 | onMoreClick: PropTypes.func
19 | };
20 |
21 | export default SearchSuggestionsList;
22 |
--------------------------------------------------------------------------------
/src/config/cheatSheetConfig.js:
--------------------------------------------------------------------------------
1 | const CHEAT_SHEET_DOCUMENTS_FILE_SUFFIX = "-cheat-sheet.json";
2 | const CHEAT_SHEET_INDEX_FILE_SUFFIX = "-cheat-sheet-index.json";
3 |
4 | const cheatSheetConfig = {
5 | sidebar: {
6 | title: "The awesome git cheat sheet",
7 | mainContent: `Whether you are new to git or just needing a referesher,
8 | this cheat sheet will help you discover or remember useful git commands.`,
9 | logoUrl: `/logo.png`
10 | },
11 | search: {
12 | inputLabel: "The awesome git cheat sheet",
13 | inputDescription: "Just type in any git related stuff"
14 | },
15 | data: {
16 | documents: `/git${CHEAT_SHEET_DOCUMENTS_FILE_SUFFIX}`,
17 | index: `/git${CHEAT_SHEET_INDEX_FILE_SUFFIX}`
18 | }
19 | };
20 |
21 | export default cheatSheetConfig;
22 |
--------------------------------------------------------------------------------
/src/components/Sidebar/SidebarContent.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 |
4 | import "./SidebarContent.css";
5 | //import logo from './logo.png';
6 |
7 | const SidebarContent = ({ title, logo, mainContent }) => {
8 | return (
9 |
10 |
11 |
12 | {title}
13 |
14 |
{mainContent}
15 |
16 | Crafted with
17 |
18 | by InFlow-IT
19 | |
20 |
21 |
22 | );
23 | };
24 |
25 | SidebarContent.propTypes = {
26 | title: PropTypes.string.isRequired,
27 | logo: PropTypes.string.isRequired,
28 | mainContent: PropTypes.string
29 | };
30 |
31 | export default SidebarContent;
32 |
--------------------------------------------------------------------------------
/src/views/CheatSheetView.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import PropTypes from "prop-types";
3 | import CheatSheet from "components/CheatSheet";
4 | import SearchServiceFactory from "services/Search/SearchServiceFactory";
5 | import cheatSheetConfig from "config/cheatSheetConfig";
6 |
7 | const searchService = SearchServiceFactory.createNew({
8 | documentsFileName: cheatSheetConfig.data.documents,
9 | indexFileName: cheatSheetConfig.data.index
10 | });
11 |
12 | export default class CheatSheetView extends Component {
13 | static propTypes = {
14 | searchInputLabel: PropTypes.string.isRequired
15 | };
16 |
17 | render() {
18 | return (
19 |
25 | );
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/components/SearchSuggestions/SearchSuggestionsGrid.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import Masonry from "react-masonry-component";
4 | import { SuggestionSection } from "./SuggestionSection";
5 | import "./SearchSuggestionsGrid.css";
6 |
7 | const SearchSuggestionsGrid = ({ suggestions }) => {
8 | const suggestionItems = [...suggestions].map(([key, value]) => (
9 |
10 | ));
11 |
12 | return (
13 |
21 | {suggestionItems}
22 |
23 | );
24 | };
25 |
26 | SearchSuggestionsGrid.propTypes = {
27 | suggestions: PropTypes.object,
28 | onMoreClick: PropTypes.func
29 | };
30 |
31 | export default SearchSuggestionsGrid;
32 |
--------------------------------------------------------------------------------
/src/components/CheatSheet/CheatSheetHeader.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import { IconButton } from "components/Buttons";
4 | import "./CheatSheetHeader.css";
5 |
6 | const CheatSheetHeader = ({
7 | hasSidebarButton,
8 | renderHeaderContent,
9 | onSidebarClick
10 | }) => {
11 | return (
12 |
13 |
14 | {renderHeaderContent && renderHeaderContent()}
15 |
16 |
17 | {hasSidebarButton && (
18 | onSidebarClick()}
22 | />
23 | )}
24 |
25 |
26 | );
27 | };
28 |
29 | CheatSheetHeader.propTypes = {
30 | hasSidebarButton: PropTypes.bool,
31 | onSidebarClick: PropTypes.func,
32 | renderHeaderContent: PropTypes.func
33 | };
34 |
35 | export default CheatSheetHeader;
36 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 InFlow IT
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/components/AnimatedSearchInput/AnimatedSearchInput.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import "./AnimatedSearchInput.css";
4 |
5 | const AnimatedSearchInput = ({ onSearchQueryChange, label, placeholder }) => {
6 | return (
7 |
8 |
9 | (this.textInput = input)}
11 | autoComplete="off"
12 | autoCapitalize="off"
13 | spellCheck="false"
14 | type="text"
15 | required
16 | onKeyUp={this.searchByPrefix}
17 | onChange={e => onSearchQueryChange(e.target.value)}
18 | />
19 |
20 |
21 |
22 | {label}
23 |
24 | {placeholder && {placeholder}
}
25 |
26 |
27 | );
28 | };
29 |
30 | AnimatedSearchInput.propTypes = {
31 | onSearchQueryChange: PropTypes.func.isRequired,
32 | label: PropTypes.string.isRequired,
33 | placeholder: PropTypes.string
34 | };
35 |
36 | export default AnimatedSearchInput;
37 |
--------------------------------------------------------------------------------
/src/components/Clipboard/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import Clipboard from "clipboard";
4 | import { Tooltip } from "react-tippy";
5 | import "react-tippy/dist/tippy.css";
6 |
7 | const CLICK_TO_COPY_TO_CLIPBOARD = "with-clipboard";
8 |
9 | const clipboard = new Clipboard(`.${CLICK_TO_COPY_TO_CLIPBOARD}`);
10 | clipboard.on("success", e => {});
11 |
12 | export default class WithClipboard extends React.Component {
13 | render() {
14 | return (
15 | (this.tooltip = tooltip)}
24 | >
25 | this.tooltip.hideTooltip()}
29 | >
30 | {this.props.renderComponent()}
31 |
32 |
33 | );
34 | }
35 | }
36 |
37 | WithClipboard.propTypes = {
38 | renderComponent: PropTypes.func.isRequired,
39 | clipboardText: PropTypes.string.isRequired
40 | };
41 |
--------------------------------------------------------------------------------
/src/components/SearchSuggestions/SuggestionSection.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import PropTypes from "prop-types";
3 | import WithClipboard from "components/Clipboard";
4 |
5 |
6 | const SuggestionSectionList = ({ items, onMoreClick }) => {
7 | const listItems = items.map(item => (
8 |
9 | {item.description}
10 | item.command && $ {item.command} }
13 | />
14 |
15 | ));
16 |
17 | return ;
18 | };
19 |
20 | SuggestionSectionList.propTypes = {
21 | items: PropTypes.arrayOf(PropTypes.object).isRequired,
22 | onMoreClick: PropTypes.func
23 | };
24 |
25 | const SuggestionSection = ({ sectionName, items }) => (
26 |
27 |
28 |
{sectionName}
29 |
30 |
31 |
32 | );
33 |
34 | SuggestionSection.propTypes = {
35 | sectionName: PropTypes.string,
36 | items: PropTypes.arrayOf(PropTypes.object).isRequired,
37 | onMoreClick: PropTypes.func
38 | };
39 |
40 | export { SuggestionSectionList, SuggestionSection };
41 |
--------------------------------------------------------------------------------
/src/components/Sidebar/SidebarContent.css:
--------------------------------------------------------------------------------
1 | .sidebarContent {
2 | height: 100%;
3 | width: 300px;
4 | background-color: #333333;
5 | }
6 |
7 | .sidebarContent header {
8 | padding-top: 20px;
9 | text-align: center;
10 | font-size: 12px;
11 | color: #9B9B9B;
12 | }
13 |
14 | .sidebarContent header .logo {
15 | width: 15%;
16 | margin-left: auto;
17 | margin-right: auto;
18 | display: block;
19 | }
20 |
21 | .sidebarContent footer {
22 | text-align: center;
23 | font-size: 12px;
24 | position: fixed;
25 | bottom: 0;
26 | margin-bottom: 10px;
27 | width: 100%;
28 | color: #9B9B9B;
29 | font-family: 'Inconsolata', sans-serif;
30 | }
31 |
32 | .sidebarContent footer i {
33 | margin-left: 4px;
34 | margin-right: 4px;
35 | }
36 |
37 | .sidebarContent footer .blinking-cursor {
38 | font-weight: 100;
39 | font-size: 12px;
40 | animation: 1s blink step-end infinite;
41 | }
42 |
43 | .sidebarContent article {
44 | color: #9B9B9B;
45 | font-size: 14px;
46 | padding: 20px;
47 | line-height: 30px;
48 | }
49 |
50 | @keyframes blink {
51 | from,
52 | to {
53 | color: transparent;
54 | }
55 | 50% {
56 | color: #9B9B9B;
57 | }
58 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "the-awesome-cheat-sheet",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "babel-polyfill": "^6.26.0",
7 | "clipboard": "^1.7.1",
8 | "font-awesome": "^4.7.0",
9 | "lunr": "^2.1.4",
10 | "react": "^16.0.0",
11 | "react-addons-css-transition-group": "^15.6.2",
12 | "react-dom": "^16.0.0",
13 | "react-masonry-component": "^6.0.1",
14 | "react-router": "^4.2.0",
15 | "react-router-dom": "^4.2.2",
16 | "react-scripts": "1.0.14",
17 | "react-sidebar": "^2.3.2",
18 | "react-tippy": "^1.2.2",
19 | "react-transition-group": "^1.2.1",
20 | "rimraf": "^2.6.2"
21 | },
22 | "scripts": {
23 | "cleanIndex": "rimraf public/documents.json public/documents-idx.json",
24 | "createIndex": "node scripts/build-index resources/git-cheat-sheet.json public git-cheat-sheet",
25 | "resetIndex": "npm run cleanIndex && npm run createIndex",
26 | "start": "npm run resetIndex && cross-env NODE_PATH=src react-scripts start react-scripts start",
27 | "build": "npm run resetIndex && cross-env NODE_PATH=src react-scripts build",
28 | "test": "cross-env NODE_PATH=src react-scripts test --env=jsdom",
29 | "eject": "react-scripts eject"
30 | },
31 | "devDependencies": {
32 | "cross-env": "^5.1.1"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/components/SearchSuggestions/SearchSuggestionsList.css:
--------------------------------------------------------------------------------
1 | .search-suggestions {
2 |
3 | font-size: 38px;
4 | color: #F0F0F0;
5 | width: 70%;
6 | display: block;
7 | margin-left: auto;
8 | margin-right: auto;
9 | }
10 |
11 | .search-suggestions section h3 {
12 | text-transform: uppercase;
13 | font-size: 11px;
14 | line-height: 1;
15 | font-weight: 100;
16 | }
17 |
18 | .search-suggestions ul {
19 | list-style: none;
20 | padding-left:5px;
21 | margin-top:5px;
22 | margin-bottom:5px;
23 | }
24 |
25 | .search-suggestions section ul li {
26 | font-size: 20px;
27 | padding-bottom:10px;
28 | font-weight: 300;
29 | cursor: pointer; cursor: hand;
30 | transition: all 0.5s;
31 | }
32 |
33 | .search-suggestions section ul li .description {
34 | margin: 5px;
35 | font-size: 26px;
36 | padding-bottom:5px;
37 | }
38 |
39 | .search-suggestions section ul li .details {
40 | margin: 5px;
41 | font-size: 20px;
42 | padding-bottom:5px;
43 | font-family: 'Inconsolata', sans-serif;
44 | }
45 |
46 | .search-suggestions section ul li:hover {
47 | padding-left:2px;
48 | }
49 |
50 |
51 | @media only screen and (max-width: 400px) {
52 | .search-suggestions {
53 | width: 90%;
54 | }
55 |
56 | .search-suggestions section ul li .description {
57 | font-size: 20px;
58 | }
59 | }
--------------------------------------------------------------------------------
/scripts/build-index.js:
--------------------------------------------------------------------------------
1 | var lunr = require("lunr"),
2 | fs = require("fs"),
3 | path = require("path");
4 |
5 | var args = process.argv.slice(2);
6 |
7 | if (args.length < 3) {
8 | console.error("Script arguments are not valid");
9 | console.error("usage: ");
10 | console.error("build-Index [source-file] [destination-dir] [file-name]");
11 | return;
12 | }
13 |
14 | var documents = require(path.join(process.cwd(), args[0]));
15 | var destinationDir = args[1];
16 | var documentsFileName = args[2];
17 |
18 | var documentsWithId = {};
19 |
20 | var idx = lunr(function() {
21 | this.ref("id");
22 | this.field("category");
23 | this.field("command");
24 | this.field("description");
25 | this.field("keywords");
26 |
27 | documents.forEach((item, index) => {
28 | item.id = index;
29 | const documentWithId = item;
30 | documentsWithId[index] = documentWithId;
31 | this.add(documentWithId);
32 | });
33 | });
34 |
35 | fs.writeFile(
36 | path.join(destinationDir, documentsFileName + ".json"),
37 | JSON.stringify(documentsWithId),
38 | function(err) {
39 | if (err) throw err;
40 | console.log("Documents were saved!");
41 | }
42 | );
43 |
44 | fs.writeFile(
45 | path.join(destinationDir, documentsFileName + "-index.json"),
46 | JSON.stringify(idx),
47 | function(err) {
48 | if (err) throw err;
49 | console.log("Index was saved!");
50 | }
51 | );
52 |
--------------------------------------------------------------------------------
/src/services/Search/SearchService.js:
--------------------------------------------------------------------------------
1 | import lunr from "lunr";
2 | import groupBy from "helpers/groupBy";
3 |
4 | export default class SearchService {
5 | constructor({ documentsFileName, indexFileName }) {
6 | this.documentsLoaded = false;
7 | this.documentsFileName = documentsFileName;
8 | this.indexFileName = indexFileName;
9 | }
10 |
11 | async ensureDocumentsAndIndexLoadedAsync() {
12 | if (this.documentsLoaded) {
13 | return;
14 | }
15 |
16 | const [documents, index] = await Promise.all([
17 | (await fetch(this.documentsFileName)).json(),
18 | (await fetch(this.indexFileName)).json()
19 | ]);
20 |
21 | this.index = lunr.Index.load(index);
22 |
23 | this.documents = documents;
24 | this.allDocumentsGroupedByCategory = groupBy(
25 | Object.values(this.documents),
26 | "category"
27 | );
28 |
29 | this.documentsLoaded = true;
30 | }
31 |
32 | getAllDocumentsAsync = async () => {
33 | await this.ensureDocumentsAndIndexLoadedAsync();
34 | return this.allDocumentsGroupedByCategory;
35 | };
36 |
37 | searchByPrefixAsync = async queryTerm => {
38 | if (!queryTerm) {
39 | return;
40 | }
41 |
42 | await this.ensureDocumentsAndIndexLoadedAsync();
43 |
44 | const result = this.index.search(`${queryTerm}^100 ${queryTerm}*^10`);
45 |
46 | if (result && result.length > 0) {
47 | return groupBy(result.map(item => this.documents[item.ref]), "category");
48 | }
49 | };
50 | }
51 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import Sidebar from "react-sidebar";
3 | import Clipboard from "clipboard";
4 | import { SidebarContent } from "components/Sidebar";
5 | import CheatSheetView from "views/CheatSheetView";
6 | import cheatSheetConfig from "config/cheatSheetConfig";
7 |
8 | import "babel-polyfill";
9 | import "font-awesome/css/font-awesome.min.css";
10 | import "./App.css";
11 |
12 | class App extends Component {
13 | constructor() {
14 | super();
15 |
16 | this.state = {
17 | sidebarOpen: false
18 | };
19 | }
20 |
21 | toggleSideBarState = open => {
22 | this.setState({ sidebarOpen: open });
23 | };
24 |
25 | render() {
26 | const { title, logoUrl, mainContent } = cheatSheetConfig.sidebar;
27 | const { inputLabel } = cheatSheetConfig.search;
28 |
29 | const sidebarContent = (
30 |
31 | );
32 |
33 | return (
34 | (this.sidebar = sidebar)}
41 | pullRight
42 | sidebar={sidebarContent}
43 | open={this.state.sidebarOpen}
44 | onSetOpen={this.toggleSideBarState}
45 | >
46 |
50 |
51 | );
52 | }
53 | }
54 |
55 | export default App;
56 |
--------------------------------------------------------------------------------
/src/components/CheatSheet/CheatSheet.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import PropTypes from "prop-types";
3 | import CheatSheetHeader from "./CheatSheetHeader";
4 | import AnimatedSearchInput from "components/AnimatedSearchInput";
5 | import { SearchSuggestionsGrid } from "components/SearchSuggestions";
6 |
7 | export default class CheatSheet extends Component {
8 | static propTypes = {
9 | searchByPrefixFn: PropTypes.func.isRequired,
10 | getAllFn: PropTypes.func.isRequired,
11 | sidebarClickHandler: PropTypes.func.isRequired,
12 | searchInputLabel: PropTypes.string.isRequired,
13 | inputDescription: PropTypes.string
14 | };
15 |
16 | constructor(props) {
17 | super(props);
18 | this.state = {
19 | suggestions: new Map()
20 | };
21 | }
22 |
23 | async searchByPrefix(query) {
24 | const suggestions =
25 | query.length > 1
26 | ? await this.props.searchByPrefixFn(query)
27 | : await this.props.getAllFn();
28 |
29 | this.setState({ suggestions: suggestions });
30 | }
31 |
32 | async componentDidMount() {
33 | this.setState({
34 | suggestions: await this.props.getAllFn()
35 | });
36 | }
37 |
38 | render() {
39 | const { suggestions } = this.state;
40 |
41 | return (
42 |
43 |
this.props.sidebarClickHandler(true)}
46 | renderHeaderContent={() => (
47 | this.searchByPrefix(query)}
49 | placeholder={this.props.inputDescription}
50 | label={this.props.searchInputLabel}
51 | />
52 | )}
53 | />
54 |
55 | {suggestions && (
56 |
57 |
58 |
59 | )}
60 |
61 | );
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
24 |
25 |
26 |
35 | The awesome git cheat sheet
36 |
37 |
38 |
39 |
40 | You need to enable JavaScript to run this app.
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/src/components/SearchSuggestions/SearchSuggestionsGrid.css:
--------------------------------------------------------------------------------
1 | .search-suggestions-grid {
2 | font-size: 38px;
3 | color: #f0f0f0;
4 | display: block;
5 | margin-left: auto;
6 | margin-right: auto;
7 | width: 90%;
8 | }
9 |
10 | .search-suggestions-grid section div {
11 | border: 1px solid #474747;
12 | margin: 2px;
13 | border-radius: 3px;
14 | box-shadow: 1px;
15 | }
16 |
17 | .search-suggestions-grid section h3 {
18 | text-transform: uppercase;
19 | font-size: 13px;
20 | line-height: 1;
21 | padding-left: 5px;
22 | padding-top: 6px;
23 | padding-bottom: 6px;
24 | margin: 0;
25 | background: #ff9900;
26 | color: #333333;
27 | font-weight: bold;
28 | }
29 |
30 | .search-suggestions-grid ul {
31 | list-style: none;
32 | padding-left: 5px;
33 | margin-top: 5px;
34 | margin-bottom: 5px;
35 | width: 360px;
36 | }
37 |
38 | .search-suggestions-grid section ul li {
39 | font-size: 15px;
40 | padding-bottom: 10px;
41 | font-weight: 300;
42 |
43 | }
44 |
45 | .search-suggestions-grid section ul li div {
46 | border: 0;
47 | margin: 0;
48 | border-radius: 0;
49 | box-shadow: 0px;
50 | }
51 |
52 | .search-suggestions-grid section ul li .description {
53 | margin: 5px;
54 | font-size: 15px;
55 | padding-bottom: 5px;
56 | }
57 |
58 | .search-suggestions-grid section ul li .details {
59 | margin: 5px;
60 | font-size: 12px;
61 | padding-bottom: 5px;
62 | font-family: "Inconsolata", sans-serif;
63 | cursor: pointer;
64 | cursor: hand;
65 | }
66 |
67 | @media only screen and (max-width: 780px) {
68 | .search-suggestions-grid {
69 | width: 98%;
70 | }
71 |
72 | .search-suggestions-grid section {
73 | width: 360px;
74 | }
75 |
76 | .search-suggestions-grid ul {
77 | width: 320px;
78 | }
79 | .search-suggestions-grid section ul li .description {
80 | font-size: 17px;
81 | }
82 | }
83 |
84 | @media only screen and (max-width: 412px) {
85 | .search-suggestions-grid section {
86 | width: 99%;
87 | }
88 | .search-suggestions-grid ul {
89 | width: 98%;
90 | }
91 | .search-suggestions-grid section ul li .description {
92 | font-size: 20px;
93 | }
94 | }
95 |
96 | @media only screen and (max-width: 340px) {
97 | .search-suggestions-grid section ul li .description {
98 | font-size: 14px;
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/components/AnimatedSearchInput/AnimatedSearchInput.css:
--------------------------------------------------------------------------------
1 | .animated-search-input {
2 | transition: all 0.3s;
3 | -webkit-backface-visibility: hidden;
4 | }
5 |
6 | .animated-search-input label {
7 | display: block;
8 | letter-spacing: 4px;
9 | padding-top: 30px;
10 | text-align: center;
11 | }
12 |
13 | .animated-search-input label .label-text {
14 | color: #9B9B9B;
15 | cursor: text;
16 | font-size: 12px;
17 | line-height: 20px;
18 | text-transform: uppercase;
19 | transform: translateY(-34px);
20 | transition: all 0.3s;
21 | }
22 |
23 | .animated-search-input label .label-text i {
24 | padding-right: 10px;
25 | }
26 |
27 | .animated-search-input label input {
28 | background-color: transparent;
29 | border: 0;
30 | border-bottom: 2px solid #4A4A4A;
31 | color: white;
32 | font-size: 36px;
33 | letter-spacing: -1px;
34 | outline: 0;
35 | padding: 5px 20px;
36 | text-align: center;
37 | transition: all 0.3s;
38 | width: 100%;
39 | }
40 |
41 | .animated-search-input label input:focus {
42 | width: 110%;
43 | }
44 |
45 | .animated-search-input label input:focus~.label-text {
46 | color: #F0F0F0;
47 | font-size: 13px;
48 | transform: translateY(-74px);
49 | }
50 |
51 | .animated-search-input label input:valid~.label-text {
52 | font-size: 13px;
53 | transform: translateY(-74px);
54 | }
55 |
56 | .animated-search-input label input:invalid {
57 | box-shadow: none;
58 | }
59 |
60 |
61 | .animated-search-input label .placeholder {
62 | color: #F0F0F0;
63 | font-size: 10px;
64 | transition: all 0.3s;
65 | transform: translateY(-10px);
66 | opacity: 0;
67 | visibility: hidden;
68 | }
69 |
70 | .animated-search-input label input:focus~.placeholder {
71 | opacity: 1;
72 | visibility: visible;
73 | transform: translateY(0px);
74 | letter-spacing: 2px;
75 | }
76 |
77 | .animated-search-input label input:valid~.placeholder {
78 | opacity: 0;
79 | visibility: hidden;
80 | transform: translateY(-10px);
81 | }
82 |
83 | .animated-search-input .animated-search-input-suggestions {
84 | padding-top: 10px;
85 | overflow: scroll;
86 | -webkit-overflow-scrolling: touch;
87 | }
88 |
89 | .animated-search-input .cancel {
90 | transition: all 0.3s;
91 | opacity: 0;
92 | visibility: hidden;
93 | color: #9B9B9B;
94 | border: 0;
95 | border-bottom: 2px solid #4A4A4A;
96 | padding-bottom: 11px;
97 | cursor: pointer;
98 | }
99 |
100 | .animated-search-input label input:valid~.cancel {
101 | opacity: 1;
102 | visibility: visible;
103 | }
104 |
105 | @media only screen and (max-width: 412px) {
106 | .animated-search-input label .label-text {
107 | font-size: 9px;
108 | }
109 |
110 | .animated-search-input label input:focus~.label-text {
111 | font-size: 9px;
112 | }
113 | }
114 |
115 | @media only screen and (max-width: 340px) {
116 | .animated-search-input label .label-text {
117 | font-size: 8px;
118 | }
119 |
120 | .animated-search-input label input:focus~.label-text {
121 | font-size: 8px;
122 | }
123 | }
--------------------------------------------------------------------------------
/src/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | const isLocalhost = Boolean(
12 | window.location.hostname === "localhost" ||
13 | // [::1] is the IPv6 localhost address.
14 | window.location.hostname === "[::1]" ||
15 | // 127.0.0.1/8 is considered localhost for IPv4.
16 | window.location.hostname.match(
17 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
18 | )
19 | );
20 |
21 | export default function register() {
22 | if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
23 | // The URL constructor is available in all browsers that support SW.
24 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
25 | if (publicUrl.origin !== window.location.origin) {
26 | // Our service worker won't work if PUBLIC_URL is on a different origin
27 | // from what our page is served on. This might happen if a CDN is used to
28 | // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
29 | return;
30 | }
31 |
32 | window.addEventListener("load", () => {
33 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
34 |
35 | if (!isLocalhost) {
36 | // Is not local host. Just register service worker
37 | registerValidSW(swUrl);
38 | } else {
39 | // This is running on localhost. Lets check if a service worker still exists or not.
40 | checkValidServiceWorker(swUrl);
41 | }
42 | });
43 | }
44 | }
45 |
46 | function registerValidSW(swUrl) {
47 | navigator.serviceWorker
48 | .register(swUrl)
49 | .then(registration => {
50 | registration.onupdatefound = () => {
51 | const installingWorker = registration.installing;
52 | installingWorker.onstatechange = () => {
53 | if (installingWorker.state === "installed") {
54 | if (navigator.serviceWorker.controller) {
55 | // At this point, the old content will have been purged and
56 | // the fresh content will have been added to the cache.
57 | // It's the perfect time to display a "New content is
58 | // available; please refresh." message in your web app.
59 | console.log("New content is available; please refresh.");
60 | } else {
61 | // At this point, everything has been precached.
62 | // It's the perfect time to display a
63 | // "Content is cached for offline use." message.
64 | console.log("Content is cached for offline use.");
65 | }
66 | }
67 | };
68 | };
69 | })
70 | .catch(error => {
71 | console.error("Error during service worker registration:", error);
72 | });
73 | }
74 |
75 | function checkValidServiceWorker(swUrl) {
76 | // Check if the service worker can be found. If it can't reload the page.
77 | fetch(swUrl)
78 | .then(response => {
79 | // Ensure service worker exists, and that we really are getting a JS file.
80 | if (
81 | response.status === 404 ||
82 | response.headers.get("content-type").indexOf("javascript") === -1
83 | ) {
84 | // No service worker found. Probably a different app. Reload the page.
85 | navigator.serviceWorker.ready.then(registration => {
86 | registration.unregister().then(() => {
87 | window.location.reload();
88 | });
89 | });
90 | } else {
91 | // Service worker found. Proceed as normal.
92 | registerValidSW(swUrl);
93 | }
94 | })
95 | .catch(() => {
96 | console.log(
97 | "No internet connection found. App is running in offline mode."
98 | );
99 | });
100 | }
101 |
102 | export function unregister() {
103 | if ("serviceWorker" in navigator) {
104 | navigator.serviceWorker.ready.then(registration => {
105 | registration.unregister();
106 | });
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/public/git-cheat-sheet.json:
--------------------------------------------------------------------------------
1 | {"0":{"category":"Install GIT","description":"Install git on macOS with Homebrew","command":"brew install git","keywords":["install","macos","homebrew"],"id":0},"1":{"category":"Install GIT","description":"Install git on Debian-based linux","command":"sudo apt-get install git","keywords":["install","apt-get","debian","linux"],"id":1},"2":{"category":"Install GIT","description":"Install git on Windows with Chocolatey","command":"choco install git","keywords":["install","windows","choco"],"id":2},"3":{"category":"Configuration","command":"git config --global user.name [name]","description":"Sets the name you want attached to your commit transaction","keywords":["configuration","name","email","user"],"id":3},"4":{"category":"Configuration","command":"git config --global user.email [email address]","description":"Sets the email you want atached to your commit transactions","keywords":["configuration","name","email","user"],"id":4},"5":{"category":"Configuration","command":"git config --global color.ui auto","description":"Enables helpful colorization of command line output","keywords":["configuration","color","ui","customization"],"id":5},"6":{"category":"Create Repositories","command":"git init [project-name]","description":"Creates a new local repository with the specified name","keywords":["new","project","create"],"id":6},"7":{"category":"Create Repositories","command":"git clone [url]","description":"Downloads a project and its entire version history","keywords":["download","remote","clone","checkout"],"id":7},"8":{"category":"Make Changes","command":"git status","description":"Lists all new or modified files to be commited","keywords":["change","modifications","commit"],"id":8},"9":{"category":"Make Changes","command":"git diff","description":"Shows file differences not yet staged","keywords":["modifications","changes","diff"],"id":9},"10":{"category":"Make Changes","command":"git add [file]","description":"Add the specified file to the staging area","keywords":[],"id":10},"11":{"category":"Make Changes","command":"git diff --staged","description":"Shows file differences between staging and the last file version","keywords":["modifications"],"id":11},"12":{"category":"Make Changes","command":"git reset [file]","description":"Unstages the file, but preserve its contents","keywords":[],"id":12},"13":{"category":"Make Changes","command":"git commit -m [descriptive message]","description":"Records staged snapshots in version history","keywords":[],"id":13},"14":{"category":"Branches","command":"git branch","description":"Lists all local branches in the current repository","keywords":[],"id":14},"15":{"category":"Branches","command":"git branch [branch-name]","description":"Creates a branch","keywords":[],"id":15},"16":{"category":"Branches","command":"git merge [branch-name]","description":"Merges the specified branch’s history into the current branch","keywords":[],"id":16},"17":{"category":"Branches","command":"git checkout [branch-name]","description":"Switches to the specified branch","keywords":[],"id":17},"18":{"category":"Branches","command":"git checkout -b [branch-name]","description":"Creates a branch and switch to it","keywords":[],"id":18},"19":{"category":"Branches","command":"git checkout -m [new-branch-name]","description":"Rename branch","keywords":[],"id":19},"20":{"category":"Branches","command":"git branch -d [branch-name]","description":"Deletes the specified branch, locally","keywords":[],"id":20},"21":{"category":"Moving and removing files","command":"git rm [file]","description":"Deletes the file from the working directory and stages the deletion","keywords":[],"id":21},"22":{"category":"Moving and removing files","command":"git rm --cached [file]","description":"Removes the file from version control but preserves the file locally","keywords":[],"id":22},"23":{"category":"Moving and removing files","command":"git mv [from] [to]","description":"Renames the file","keywords":[],"id":23},"24":{"category":"Stashing","command":"git stash","description":"Temporarily stores all modified tracked files","keywords":[],"id":24},"25":{"category":"Stashing","command":"git stash pop","description":"Restores the most last stashed files and deletes the stashed changeset","keywords":[],"id":25},"26":{"category":"Stashing","command":"git stash list","description":"Lists all stashed changesets","keywords":[],"id":26},"27":{"category":"Stashing","command":"git stash drop","description":"Deletes the last stashed changeset","keywords":[],"id":27},"28":{"category":"History and diff","command":"git log","description":"Lists version history for the current branch","keywords":[],"id":28},"29":{"category":"History and diff","command":"git log --follow [file]","description":"Lists version history for a file, including renames","keywords":[],"id":29},"30":{"category":"History and diff","command":"git diff [first-branch]...[second-branch]","description":"Shows content differences between two branches","keywords":[],"id":30},"31":{"category":"History and diff","command":"git show [commit]","description":"Shows changes of the specified commit","keywords":[],"id":31},"32":{"category":"Cancel and redo stuffs","command":"git reset [commit]","description":"Undoes all commits afer [commit], preserving changes locally","keywords":[],"id":32},"33":{"category":"Cancel and redo stuffs","command":"git reset --hard [commit]","description":"Discards all history and changes back to the specified commit","keywords":[],"id":33},"34":{"category":"Cancel and redo stuffs","command":"git reset –hard HEAD","description":"Discards all local changes in the working directory","keywords":[],"id":34},"35":{"category":"Synchronization and remote repositories","command":"git push [alias] [branch]","description":"Pushes all local changesets to the remote repository","keywords":[],"id":35},"36":{"category":"Synchronization and remote repositories","command":"git pull","description":"Downloads new remote history and incorporate changes","keywords":[],"id":36},"37":{"category":"Synchronization and remote repositories","command":"git remote -v","description":"Shows the name of remote repositories","keywords":[],"id":37},"38":{"category":"Synchronization and remote repositories","command":"git fetch","description":"Get the latest changes from the origin but not merge","keywords":[],"id":38},"39":{"category":"Synchronization and remote repositories","command":"git remote rm [remote repo name]","description":"Removes the remote repository","keywords":[],"id":39},"40":{"category":"Tagging","command":"git tag","description":"Lists tags","keywords":["tag","version","release"],"id":40},"41":{"category":"Tagging","command":"git tag -l \"[pattern]\"","description":"Lists tags with specified pattern","keywords":["tag","version","release","pattern"],"id":41},"42":{"category":"Tagging","command":"git tag -a [version] -m [message]","description":"Create annotated tag","keywords":["tag","version","release","annotate"],"id":42},"43":{"category":"Tagging","command":"git tag [version]","description":"Create a lightweight tag","keywords":["tag","version","release","lightweight"],"id":43},"44":{"category":"Tagging","command":"git tag -a [version] [commit]","description":"Tagging a commit","keywords":["tag","version","release","later"],"id":44},"45":{"category":"Tagging","command":"git push [alias] [version]","description":"Sharing a tag","keywords":["tag","version","release","later"],"id":45},"46":{"category":"Tagging","command":"git checkout [version]","description":"Checkout tags","keywords":["tag","version","release"],"id":46},"47":{"category":"Cancel and redo stuffs","command":"git commit --amend","description":"Change the commit message","keywords":["undo","message","commit"],"id":47}}
--------------------------------------------------------------------------------
/resources/git-cheat-sheet.json:
--------------------------------------------------------------------------------
1 | [{
2 | "category": "Install GIT",
3 | "description": "Install git on macOS with Homebrew",
4 | "command": "brew install git",
5 | "keywords": ["install", "macos", "homebrew"]
6 | },
7 | {
8 | "category": "Install GIT",
9 | "description": "Install git on Debian-based linux",
10 | "command": "sudo apt-get install git",
11 | "keywords": ["install", "apt-get", "debian" , "linux"]
12 | },
13 | {
14 | "category": "Install GIT",
15 | "description": "Install git on Windows with Chocolatey",
16 | "command": "choco install git",
17 | "keywords": ["install", "windows", "choco"]
18 | },
19 | {
20 | "category": "Configuration",
21 | "command": "git config --global user.name [name]",
22 | "description": "Sets the name you want attached to your commit transaction",
23 | "keywords": ["configuration", "name", "email", "user"]
24 | },
25 | {
26 | "category": "Configuration",
27 | "command": "git config --global user.email [email address]",
28 | "description": "Sets the email you want atached to your commit transactions",
29 | "keywords": ["configuration", "name", "email", "user"]
30 | },
31 | {
32 | "category": "Configuration",
33 | "command": "git config --global color.ui auto",
34 | "description": "Enables helpful colorization of command line output",
35 | "keywords": ["configuration", "color", "ui", "customization"]
36 | },
37 | {
38 | "category": "Create Repositories",
39 | "command": "git init [project-name]",
40 | "description": "Creates a new local repository with the specified name",
41 | "keywords": ["new", "project", "create"]
42 | },
43 | {
44 | "category": "Create Repositories",
45 | "command": "git clone [url]",
46 | "description": "Downloads a project and its entire version history",
47 | "keywords": ["download", "remote", "clone", "checkout"]
48 | },
49 | {
50 | "category": "Make Changes",
51 | "command": "git status",
52 | "description": "Lists all new or modified files to be commited",
53 | "keywords": ["change", "modifications", "commit"]
54 | },
55 | {
56 | "category": "Make Changes",
57 | "command": "git diff",
58 | "description": "Shows file differences not yet staged",
59 | "keywords": ["modifications", "changes", "diff"]
60 | },
61 | {
62 | "category": "Make Changes",
63 | "command": "git add [file]",
64 | "description": "Add the specified file to the staging area",
65 | "keywords": []
66 | },
67 | {
68 | "category": "Make Changes",
69 | "command": "git diff --staged",
70 | "description": "Shows file differences between staging and the last file version",
71 | "keywords": ["modifications"]
72 | },
73 | {
74 | "category": "Make Changes",
75 | "command": "git reset [file]",
76 | "description": "Unstages the file, but preserve its contents",
77 | "keywords": []
78 | },
79 | {
80 | "category": "Make Changes",
81 | "command": "git commit -m [descriptive message]",
82 | "description": "Records staged snapshots in version history",
83 | "keywords": []
84 | },
85 | {
86 | "category": "Branches",
87 | "command": "git branch",
88 | "description": "Lists all local branches in the current repository",
89 | "keywords": []
90 | },
91 | {
92 | "category": "Branches",
93 | "command": "git branch [branch-name]",
94 | "description": "Creates a branch",
95 | "keywords": []
96 | },
97 | {
98 | "category": "Branches",
99 | "command": "git merge [branch-name]",
100 | "description": "Merges the specified branch’s history into the current branch",
101 | "keywords": []
102 | },
103 | {
104 | "category": "Branches",
105 | "command": "git checkout [branch-name]",
106 | "description": "Switches to the specified branch",
107 | "keywords": []
108 | },
109 | {
110 | "category": "Branches",
111 | "command": "git checkout -b [branch-name]",
112 | "description": "Creates a branch and switch to it",
113 | "keywords": []
114 | },
115 | {
116 | "category": "Branches",
117 | "command": "git checkout -m [new-branch-name]",
118 | "description": "Rename branch",
119 | "keywords": []
120 | },
121 | {
122 | "category": "Branches",
123 | "command": "git branch -d [branch-name]",
124 | "description": "Deletes the specified branch, locally",
125 | "keywords": []
126 | },
127 | {
128 | "category": "Moving and removing files",
129 | "command": "git rm [file]",
130 | "description": "Deletes the file from the working directory and stages the deletion",
131 | "keywords": []
132 | },
133 | {
134 | "category": "Moving and removing files",
135 | "command": "git rm --cached [file]",
136 | "description": "Removes the file from version control but preserves the file locally",
137 | "keywords": []
138 | },
139 | {
140 | "category": "Moving and removing files",
141 | "command": "git mv [from] [to]",
142 | "description": "Renames the file",
143 | "keywords": []
144 | },
145 | {
146 | "category": "Stashing",
147 | "command": "git stash",
148 | "description": "Temporarily stores all modified tracked files",
149 | "keywords": []
150 | },
151 | {
152 | "category": "Stashing",
153 | "command": "git stash pop",
154 | "description": "Restores the most last stashed files and deletes the stashed changeset",
155 | "keywords": []
156 | },
157 | {
158 | "category": "Stashing",
159 | "command": "git stash list",
160 | "description": "Lists all stashed changesets",
161 | "keywords": []
162 | },
163 | {
164 | "category": "Stashing",
165 | "command": "git stash drop",
166 | "description": "Deletes the last stashed changeset",
167 | "keywords": []
168 | },
169 | {
170 | "category": "History and diff",
171 | "command": "git log",
172 | "description": "Lists version history for the current branch",
173 | "keywords": []
174 | },
175 | {
176 | "category": "History and diff",
177 | "command": "git log --follow [file]",
178 | "description": "Lists version history for a file, including renames",
179 | "keywords": []
180 | },
181 | {
182 | "category": "History and diff",
183 | "command": "git diff [first-branch]...[second-branch]",
184 | "description": "Shows content differences between two branches",
185 | "keywords": []
186 | },
187 | {
188 | "category": "History and diff",
189 | "command": "git show [commit]",
190 | "description": "Shows changes of the specified commit",
191 | "keywords": []
192 | },
193 | {
194 | "category": "Cancel and redo stuffs",
195 | "command": "git reset [commit]",
196 | "description": "Undoes all commits afer [commit], preserving changes locally",
197 | "keywords": []
198 | },
199 | {
200 | "category": "Cancel and redo stuffs",
201 | "command": "git reset --hard [commit]",
202 | "description": "Discards all history and changes back to the specified commit",
203 | "keywords": []
204 | },
205 | {
206 | "category": "Cancel and redo stuffs",
207 | "command": "git reset –hard HEAD",
208 | "description": "Discards all local changes in the working directory",
209 | "keywords": []
210 | },
211 | {
212 | "category": "Synchronization and remote repositories",
213 | "command": "git push [alias] [branch]",
214 | "description": "Pushes all local changesets to the remote repository",
215 | "keywords": []
216 | },
217 | {
218 | "category": "Synchronization and remote repositories",
219 | "command": "git pull",
220 | "description": "Downloads new remote history and incorporate changes",
221 | "keywords": []
222 | },
223 | {
224 | "category": "Synchronization and remote repositories",
225 | "command": "git remote -v",
226 | "description": "Shows the name of remote repositories",
227 | "keywords": []
228 | },
229 | {
230 | "category": "Synchronization and remote repositories",
231 | "command": "git fetch",
232 | "description": "Get the latest changes from the origin but not merge",
233 | "keywords": []
234 | },
235 | {
236 | "category": "Synchronization and remote repositories",
237 | "command": "git remote rm [remote repo name]",
238 | "description": "Removes the remote repository",
239 | "keywords": []
240 | },
241 | {
242 | "category": "Tagging",
243 | "command": "git tag",
244 | "description": "Lists tags",
245 | "keywords": ["tag", "version", "release"]
246 | },
247 | {
248 | "category": "Tagging",
249 | "command": "git tag -l \"[pattern]\"",
250 | "description": "Lists tags with specified pattern",
251 | "keywords": ["tag", "version", "release", "pattern"]
252 | },
253 | {
254 | "category": "Tagging",
255 | "command": "git tag -a [version] -m [message]",
256 | "description": "Create annotated tag",
257 | "keywords": ["tag", "version", "release", "annotate"]
258 | },
259 | {
260 | "category": "Tagging",
261 | "command": "git tag [version]",
262 | "description": "Create a lightweight tag",
263 | "keywords": ["tag", "version", "release", "lightweight"]
264 | },
265 | {
266 | "category": "Tagging",
267 | "command": "git tag -a [version] [commit]",
268 | "description": "Tagging a commit",
269 | "keywords": ["tag", "version", "release", "later"]
270 | },
271 | {
272 | "category": "Tagging",
273 | "command": "git push [alias] [version]",
274 | "description": "Sharing a tag",
275 | "keywords": ["tag", "version", "release", "later"]
276 | },
277 | {
278 | "category": "Tagging",
279 | "command": "git checkout [version]",
280 | "description": "Checkout tags",
281 | "keywords": ["tag", "version", "release"]
282 | },
283 | {
284 | "category": "Cancel and redo stuffs",
285 | "command": "git commit --amend",
286 | "description": "Change the commit message",
287 | "keywords": ["undo", "message", "commit"]
288 | }
289 | ]
--------------------------------------------------------------------------------
/public/git-cheat-sheet-index.json:
--------------------------------------------------------------------------------
1 | {"version":"2.1.5","fields":["category","command","description","keywords"],"fieldVectors":[["category/0",[0,1.311,1,0.092]],["command/0",[0,1.46,1,0.103,2,3.727]],["description/0",[0,1.426,1,0.1,3,3.106,4,3.106]],["keywords/0",[0,0.912,3,1.987,4,1.987]],["category/1",[0,1.311,1,0.092]],["command/1",[0,1.301,1,0.092,5,3.32,6,3.32]],["description/1",[0,1.301,1,0.092,7,2.835,8,3.321,9,2.835]],["keywords/1",[0,0.759,7,1.654,9,1.654,10,1.938]],["category/2",[0,1.311,1,0.092]],["command/2",[0,1.46,1,0.103,11,3.181]],["description/2",[0,1.426,1,0.1,12,3.106,13,3.639]],["keywords/2",[0,0.912,11,1.987,12,1.987]],["category/3",[14,2.474]],["command/3",[1,0.083,15,2.265,16,2.265,17,2.992,18,1.045]],["description/3",[18,1.067,19,2.607,20,2.607,21,3.054,22,0.954,23,2.607]],["keywords/3",[14,1.123,18,0.677,24,1.327,25,1.654]],["category/4",[14,2.474]],["command/4",[1,0.075,15,2.062,16,2.062,24,1.866,26,2.724,27,2.724]],["description/4",[19,2.607,20,2.607,22,0.954,23,2.607,24,2.092,28,3.054]],["keywords/4",[14,1.123,18,0.677,24,1.327,25,1.654]],["category/5",[14,2.474]],["command/5",[1,0.083,15,2.265,16,2.265,29,2.992,30,2.992]],["description/5",[31,3.054,32,3.054,33,2.607,34,3.054,35,3.054,36,3.054]],["keywords/5",[14,1.123,33,1.654,37,1.938,38,1.938]],["category/6",[39,1.681,40,1.311]],["command/6",[1,0.092,18,1.159,41,3.32,42,2.513]],["description/6",[18,1.067,39,1.535,40,1.197,43,1.916,44,1.644,45,1.535]],["keywords/6",[39,1.17,42,1.763,43,1.461]],["category/7",[39,1.681,40,1.311]],["command/7",[1,0.103,46,3.181,47,3.727]],["description/7",[42,2.514,48,2.514,49,3.321,50,0.928,51,1.381]],["keywords/7",[46,1.654,48,1.467,52,0.759,53,1.123]],["category/8",[54,1.938,55,1.104]],["command/8",[1,0.117,56,4.249]],["description/8",[22,1.037,43,2.084,57,1.669,58,2.835,59,0.878]],["keywords/8",[22,0.727,55,0.769,60,1.763]],["category/9",[54,1.938,55,1.104]],["command/9",[1,0.117,61,2.135]],["description/9",[59,0.962,62,2.109,63,2.755,64,2.109]],["keywords/9",[55,0.769,60,1.763,61,1.17]],["category/10",[54,1.938,55,1.104]],["command/10",[1,0.103,59,0.985,65,3.181]],["description/10",[45,1.669,59,0.878,64,1.924,65,2.835,66,3.321]],["keywords/10",[]],["category/11",[54,1.938,55,1.104]],["command/11",[1,0.103,61,1.873,64,2.16]],["description/11",[50,0.735,59,1.036,62,1.525,63,1.992,64,1.525,67,2.246,68,1.992]],["keywords/11",[60,2.955]],["category/12",[54,1.938,55,1.104]],["command/12",[1,0.103,59,0.985,69,2.553]],["description/12",[59,0.962,70,3.639,71,2.755,72,3.106]],["keywords/12",[]],["category/13",[54,1.938,55,1.104]],["command/13",[1,0.083,22,0.934,73,2.265,74,2.992,75,2.049]],["description/13",[50,0.928,51,1.381,64,1.924,76,3.321,77,3.321]],["keywords/13",[]],["category/14",[78,0.8]],["command/14",[1,0.117,78,0.796]],["description/14",[40,1.301,44,1.788,57,1.669,78,0.622,79,2.514]],["keywords/14",[]],["category/15",[78,0.8]],["command/15",[1,0.092,18,1.159,78,0.868]],["description/15",[39,2.262,78,0.843]],["keywords/15",[]],["category/16",[78,0.8]],["command/16",[1,0.092,18,1.159,78,0.622,80,2.513]],["description/16",[45,1.535,51,1.27,78,0.572,79,2.312,80,2.312,81,3.054]],["keywords/16",[]],["category/17",[78,0.8]],["command/17",[1,0.092,18,1.159,53,1.923,78,0.622]],["description/17",[45,2.022,78,0.754,82,3.435]],["keywords/17",[]],["category/18",[78,0.8]],["command/18",[1,0.083,18,1.045,53,1.734,78,0.561,83,2.992]],["description/18",[39,2.022,78,0.754,82,3.435]],["keywords/18",[]],["category/19",[78,0.8]],["command/19",[1,0.075,18,0.951,43,1.709,53,1.578,73,2.062,78,0.51]],["description/19",[78,0.843,84,3.408]],["keywords/19",[]],["category/20",[78,0.8]],["command/20",[1,0.083,18,1.045,78,0.807,85,2.992]],["description/20",[44,1.959,45,1.829,78,0.682,86,2.493]],["keywords/20",[]],["category/21",[59,0.727,87,2.081,88,1.725]],["command/21",[1,0.103,59,0.985,89,2.821]],["description/21",[59,0.807,64,1.77,86,2.992,90,2.607,91,2.607]],["keywords/21",[]],["category/22",[59,0.727,87,2.081,88,1.725]],["command/22",[1,0.092,59,0.877,89,2.513,92,3.32]],["description/22",[44,1.522,50,0.79,59,1.092,71,2.14,88,1.773,93,2.827]],["keywords/22",[]],["category/23",[59,0.727,87,2.081,88,1.725]],["command/23",[1,0.117,94,4.249]],["description/23",[59,1.19,84,3.408]],["keywords/23",[]],["category/24",[95,1.775]],["command/24",[1,0.117,95,1.766]],["description/24",[58,2.835,59,0.878,96,3.321,97,3.321,98,3.321]],["keywords/24",[]],["category/25",[95,1.775]],["command/25",[1,0.103,95,1.55,99,3.727]],["description/25",[59,0.747,68,2.14,86,1.936,95,1.718,100,2.827,101,1.936]],["keywords/25",[]],["category/26",[95,1.775]],["command/26",[1,0.103,57,1.873,95,1.55]],["description/26",[57,2.022,95,1.673,101,2.757]],["keywords/26",[]],["category/27",[95,1.775]],["command/27",[1,0.103,95,1.55,102,3.727]],["description/27",[68,2.755,86,2.493,95,1.513,101,2.493]],["keywords/27",[]],["category/28",[51,1.391,61,1.681]],["command/28",[1,0.117,103,3.626]],["description/28",[50,0.928,51,1.381,57,1.669,78,0.622,79,2.514]],["keywords/28",[]],["category/29",[51,1.391,61,1.681]],["command/29",[1,0.092,59,0.877,103,2.833,104,3.32]],["description/29",[50,0.853,51,1.27,57,1.535,59,0.807,84,2.312,105,3.054]],["keywords/29",[]],["category/30",[51,1.391,61,1.681]],["command/30",[1,0.083,61,1.504,78,0.561,106,2.992,107,2.992]],["description/30",[62,1.77,63,2.312,67,2.607,72,2.607,78,0.572,108,3.054]],["keywords/30",[]],["category/31",[51,1.391,61,1.681]],["command/31",[1,0.103,22,1.164,62,2.16]],["description/31",[22,1.136,45,1.829,55,1.202,62,2.109]],["keywords/31",[]],["category/32",[109,1.883,110,1.883,111,1.883]],["command/32",[1,0.103,22,1.164,69,2.553]],["description/32",[22,1.29,44,1.522,55,0.933,71,2.14,112,2.413,113,2.827]],["keywords/32",[]],["category/33",[109,1.883,110,1.883,111,1.883]],["command/33",[1,0.092,22,1.036,69,2.274,114,2.833]],["description/33",[22,0.954,45,1.535,51,1.27,55,1.008,115,2.607,116,3.054]],["keywords/33",[]],["category/34",[109,1.883,110,1.883,111,1.883]],["command/34",[1,0.092,69,2.274,114,2.833,117,3.32]],["description/34",[44,1.788,55,1.096,90,2.835,91,2.835,115,2.835]],["keywords/34",[]],["category/35",[40,1.077,52,1.077,118,1.725]],["command/35",[1,0.092,78,0.622,119,2.513,120,2.833]],["description/35",[40,1.301,44,1.788,52,1.301,101,2.275,119,2.514]],["keywords/35",[]],["category/36",[40,1.077,52,1.077,118,1.725]],["command/36",[1,0.117,121,4.249]],["description/36",[43,1.916,48,2.312,51,1.27,52,1.197,55,1.008,122,3.054]],["keywords/36",[]],["category/37",[40,1.077,52,1.077,118,1.725]],["command/37",[1,0.103,52,1.46,123,3.727]],["description/37",[18,1.271,40,1.426,52,1.426,62,2.109]],["keywords/37",[]],["category/38",[40,1.077,52,1.077,118,1.725]],["command/38",[1,0.117,124,4.249]],["description/38",[55,1.202,80,2.755,125,3.639,126,3.639]],["keywords/38",[]],["category/39",[40,1.077,52,1.077,118,1.725]],["command/39",[1,0.075,18,0.951,52,1.575,89,2.062,127,2.724]],["description/39",[40,1.577,52,1.577,88,2.525]],["keywords/39",[]],["category/40",[128,0.753]],["command/40",[1,0.117,128,0.749]],["description/40",[57,2.262,128,0.794]],["keywords/40",[50,0.651,128,0.411,129,1.254]],["category/41",[128,0.753]],["command/41",[1,0.092,128,0.585,130,3.32,131,2.513]],["description/41",[45,1.829,57,1.829,128,0.642,131,2.755]],["keywords/41",[50,0.541,128,0.342,129,1.043,131,1.467]],["category/42",[128,0.753]],["command/42",[1,0.083,50,0.836,73,2.265,75,2.049,128,0.528]],["description/42",[39,2.022,128,0.71,132,3.435]],["keywords/42",[50,0.541,128,0.342,129,1.043,132,1.654]],["category/43",[128,0.753]],["command/43",[1,0.103,50,1.041,128,0.657]],["description/43",[39,2.022,128,0.71,133,3.435]],["keywords/43",[50,0.541,128,0.342,129,1.043,133,1.654]],["category/44",[128,0.753]],["command/44",[1,0.092,22,1.036,50,0.927,128,0.585]],["description/44",[22,1.406,128,0.794]],["keywords/44",[50,0.541,128,0.342,129,1.043,134,1.654]],["category/45",[128,0.753]],["command/45",[1,0.092,50,0.927,119,2.513,120,2.833]],["description/45",[128,0.794,135,4.502]],["keywords/45",[50,0.541,128,0.342,129,1.043,134,1.654]],["category/46",[128,0.753]],["command/46",[1,0.103,50,1.041,53,2.16]],["description/46",[53,2.608,128,0.794]],["keywords/46",[50,0.651,128,0.411,129,1.254]],["category/47",[109,1.883,110,1.883,111,1.883]],["command/47",[1,0.103,22,1.164,136,3.727]],["description/47",[22,1.257,55,1.329,75,2.757]],["keywords/47",[22,0.727,75,1.595,112,1.987]]],"invertedIndex":[["add",{"_index":65,"category":{},"command":{"10":{}},"description":{"10":{}},"keywords":{}}],["address",{"_index":27,"category":{},"command":{"4":{}},"description":{},"keywords":{}}],["afer",{"_index":113,"category":{},"command":{},"description":{"32":{}},"keywords":{}}],["alia",{"_index":120,"category":{},"command":{"35":{},"45":{}},"description":{},"keywords":{}}],["amend",{"_index":136,"category":{},"command":{"47":{}},"description":{},"keywords":{}}],["annot",{"_index":132,"category":{},"command":{},"description":{"42":{}},"keywords":{"42":{}}}],["apt",{"_index":6,"category":{},"command":{"1":{}},"description":{},"keywords":{}}],["apt-get",{"_index":10,"category":{},"command":{},"description":{},"keywords":{"1":{}}}],["area",{"_index":66,"category":{},"command":{},"description":{"10":{}},"keywords":{}}],["atach",{"_index":28,"category":{},"command":{},"description":{"4":{}},"keywords":{}}],["attach",{"_index":21,"category":{},"command":{},"description":{"3":{}},"keywords":{}}],["auto",{"_index":30,"category":{},"command":{"5":{}},"description":{},"keywords":{}}],["b",{"_index":83,"category":{},"command":{"18":{}},"description":{},"keywords":{}}],["back",{"_index":116,"category":{},"command":{},"description":{"33":{}},"keywords":{}}],["base",{"_index":8,"category":{},"command":{},"description":{"1":{}},"keywords":{}}],["between",{"_index":67,"category":{},"command":{},"description":{"11":{},"30":{}},"keywords":{}}],["branch",{"_index":78,"category":{"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{}},"command":{"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"30":{},"35":{}},"description":{"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"28":{},"30":{}},"keywords":{}}],["branch]...[second",{"_index":107,"category":{},"command":{"30":{}},"description":{},"keywords":{}}],["branch’",{"_index":81,"category":{},"command":{},"description":{"16":{}},"keywords":{}}],["brew",{"_index":2,"category":{},"command":{"0":{}},"description":{},"keywords":{}}],["cach",{"_index":92,"category":{},"command":{"22":{}},"description":{},"keywords":{}}],["cancel",{"_index":109,"category":{"32":{},"33":{},"34":{},"47":{}},"command":{},"description":{},"keywords":{}}],["chang",{"_index":55,"category":{"8":{},"9":{},"10":{},"11":{},"12":{},"13":{}},"command":{},"description":{"31":{},"32":{},"33":{},"34":{},"36":{},"38":{},"47":{}},"keywords":{"8":{},"9":{}}}],["changeset",{"_index":101,"category":{},"command":{},"description":{"25":{},"26":{},"27":{},"35":{}},"keywords":{}}],["checkout",{"_index":53,"category":{},"command":{"17":{},"18":{},"19":{},"46":{}},"description":{"46":{}},"keywords":{"7":{}}}],["choco",{"_index":11,"category":{},"command":{"2":{}},"description":{},"keywords":{"2":{}}}],["chocolatey",{"_index":13,"category":{},"command":{},"description":{"2":{}},"keywords":{}}],["clone",{"_index":46,"category":{},"command":{"7":{}},"description":{},"keywords":{"7":{}}}],["color",{"_index":33,"category":{},"command":{},"description":{"5":{}},"keywords":{"5":{}}}],["color.ui",{"_index":29,"category":{},"command":{"5":{}},"description":{},"keywords":{}}],["command",{"_index":34,"category":{},"command":{},"description":{"5":{}},"keywords":{}}],["commit",{"_index":22,"category":{},"command":{"13":{},"31":{},"32":{},"33":{},"44":{},"47":{}},"description":{"3":{},"4":{},"8":{},"31":{},"32":{},"33":{},"44":{},"47":{}},"keywords":{"8":{},"47":{}}}],["config",{"_index":15,"category":{},"command":{"3":{},"4":{},"5":{}},"description":{},"keywords":{}}],["configur",{"_index":14,"category":{"3":{},"4":{},"5":{}},"command":{},"description":{},"keywords":{"3":{},"4":{},"5":{}}}],["content",{"_index":72,"category":{},"command":{},"description":{"12":{},"30":{}},"keywords":{}}],["control",{"_index":93,"category":{},"command":{},"description":{"22":{}},"keywords":{}}],["creat",{"_index":39,"category":{"6":{},"7":{}},"command":{},"description":{"6":{},"15":{},"18":{},"42":{},"43":{}},"keywords":{"6":{}}}],["current",{"_index":79,"category":{},"command":{},"description":{"14":{},"16":{},"28":{}},"keywords":{}}],["custom",{"_index":38,"category":{},"command":{},"description":{},"keywords":{"5":{}}}],["d",{"_index":85,"category":{},"command":{"20":{}},"description":{},"keywords":{}}],["debian",{"_index":7,"category":{},"command":{},"description":{"1":{}},"keywords":{"1":{}}}],["delet",{"_index":86,"category":{},"command":{},"description":{"20":{},"21":{},"25":{},"27":{}},"keywords":{}}],["descript",{"_index":74,"category":{},"command":{"13":{}},"description":{},"keywords":{}}],["diff",{"_index":61,"category":{"28":{},"29":{},"30":{},"31":{}},"command":{"9":{},"11":{},"30":{}},"description":{},"keywords":{"9":{}}}],["differ",{"_index":63,"category":{},"command":{},"description":{"9":{},"11":{},"30":{}},"keywords":{}}],["directori",{"_index":91,"category":{},"command":{},"description":{"21":{},"34":{}},"keywords":{}}],["discard",{"_index":115,"category":{},"command":{},"description":{"33":{},"34":{}},"keywords":{}}],["download",{"_index":48,"category":{},"command":{},"description":{"7":{},"36":{}},"keywords":{"7":{}}}],["drop",{"_index":102,"category":{},"command":{"27":{}},"description":{},"keywords":{}}],["email",{"_index":24,"category":{},"command":{"4":{}},"description":{"4":{}},"keywords":{"3":{},"4":{}}}],["enabl",{"_index":31,"category":{},"command":{},"description":{"5":{}},"keywords":{}}],["entir",{"_index":49,"category":{},"command":{},"description":{"7":{}},"keywords":{}}],["fetch",{"_index":124,"category":{},"command":{"38":{}},"description":{},"keywords":{}}],["file",{"_index":59,"category":{"21":{},"22":{},"23":{}},"command":{"10":{},"12":{},"21":{},"22":{},"29":{}},"description":{"8":{},"9":{},"10":{},"11":{},"12":{},"21":{},"22":{},"23":{},"24":{},"25":{},"29":{}},"keywords":{}}],["first",{"_index":106,"category":{},"command":{"30":{}},"description":{},"keywords":{}}],["follow",{"_index":104,"category":{},"command":{"29":{}},"description":{},"keywords":{}}],["git",{"_index":1,"category":{"0":{},"1":{},"2":{}},"command":{"0":{},"1":{},"2":{},"3":{},"4":{},"5":{},"6":{},"7":{},"8":{},"9":{},"10":{},"11":{},"12":{},"13":{},"14":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"21":{},"22":{},"23":{},"24":{},"25":{},"26":{},"27":{},"28":{},"29":{},"30":{},"31":{},"32":{},"33":{},"34":{},"35":{},"36":{},"37":{},"38":{},"39":{},"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{},"47":{}},"description":{"0":{},"1":{},"2":{}},"keywords":{}}],["global",{"_index":16,"category":{},"command":{"3":{},"4":{},"5":{}},"description":{},"keywords":{}}],["hard",{"_index":114,"category":{},"command":{"33":{},"34":{}},"description":{},"keywords":{}}],["head",{"_index":117,"category":{},"command":{"34":{}},"description":{},"keywords":{}}],["help",{"_index":32,"category":{},"command":{},"description":{"5":{}},"keywords":{}}],["histori",{"_index":51,"category":{"28":{},"29":{},"30":{},"31":{}},"command":{},"description":{"7":{},"13":{},"16":{},"28":{},"29":{},"33":{},"36":{}},"keywords":{}}],["homebrew",{"_index":4,"category":{},"command":{},"description":{"0":{}},"keywords":{"0":{}}}],["includ",{"_index":105,"category":{},"command":{},"description":{"29":{}},"keywords":{}}],["incorpor",{"_index":122,"category":{},"command":{},"description":{"36":{}},"keywords":{}}],["init",{"_index":41,"category":{},"command":{"6":{}},"description":{},"keywords":{}}],["instal",{"_index":0,"category":{"0":{},"1":{},"2":{}},"command":{"0":{},"1":{},"2":{}},"description":{"0":{},"1":{},"2":{}},"keywords":{"0":{},"1":{},"2":{}}}],["l",{"_index":130,"category":{},"command":{"41":{}},"description":{},"keywords":{}}],["last",{"_index":68,"category":{},"command":{},"description":{"11":{},"25":{},"27":{}},"keywords":{}}],["later",{"_index":134,"category":{},"command":{},"description":{},"keywords":{"44":{},"45":{}}}],["latest",{"_index":125,"category":{},"command":{},"description":{"38":{}},"keywords":{}}],["lightweight",{"_index":133,"category":{},"command":{},"description":{"43":{}},"keywords":{"43":{}}}],["line",{"_index":35,"category":{},"command":{},"description":{"5":{}},"keywords":{}}],["linux",{"_index":9,"category":{},"command":{},"description":{"1":{}},"keywords":{"1":{}}}],["list",{"_index":57,"category":{},"command":{"26":{}},"description":{"8":{},"14":{},"26":{},"28":{},"29":{},"40":{},"41":{}},"keywords":{}}],["local",{"_index":44,"category":{},"command":{},"description":{"6":{},"14":{},"20":{},"22":{},"32":{},"34":{},"35":{}},"keywords":{}}],["log",{"_index":103,"category":{},"command":{"28":{},"29":{}},"description":{},"keywords":{}}],["m",{"_index":73,"category":{},"command":{"13":{},"19":{},"42":{}},"description":{},"keywords":{}}],["maco",{"_index":3,"category":{},"command":{},"description":{"0":{}},"keywords":{"0":{}}}],["make",{"_index":54,"category":{"8":{},"9":{},"10":{},"11":{},"12":{},"13":{}},"command":{},"description":{},"keywords":{}}],["merg",{"_index":80,"category":{},"command":{"16":{}},"description":{"16":{},"38":{}},"keywords":{}}],["messag",{"_index":75,"category":{},"command":{"13":{},"42":{}},"description":{"47":{}},"keywords":{"47":{}}}],["modif",{"_index":60,"category":{},"command":{},"description":{},"keywords":{"8":{},"9":{},"11":{}}}],["modifi",{"_index":58,"category":{},"command":{},"description":{"8":{},"24":{}},"keywords":{}}],["move",{"_index":87,"category":{"21":{},"22":{},"23":{}},"command":{},"description":{},"keywords":{}}],["mv",{"_index":94,"category":{},"command":{"23":{}},"description":{},"keywords":{}}],["name",{"_index":18,"category":{},"command":{"3":{},"6":{},"15":{},"16":{},"17":{},"18":{},"19":{},"20":{},"39":{}},"description":{"3":{},"6":{},"37":{}},"keywords":{"3":{},"4":{}}}],["new",{"_index":43,"category":{},"command":{"19":{}},"description":{"6":{},"8":{},"36":{}},"keywords":{"6":{}}}],["origin",{"_index":126,"category":{},"command":{},"description":{"38":{}},"keywords":{}}],["output",{"_index":36,"category":{},"command":{},"description":{"5":{}},"keywords":{}}],["pattern",{"_index":131,"category":{},"command":{"41":{}},"description":{"41":{}},"keywords":{"41":{}}}],["pop",{"_index":99,"category":{},"command":{"25":{}},"description":{},"keywords":{}}],["preserv",{"_index":71,"category":{},"command":{},"description":{"12":{},"22":{},"32":{}},"keywords":{}}],["project",{"_index":42,"category":{},"command":{"6":{}},"description":{"7":{}},"keywords":{"6":{}}}],["pull",{"_index":121,"category":{},"command":{"36":{}},"description":{},"keywords":{}}],["push",{"_index":119,"category":{},"command":{"35":{},"45":{}},"description":{"35":{}},"keywords":{}}],["record",{"_index":76,"category":{},"command":{},"description":{"13":{}},"keywords":{}}],["redo",{"_index":110,"category":{"32":{},"33":{},"34":{},"47":{}},"command":{},"description":{},"keywords":{}}],["releas",{"_index":129,"category":{},"command":{},"description":{},"keywords":{"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}}}],["remot",{"_index":52,"category":{"35":{},"36":{},"37":{},"38":{},"39":{}},"command":{"37":{},"39":{}},"description":{"35":{},"36":{},"37":{},"39":{}},"keywords":{"7":{}}}],["remov",{"_index":88,"category":{"21":{},"22":{},"23":{}},"command":{},"description":{"22":{},"39":{}},"keywords":{}}],["renam",{"_index":84,"category":{},"command":{},"description":{"19":{},"23":{},"29":{}},"keywords":{}}],["repo",{"_index":127,"category":{},"command":{"39":{}},"description":{},"keywords":{}}],["repositori",{"_index":40,"category":{"6":{},"7":{},"35":{},"36":{},"37":{},"38":{},"39":{}},"command":{},"description":{"6":{},"14":{},"35":{},"37":{},"39":{}},"keywords":{}}],["reset",{"_index":69,"category":{},"command":{"12":{},"32":{},"33":{},"34":{}},"description":{},"keywords":{}}],["restor",{"_index":100,"category":{},"command":{},"description":{"25":{}},"keywords":{}}],["rm",{"_index":89,"category":{},"command":{"21":{},"22":{},"39":{}},"description":{},"keywords":{}}],["set",{"_index":19,"category":{},"command":{},"description":{"3":{},"4":{}},"keywords":{}}],["share",{"_index":135,"category":{},"command":{},"description":{"45":{}},"keywords":{}}],["show",{"_index":62,"category":{},"command":{"31":{}},"description":{"9":{},"11":{},"30":{},"31":{},"37":{}},"keywords":{}}],["snapshot",{"_index":77,"category":{},"command":{},"description":{"13":{}},"keywords":{}}],["specifi",{"_index":45,"category":{},"command":{},"description":{"6":{},"10":{},"16":{},"17":{},"20":{},"31":{},"33":{},"41":{}},"keywords":{}}],["stage",{"_index":64,"category":{},"command":{"11":{}},"description":{"9":{},"10":{},"11":{},"13":{},"21":{}},"keywords":{}}],["stash",{"_index":95,"category":{"24":{},"25":{},"26":{},"27":{}},"command":{"24":{},"25":{},"26":{},"27":{}},"description":{"25":{},"26":{},"27":{}},"keywords":{}}],["statu",{"_index":56,"category":{},"command":{"8":{}},"description":{},"keywords":{}}],["store",{"_index":97,"category":{},"command":{},"description":{"24":{}},"keywords":{}}],["stuff",{"_index":111,"category":{"32":{},"33":{},"34":{},"47":{}},"command":{},"description":{},"keywords":{}}],["sudo",{"_index":5,"category":{},"command":{"1":{}},"description":{},"keywords":{}}],["switch",{"_index":82,"category":{},"command":{},"description":{"17":{},"18":{}},"keywords":{}}],["synchron",{"_index":118,"category":{"35":{},"36":{},"37":{},"38":{},"39":{}},"command":{},"description":{},"keywords":{}}],["tag",{"_index":128,"category":{"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}},"command":{"40":{},"41":{},"42":{},"43":{},"44":{}},"description":{"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}},"keywords":{"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}}}],["temporarili",{"_index":96,"category":{},"command":{},"description":{"24":{}},"keywords":{}}],["track",{"_index":98,"category":{},"command":{},"description":{"24":{}},"keywords":{}}],["transact",{"_index":23,"category":{},"command":{},"description":{"3":{},"4":{}},"keywords":{}}],["two",{"_index":108,"category":{},"command":{},"description":{"30":{}},"keywords":{}}],["ui",{"_index":37,"category":{},"command":{},"description":{},"keywords":{"5":{}}}],["undo",{"_index":112,"category":{},"command":{},"description":{"32":{}},"keywords":{"47":{}}}],["unstag",{"_index":70,"category":{},"command":{},"description":{"12":{}},"keywords":{}}],["url",{"_index":47,"category":{},"command":{"7":{}},"description":{},"keywords":{}}],["user",{"_index":25,"category":{},"command":{},"description":{},"keywords":{"3":{},"4":{}}}],["user.email",{"_index":26,"category":{},"command":{"4":{}},"description":{},"keywords":{}}],["user.nam",{"_index":17,"category":{},"command":{"3":{}},"description":{},"keywords":{}}],["v",{"_index":123,"category":{},"command":{"37":{}},"description":{},"keywords":{}}],["version",{"_index":50,"category":{},"command":{"42":{},"43":{},"44":{},"45":{},"46":{}},"description":{"7":{},"11":{},"13":{},"22":{},"28":{},"29":{}},"keywords":{"40":{},"41":{},"42":{},"43":{},"44":{},"45":{},"46":{}}}],["want",{"_index":20,"category":{},"command":{},"description":{"3":{},"4":{}},"keywords":{}}],["window",{"_index":12,"category":{},"command":{},"description":{"2":{}},"keywords":{"2":{}}}],["work",{"_index":90,"category":{},"command":{},"description":{"21":{},"34":{}},"keywords":{}}]],"pipeline":["stemmer"]}
--------------------------------------------------------------------------------