├── 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 | Logo 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 | 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
      {listItems}
    ; 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 | 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"]} --------------------------------------------------------------------------------