{
    "componentChunkName": "component---src-templates-docs-js",
    "path": "/vecka5-versionshantering/jobba-med-git",
    "result": {"data":{"site":{"siteMetadata":{"title":"Linnéuniversitetet","language":"sv","courseCode":"1DV613"}},"mdx":{"fields":{"id":"ce35ea50-ef55-5d9d-a6bb-9e60e3d55f07","title":"Jobba med Git","slug":"/vecka5-versionshantering/jobba-med-git"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Jobba med Git\",\n  \"metaTitle\": \"1DV613 | Jobba med Git\",\n  \"metaDescription\": \"metaDescription\",\n  \"order\": 3\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Introduktion till att arbeta med versionshantering\"), mdx(\"p\", null, \"Git \\xE4r ett versionshanteringssytem, som g\\xF6r det m\\xF6jligt att hantera \\xE4ndringar av filer. Git hj\\xE4lper till med att avg\\xF6ra vad som \\xE4ndrats, vem som \\xE4ndrade och varf\\xF6r. Git \\xE4r inte det enda versionshanteringssystemet, men ett av de absolut mest popul\\xE4ra.\"), mdx(\"h2\", null, \"Grundl\\xE4ggande Git-kommandon\"), mdx(\"p\", null, \"En f\\xF6ruts\\xE4ttning f\\xF6r att arbeta effektivt med versionshantering \\xE4r att ha k\\xE4nnedom om de mest grundl\\xE4ggande Git-kommandona och fl\\xF6den de ger upphov till.\"), mdx(\"p\", null, \"Den lokala datorn har tre olika areor, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"working directory\"), \", \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"staging area\"), \" och \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"local repository\"), \".\"), mdx(\"p\", null, \"I \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"working directory\"), \" g\\xF6r du alla \\xE4ndringar, som att l\\xE4gga till nya filer (m\\xE4rks som \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"untracked\"), \"), \\xE4ndra i filer (m\\xE4rks som \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"modified\"), \") och ta bort filer (m\\xE4rks som \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"deleted\"), \"). Genom att anv\\xE4nda \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git status\"), \" kan du f\\xE5 aktuell status f\\xF6r ditt \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"working directory\"), \", och se om det finns \\xE4ndringar som beh\\xF6ver l\\xE4ggas till \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"staging area\"), \".\"), mdx(\"p\", null, \"F\\xF6r att \\xE4ndring som g\\xF6rs i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"working directory\"), \" ska kunna skickas till \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"local repository\"), \" m\\xE5ste de f\\xF6rst placeras i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"staging area\"), \", vilket du g\\xF6r med \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git add .\"), \", som f\\xF6rberedelse inf\\xF6r en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"commit\"), \".\"), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Local repository\"), \" inneh\\xE5ller samtliga \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"commits\"), \" (och \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"branches\"), \").\"), mdx(\"p\", null, \"P\\xE5 en server \\xE5terfinns det som kallas \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"remote repository\"), \".\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"https://gitlab.lnu.se/1dv613/content/guides/-/raw/master/.images/simple-git-flow.png\",\n    \"alt\": \"Simple Git Flow\"\n  })), mdx(\"h3\", null, \"git clone \", \"<\", \"repository\", \">\"), mdx(\"p\", null, \"Laddar ner ett repositorium till din dator. Som standard skapas en katalog, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"working directory\\\"\"), \", med repositoriets namn, inneh\\xE5llande samtliga filer. Argumentet \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<repository>\"), \" \\xE4r en Git URL till ett \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"remote repository\\\"\"), \" och kallas \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"remote origin\\\"\"), \", platsen varifr\\xE5n filerna ursprungligen h\\xE4mtades.\"), mdx(\"h3\", null, \"git add\"), mdx(\"p\", null, \"Efter att \\xE4ndringar gjorts i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"working directory\\\"\"), \" markerar detta kommando \\xE4ndringar som gjorts som \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"staged\"), \", inneb\\xE4rande att de \\xE4r redo f\\xF6r en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \". Med kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git status\"), \" kan du kontrollera om det finns \\xE4ndringar som \\xE4r \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"staged\\\"\"), \" eller inte.\"), mdx(\"h3\", null, \"git commit -m '\", \"<\", \"message\", \">\", \"'\"), mdx(\"p\", null, \"Spara \\xE4ndringar som finns i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"staging area\\\"\"), \" lokalt i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"local repository\\\"\"), \". Anv\\xE4nder du v\\xE4xeln \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"-a\"), \" beh\\xF6ver du inte anv\\xE4nda \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git add .\"), \", d\\xE5 \\xE4ndringar d\\xE5 f\\xF6rst hamnar i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"staging area\\\"\"), \" f\\xF6r att sedan sparas lokalt.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, mdx(\"em\", {\n    parentName: \"strong\"\n  }, \"OBS !\")), \" Anv\\xE4nder du \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git commit -a -m '<message>'\"), \" kommer inga nya filer att l\\xE4ggas i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"staging area\\\"\"), \". F\\xF6r att nya filer ska placeras i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"staging area\\\"\"), \" m\\xE5ste du anv\\xE4nda \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git add\"), \".\")), mdx(\"h3\", null, \"git push\"), mdx(\"p\", null, \"Laddar upp inneh\\xE5ll, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \", i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"local repository\\\"\"), \" till \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"remote repository\\\"\"), \".\"), mdx(\"h3\", null, \"git fetch\"), mdx(\"p\", null, \"Laddar ner det senaste informationen fr\\xE5n \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"remote repository\\\"\"), \" (som exempelvis alla \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \", till exempel \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \"). Inga lokala filer i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"working directory\\\"\"), \" \\xE4ndras, enbart informationen i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"local repository\\\"\"), \" uppdateras.\"), mdx(\"h3\", null, \"git merge \", \"<\", \"other-branch\", \">\"), mdx(\"p\", null, \"Tar samtliga \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" fr\\xE5n angiven \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" och l\\xE4gger till dem till aktuell \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \". \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"Working directory\\\"\"), \" uppdateras som ett resultat av kommandot. Det kan uppst\\xE5 konflikter d\\xE5 Git inte kan avg\\xF6ra vilka f\\xF6r\\xE4ndringar som ska v\\xE4ljas, varf\\xF6r du kan beh\\xF6va hj\\xE4lpa till med att v\\xE4lja vilken f\\xF6r\\xE4ndring som ska g\\xE4lla.\"), mdx(\"h3\", null, \"git pull\"), mdx(\"p\", null, \"Sl\\xE5r samman f\\xF6r\\xE4ndringar fr\\xE5n \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"remote repository\\\"\"), \" med aktuell \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \". (Kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git push\"), \" \\xE4r samma sak som \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git fetch\"), \" f\\xF6ljt av \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git merge FETCH_HEAD\"), \".)\"), mdx(\"h2\", null, \"Arbeta med Git\"), mdx(\"p\", null, \"Distribuerade versionshanteringssystem som Git g\\xF6r det m\\xF6jligt f\\xF6r dig att dela och hantera kod (och andra n\\xF6dv\\xE4ndiga resurser). F\\xF6r att arbetet med den hanterade koden ska fungera p\\xE5 ett bra s\\xE4tt \\xE4r det viktigt att det finns en arbetsg\\xE5ng att f\\xF6lja. Genom att f\\xF6lja en arbetsg\\xE5ng kan mindre tid \\xE4gnas \\xE5t versionshantering och mer tid \\xE5t att skriva kod.\"), mdx(\"p\", null, \"Git erbjuder mer \\xE4n hantering av f\\xF6r\\xE4ndringar av inneh\\xE5llet i ett \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"working directory\\\"\"), \". M\\xF6jlighet att, genom \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \", bedriva utveckling av olika delar av den hanterade koden samtidigt \\xE4r central. Detta \\xE4r en f\\xF6ruts\\xE4ttning fr\\xE4mst d\\xE5 flera utvecklare arbetar parallellt med olika delar av den hanterade koden, men \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \" \\xE4r \\xE4ven av intresse d\\xE5 du \\xE4r en ensam utvecklare.\"), mdx(\"p\", null, \"Det finns flera f\\xF6rslag till arbetsg\\xE5ngar, eller arbetsfl\\xF6den, att f\\xF6lja, exempelvis \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://nvie.com/posts/a-successful-git-branching-model/\"\n  }, mdx(\"em\", {\n    parentName: \"a\"\n  }, \"Git Flow\")), \", \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://guides.github.com/introduction/flow/\"\n  }, mdx(\"em\", {\n    parentName: \"a\"\n  }, \"GitHub Flow\")), \", \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.gitlab.com/ee/topics/gitlab_flow.html\"\n  }, mdx(\"em\", {\n    parentName: \"a\"\n  }, \"GitLab Flow\")), \" och \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/release-flow\"\n  }, mdx(\"em\", {\n    parentName: \"a\"\n  }, \"Release Flow\")), \". De har sina egenheter, f\\xF6r- och nackdelar, och du kan bilda din egen uppfattning genom att studera och j\\xE4mf\\xF6ra de olika arbetsfl\\xF6dena.\"), mdx(\"p\", null, \"Exemplen ovan p\\xE5 arbetsfl\\xF6den kan s\\xE4kert i vissa avseenden upplevas som komplexa och sv\\xE5rarbetade. De \\xE4r fr\\xE4mst framtagna f\\xF6r att fungera v\\xE4l d\\xE5 flera utvecklare samarbetar och bidrar med olika delar till den hanterade koden.\"), mdx(\"p\", null, \"Det finns flera f\\xF6rdelar att arbeta utefter ett arbetsfl\\xF6de \\xE4ven f\\xF6r den ensamma utvecklaren. \\xC4ven om behovet att samarbeta med andra utvecklare inte finns s\\xE5 finns situationer d\\xE5 arbetet har f\\xF6ruts\\xE4ttningar att bli enklare. En ensam utvecklare kan till exempel beh\\xF6va arbeta med flera olika delar av den hanterade koden parallellt, vilket kan bli sv\\xE5rt utan att ha ett bra arbetsfl\\xF6de p\\xE5 plats.\"), mdx(\"h3\", null, \"Arbetsfl\\xF6den bygger p\\xE5 \", mdx(\"em\", {\n    parentName: \"h3\"\n  }, \"\\\"branches\\\"\")), mdx(\"p\", null, \"Oavsett typ av arbetsfl\\xF6de s\\xE5 anv\\xE4nds \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \", varf\\xF6r denna typ av arbetsfl\\xF6de ofta ben\\xE4mns \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch strategies\\\"\"), \".\"), mdx(\"p\", null, \"M\\xE5nga projekt har en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"backlog\\\"\"), \" med funktionalitet att implementera och buggar att \\xE5tg\\xE4rda. Ett s\\xE4tt att arbeta med kod r\\xF6rande funktionalitet och \\xE5tg\\xE4rd av buggar \\xE4r att g\\xF6ra \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" direkt till din \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \". En kedja med \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" skapas och nya \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" l\\xE4ggs till efter varandra.\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"https://gitlab.lnu.se/1dv613/content/guides/-/raw/master/.images/master-branch.png\",\n    \"alt\": \"Master branch\"\n  })), mdx(\"p\", null, \"Genom att, ut\\xF6ver \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \", anv\\xE4nda en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" f\\xF6r en funktionalitet, en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" f\\xF6r \\xE5tg\\xE4rd av en bugg kan en ensam utvecklare arbeta parallellt med olika delar av den hanterade koden.\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"https://gitlab.lnu.se/1dv613/content/guides/-/raw/master/.images/multiple-branches.png\",\n    \"alt\": \"Multiple branches\"\n  })), mdx(\"p\", null, \"Cirklarna representerar gjorda \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \". De olika f\\xE4rgerna indikerar olika \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \": \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master\\\", \"), \"\\\"bugFix\\\"\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \" och \"), \"\\\"feature\\\"\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \". Asterisken som avslutar \"), \"\\\"bugFix\\\"\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \" i figuren indikerar att det \\xE4r just denna \"), \"\\\"branch\\\"\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \" som \\xE4r aktiv. En \"), \"\\\"commit\\\"\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \" som g\\xF6rs kommer att l\\xE4ggas till i slutet av den \"), \"\\\"branch\\\"\", \"_\", \" som \\xE4r aktiv.\"), mdx(\"p\", null, \"N\\xE4r arbetet i en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" \\xE4r klart \\xE5terst\\xE5r det att sl\\xE5 samman koden med \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \". Efter att en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" slagits samman med \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \" kan den tas bort. Tas en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" bort, som slagits samman med en annan \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \", \\xE4r det bara namnet som tas bort och inga av de \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" som gjorts.\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"https://gitlab.lnu.se/1dv613/content/guides/-/raw/master/.images/merged-branches.png\",\n    \"alt\": \"Merged branches\"\n  })), mdx(\"p\", null, \"N\\xE4r en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" sl\\xE5s samman med en annan, skapas en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge commit\\\"\"), \" (C11/C12) representerande sj\\xE4lva sammanslagningen.\"), mdx(\"h3\", null, \"Git-kommandon f\\xF6r \", mdx(\"em\", {\n    parentName: \"h3\"\n  }, \"\\\"branches\\\"\")), mdx(\"p\", null, \"Kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git branch\"), \" listar existerande \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \" i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"local repository\\\"\"), \". Asterisken visar vilken \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" som \\xE4r aktiv.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-shell\"\n  }, \"$ git branch\\n* master\\n\")), mdx(\"p\", null, \"Kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git branch <new-branch-name>\"), \" skapat en ny \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" baserad p\\xE5 aktiv \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \". Aktiv \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" \\xE4ndras inte.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-shell\"\n  }, \"$ git branch bugFix\\n\\n$ git branch\\n  bugFix\\n* master\\n\")), mdx(\"p\", null, \"Med kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git checkout <branch-name>\"), \" byter du aktiv \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \". Inneh\\xE5llet i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"working directory\\\"\"), \" uppdateras f\\xF6r att \\xF6verensst\\xE4mma med inneh\\xE5llet i aktiverad \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-shell\"\n  }, \"$ git checkout bugFix\\nSwitched to branch 'bugFix'\\n\\n$ git branch\\n* bugFix\\n  master\\n\")), mdx(\"p\", null, \"Kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git checkout -b <new-branch-name>\"), \" skapar och byter aktiv \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" till nyligen skapad \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-shell\"\n  }, \"$ git checkout master\\nSwitched to branch 'master'\\n\\n$ git checkout -b feature\\nSwitched to new branch 'feature'\\n\\n$ git branch\\n  bugFix\\n* feature\\n  master\\n\")), mdx(\"p\", null, \"F\\xF6r att p\\xE5 den lokala datorn sl\\xE5 samman aktiv \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" med en annan \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" anv\\xE4nder du kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git merge <other-branch>\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-shell\"\n  }, \"$ git checkout master\\nSwitched to branch 'master'\\n\\n$ git merge bugFix\\nMerge made by the 'recursive' strategy.\\n app.js | 0\\n 1 file changed, 4 insertions(+), 2 deletions(-)\\n create mode 100644 app.js\\n\")), mdx(\"p\", null, \"Vill du inte beh\\xE5lla en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" efter en sammanslagning kan du ta bort den med \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git branch -d <branch-to-delete>\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-shell\"\n  }, \"$ git branch -d bugFix\\nDeleted branch bugFix (was 55c4b2d).\\n\\n$ git branch\\n  feature\\n* master\\n\")), mdx(\"p\", null, \"F\\xF6r att du ska kunna ta bort en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" m\\xE5ste den vara fullst\\xE4ndigt sammanslagen med en annan \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \". \\xC4r en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" inte fullst\\xE4ndigt sammanslagen och du vill ta bort den trots det kan du l\\xE4gga till \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"-f\"), \", kort f\\xF6r \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--force\"), \", f\\xF6r att tvinga Git att ta bort den.\"), mdx(\"h3\", null, \"Hantering av \", mdx(\"em\", {\n    parentName: \"h3\"\n  }, \"\\\"commits\\\"\"), \" i samband med \", mdx(\"em\", {\n    parentName: \"h3\"\n  }, \"\\\"merge\\\"\")), mdx(\"p\", null, \"N\\xE4r du sl\\xE5r samman en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" med en annan kan du v\\xE4lja att beh\\xE5lla alla individuella \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \", eller att sl\\xE5 samman alla \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" till en enda \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge commit\\\"\"), \".\"), mdx(\"p\", null, \"Lokalt p\\xE5 din dator kan du med kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git merge <other-branch>\"), \" g\\xF6ra en fullst\\xE4ndig sammanslagning och alla individuella \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" beh\\xE5lls.\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"https://gitlab.lnu.se/1dv613/content/guides/-/raw/master/.images/branch-fully-merged.png\",\n    \"alt\": \"Merged branches\"\n  })), mdx(\"p\", null, \"Vill du trycka ihop samtliga \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" i en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" till en enda \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \", en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge commit\\\"\"), \", kan du g\\xF6ra det med kommandot \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git merge --squash feature\"), \".\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"https://gitlab.lnu.se/1dv613/content/guides/-/raw/master/.images/branch-merged-with-squash.png\",\n    \"alt\": \"Merged branches\"\n  })), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"OBS!\"), \" N\\xE4r du anv\\xE4nder \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--squash\"), \" uppdateras ditt \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"working directory\\\"\"), \" och \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"staging area\\\"\"), \" men n\\xE5gon \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \" skapas inte automatiskt, utan det f\\xE5r du g\\xF6ra sj\\xE4lv.\")), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"OBS!\"), \" N\\xE4r du anv\\xE4nder \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--squash\"), \" s\\xE5 r\\xE4knas det inte som en fullst\\xE4ndig sammanslagning varf\\xF6r du m\\xE5ste anv\\xE4nda \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"-f\"), \" om du vill ta bort den \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \" som slagits samman.\")), mdx(\"p\", null, \"Vilka effekter ger det att anv\\xE4nda \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--squash\"), \" vid \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"git merge\"), \"? Det kommer att endast finnas en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \" i slut\\xE4ndan f\\xF6r att representera alla individuella \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" i en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch\\\"\"), \". Din \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \" blir d\\xE5 renare utan alla \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" som gjorts d\\xE5 den endast kommer att inneh\\xE5lla \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge commits\\\"\"), \" med sammanfattande \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \"-meddelanden. Att konsekvent beh\\xE5lla samtliga \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" i samband med \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge\\\"\"), \" ger m\\xE5nga f\\xF6rgreningar vilket kan ge en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"master branch\\\"\"), \" som med tiden blir sv\\xE5r att \\xF6verblicka. Detta i synnerhet om flera parallella \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branches\\\"\"), \" anv\\xE4nds. En anna sak att ta i beaktande \\xE4r att du kanske inte beh\\xF6ver l\\xE4gga s\\xE5 mycket m\\xF6da p\\xE5 att f\\xF6rfatta perfekta \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \"-meddelanden om du vet att de \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commits\\\"\"), \" du g\\xF6r i slut\\xE4ndan \\xE5nd\\xE5 kommer att ers\\xE4ttas med ett enda sammanfattande \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"commit\\\"\"), \"-meddelande.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"OBS!\"), \" Du beh\\xF6ver inte (ska inte?) anv\\xE4nda \\\"git merge\\\" lokalt! Du kan ist\\xE4llet anv\\xE4nda GitLabs \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge reguest\\\"\"), \" och uppn\\xE5 exakt samma sak. I den avslutande f\\xF6rslaget till arbetsfl\\xF6de anv\\xE4nds just GitLab f\\xF6r att g\\xF6ra en \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"merge\\\"\"), \", fast d\\xE5 i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"remote repository\\\"\"), \" ist\\xE4llet f\\xF6r i \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"local repository\\\"\"), \".\")), mdx(\"h3\", null, \"Ett enkelt arbetsfl\\xF6de\"), mdx(\"p\", null, \"Best\\xE4m dig f\\xF6r och h\\xE5ll dig till ett arbetsfl\\xF6de, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"branch strategy\\\"\"), \", som \\xE4r enkelt att f\\xF6lja. Som utg\\xE5ngspunkt kan du ha f\\xF6ljande punkter:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Se till att din \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"master branch\\\"\"), \" inneh\\xE5ller stabil kod av h\\xF6g kvalitet.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Utg\\xE5 alltid fr\\xE5n \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"master branch\\\"\"), \" n\\xE4r en ny \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"branch\\\"\"), \" skapas.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Anv\\xE4nda g\\xE4rna prefix vid namngivning av olika \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"branches\\\"\"), \" f\\xF6r att enkelt kunna gruppera dem. En \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"branch\\\"\"), \" som l\\xE4gger till ny funktionalitet f\\xF6r att logga in kan exempelvis ges namnet \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"feature/login\\\"\"), \". En \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"branch\\\"\"), \" som \\xE5tg\\xE4rdar en bugg kan ges namnet \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"bugFix/login_error_status_code\\\"\"), \". (Det kan ocks\\xE5 vara en bra id\\xE9 att anv\\xE4nda eventuella \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"issue IDs\\\"\"), \" vid namngivningen.)\"))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ha som ambition att aldrig g\\xF6r en \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"push\\\"\"), \" av en eller flera \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"commits\\\"\"), \" till din \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"master branch\\\"\"), \". Se ist\\xE4llet till att anv\\xE4nda \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"merge requests\\\"\"), \" f\\xF6r att sl\\xE5 samman kod fr\\xE5n olika \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"branches\\\"\"), \" med din \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"\\\"master branch\\\"\"), \".\")), mdx(\"p\", null, \"Under rubriken \\\"Adding a new feature (or bug fix, or hot fix, or whatever)\\\" hittar du ett f\\xF6rslag till ett arbetsfl\\xF6de som bygger p\\xE5 ovanst\\xE5ende.\"), mdx(\"hr\", null), mdx(\"h2\", null, \"Adding a new feature (or bug fix, or hotfix, or whatever)\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Verify that the current branch is the master branch by showing all the branches and switch to the master branch if necessary.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git branch\"), mdx(\"br\", null), \"\\nIf the master branch in the local branches' list is not starred, you need to switch to it.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git checkout master\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Create a new branch (feature/login, bugfix/login_error_status_code). - \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git branch feature/login\"), mdx(\"br\", null), \"\\nThis step and the next one could be combined into a single step\", mdx(\"br\", null), mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git checkout -b feature/login\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Change to the new branch.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git checkout feature/login\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Repeat\\u2026\", mdx(\"ol\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Make changes in the working directory.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Add the changes to the staging area.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git add .\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Commit the changes to the local repository.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git commit -m '<message>'\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"(On occasion, maybe push the commits in the branch to the remote repository.)\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git push --set-upstream origin feature/login\")))))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"\\u2026until the feature is implemented.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Push the final commits in the branch to the remote repository.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git push\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"At the remote repository (GitLab)\", mdx(\"ol\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Create and submit a merge request.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Delete the source branch when the merge request is accepted?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Squash commits when the merge request is accepted?\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Add a new commit message for the squashed commits.\"))))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Accept the merge request.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The last chance to decide whether to delete the branch.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The last chance to decide whether to squash the commits.\"))))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Go back to the local repository.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Change to the master branch.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git checkout master\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Ge the changes from the remote repository.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git pull\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Update the remotes?\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git remote update origin\")))), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Remove local branches?\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git branch -d feature/login\"), mdx(\"br\", null), \"\\nor\", mdx(\"br\", null), mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git branch -d -f feature/login\"), mdx(\"br\", null), \"\\nor the short version\", mdx(\"br\", null), mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"git branch -D feature/login\"))))), mdx(\"hr\", null));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#introduktion-till-att-arbeta-med-versionshantering","title":"Introduktion till att arbeta med versionshantering","items":[{"url":"#grundläggande-git-kommandon","title":"Grundläggande Git-kommandon","items":[{"url":"#git-clone-repository","title":"git clone <repository>"},{"url":"#git-add","title":"git add"},{"url":"#git-commit--m-message","title":"git commit -m '<message>'"},{"url":"#git-push","title":"git push"},{"url":"#git-fetch","title":"git fetch"},{"url":"#git-merge-other-branch","title":"git merge <other-branch>"},{"url":"#git-pull","title":"git pull"}]},{"url":"#arbeta-med-git","title":"Arbeta med Git","items":[{"url":"#arbetsflöden-bygger-på-branches","title":"Arbetsflöden bygger på \"branches\""},{"url":"#git-kommandon-för-branches","title":"Git-kommandon för \"branches\""},{"url":"#hantering-av-commits-i-samband-med-merge","title":"Hantering av \"commits\" i samband med \"merge\""},{"url":"#ett-enkelt-arbetsflöde","title":"Ett enkelt arbetsflöde"}]},{"url":"#adding-a-new-feature-or-bug-fix-or-hotfix-or-whatever","title":"Adding a new feature (or bug fix, or hotfix, or whatever)"}]}]},"parent":{"relativePath":"vecka5-versionshantering/jobba-med-git.md"},"frontmatter":{"metaTitle":"1DV613 | Jobba med Git","metaDescription":"metaDescription","fullWidth":null}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/","title":"🎉 Välkommen till Mjukvaruutvecklingsprojekt (1DV613)"}}},{"node":{"fields":{"slug":"/video-loggar","title":"Videologgar"}}},{"node":{"fields":{"slug":"/studieguiden","title":"Studieguiden"}}},{"node":{"fields":{"slug":"/studieguiden/kommunikationsstrategi","title":"Kommunikationsstrategi"}}},{"node":{"fields":{"slug":"/studieguiden/kursledning","title":"Kursledning"}}},{"node":{"fields":{"slug":"/studieguiden/kursplan","title":"Kursplan och betyg"}}},{"node":{"fields":{"slug":"/studieguiden/litteratur","title":"Kurslitteratur"}}},{"node":{"fields":{"slug":"/studieguiden/schema","title":"Schema och deadlines"}}},{"node":{"fields":{"slug":"/studieguiden/studieanvisningar","title":"Studieanvisningar"}}},{"node":{"fields":{"slug":"/studieguiden/utvarderingar","title":"Kursvärderingar"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/dokumentation","title":"Dokumentation"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision","title":"Vecka 1/2 - Planering och vision"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/todo","title":"📅 Att göra-lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/vision","title":"Projektvision"}}},{"node":{"fields":{"slug":"/vecka10-etik","title":"Vecka 10 - Etik & överlämning"}}},{"node":{"fields":{"slug":"/vecka10-etik/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/arbeta-i-projekt","title":"Att arbeta i projekt"}}},{"node":{"fields":{"slug":"/vecka3-krav-test","title":"Vecka 3 - Krav och testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/testning","title":"Testning"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka3-krav-test/vecka3-krav-test","title":"Kravhantering"}}},{"node":{"fields":{"slug":"/vecka4-implementation/arkitektur","title":"Introduktion till mjukvaruarkitektur"}}},{"node":{"fields":{"slug":"/vecka4-implementation/docker-teori","title":"Introduktion till containers"}}},{"node":{"fields":{"slug":"/vecka4-implementation","title":"Vecka 4 - Implementation"}}},{"node":{"fields":{"slug":"/vecka4-implementation/just-task-it-docker","title":"Introduktion till Docker"}}},{"node":{"fields":{"slug":"/vecka4-implementation/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering","title":"Vecka 5 - Versionshantering"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/jobba-med-git","title":"Jobba med Git"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka5-versionshantering/versionshantering","title":"Versionshantering"}}},{"node":{"fields":{"slug":"/vecka6-drift/docker-compose-teori","title":"Introduktion till Docker compose"}}},{"node":{"fields":{"slug":"/vecka6-drift","title":"Vecka 6 - Driftsättning"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-docker-compose","title":"JTI - Docker Compose"}}},{"node":{"fields":{"slug":"/vecka6-drift/just-task-it-production","title":"JTI - Production"}}},{"node":{"fields":{"slug":"/vecka6-drift/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/ci-cd","title":"CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd","title":"Vecka 7 - CI/CD"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/just-task-it-deploy-pipeline","title":"JTI - Deploy through a pipeline"}}},{"node":{"fields":{"slug":"/vecka7-ci-cd/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/automatiska-tester","title":"Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test","title":"Vecka 8 - Automatiserad testning"}}},{"node":{"fields":{"slug":"/vecka8-automatiska-test/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare","title":"Extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka9-leverans","title":"Vecka 9 - Slutleverans"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/extern-uppdragsgivare-samverkan","title":"Samverkansinformation: studentprojekt med extern uppdragsgivare"}}},{"node":{"fields":{"slug":"/vecka9-leverans/todo","title":"Att göra lista"}}},{"node":{"fields":{"slug":"/vecka1-2-planering-vision/extern-updragsgivare/vagledning","title":"Vägledning för arbete med extern uppdragsgivare"}}}]}},"pageContext":{"id":"ce35ea50-ef55-5d9d-a6bb-9e60e3d55f07"}},
    "staticQueryHashes": ["253607798","3706406642","710574383"]}