{"id":1280,"date":"2026-11-10T15:32:17","date_gmt":"2026-11-10T15:32:17","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/?p=1280"},"modified":"2026-11-10T15:32:18","modified_gmt":"2026-11-10T15:32:18","slug":"aws-codecommit-complete-step-by-step-tutorial","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/aws-codecommit-complete-step-by-step-tutorial\/","title":{"rendered":"AWS CodeCommit \u2013 Complete Step-by-Step Tutorial"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Beginner to Advanced | macOS, Linux, Git, SSH, IAM, CodeBuild<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This master tutorial covers the complete AWS CodeCommit workflow, from creating your first repository to managing source code, collaborating through branches and pull requests, and integrating with AWS CI\/CD services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your <code>demo1<\/code> repository is already working successfully. Your terminal output confirms that you cloned the repository, created two commits, and pushed both to AWS CodeCommit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Your working environment<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Working<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Setting<\/th><th>Value<\/th><\/tr><tr><td>AWS service<\/td><td>CodeCommit<\/td><\/tr><tr><td>Repository<\/td><td><code>demo1<\/code><\/td><\/tr><tr><td>AWS Region<\/td><td><code>ap-southeast-2<\/code> (Sydney)<\/td><\/tr><tr><td>Local OS<\/td><td>macOS<\/td><\/tr><tr><td>Authentication<\/td><td>SSH using RSA 4096<\/td><\/tr><tr><td>Private key<\/td><td><code>~\/.ssh\/id_rsa_codecommit<\/code><\/td><\/tr><tr><td>Main branch<\/td><td><code>main<\/code><\/td><\/tr><tr><td>Latest supplied commit<\/td><td><code>b067930<\/code><\/td><\/tr><tr><td>Files<\/td><td><code>demo.txt<\/code>, <code>buildspec.yaml<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What you will learn<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AWS IAM setup and permissions<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Creating and configuring repositories<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Generating SSH keys and connecting securely<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Clone, add, commit, push, pull and fetch<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Branches, merging and pull requests<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Version management, tags and rollback<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CodeBuild and CI\/CD integration<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common errors and troubleshooting<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Understanding AWS CodeCommit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AWS CodeCommit is a fully managed Git repository hosting service. It stores your source code in private repositories and integrates with AWS IAM, CodeBuild, CodePipeline, CloudTrail and other AWS services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Developer pushes code to CodeCommit, where AWS build and deployment services can consume it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CodeCommit returned to full general availability on November 24, 2025, including access for new customers. AWS DevOps &amp; Developer Productivity Blog<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You need an AWS account, an IAM identity with CodeCommit permissions, Git, an SSH client and optionally AWS CLI for repository management.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2.1 \u2014 Install Git and AWS CLI on macOS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Using Homebrew:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew install git awscli<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check versions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git --version\naws --version\nssh -V<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Ubuntu\/Debian:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install -y git openssh-client<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Install AWS CLI v2 separately from the official AWS instructions if you need CLI functionality on Linux.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2.2 \u2014 Configure AWS CLI (optional for SSH Git access)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>aws configure --profile codecommit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enter your AWS access key, secret key, default region <code>ap-southeast-2<\/code>, and output format <code>json<\/code>. Prefer temporary credentials through AWS IAM Identity Center where available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aws sts get-caller-identity --profile codecommit<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For convenience throughout this tutorial:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export AWS_PROFILE=codecommit\nexport AWS_DEFAULT_REGION=ap-southeast-2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">SSH-based Git operations do not require AWS CLI credentials. The CLI configuration is for AWS administration and API commands.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Configure AWS IAM access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AWS IAM manages authentication and authorization for CodeCommit.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3.1 \u2014 Create an IAM user<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the <a href=\"https:\/\/console.aws.amazon.com\/iam\/?utm_source=chatgpt.com\">AWS IAM Console<\/a>.<\/li>\n\n\n\n<li>Navigate to Users \u2192 Create user.<\/li>\n\n\n\n<li>Enter a username such as <code>codecommit-developer<\/code>.<\/li>\n\n\n\n<li>Create the user and assign appropriate permissions.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">For this training exercise, you can attach the AWS-managed policy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AWSCodeCommitPowerUser<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This provides broad CodeCommit development permissions. For production, use a least-privilege policy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3.2 \u2014 Example IAM policy for one repository<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The following policy allows an IAM user to clone, fetch, pull and push to <code>demo1<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Replace <code>ACCOUNT_ID<\/code> with your 12-digit AWS account ID.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": &#91;\n    {\n      \"Sid\": \"CodeCommitGitAccess\",\n      \"Effect\": \"Allow\",\n      \"Action\": &#91;\n        \"codecommit:GitPull\",\n        \"codecommit:GitPush\"\n      ],\n      \"Resource\": \"arn:aws:codecommit:ap-southeast-2:ACCOUNT_ID:demo1\"\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>GitPull<\/code> is required for cloning and fetching; <code>GitPush<\/code> is required for pushing changes. Other console and API operations, including repository creation and pull-request management, require additional IAM permissions. AWS CodeCommit<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Create a CodeCommit repository<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Method 1 \u2014 AWS Console<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open the <a href=\"https:\/\/ap-southeast-2.console.aws.amazon.com\/codesuite\/codecommit\/repositories?region=ap-southeast-2&amp;utm_source=chatgpt.com\">AWS CodeCommit Console<\/a>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Select ap-southeast-2 (Sydney).<\/li>\n\n\n\n<li>Choose Create repository.<\/li>\n\n\n\n<li>Set Repository name to <code>demo1<\/code>.<\/li>\n\n\n\n<li>Optionally enter a description, such as <code>AWS CodeCommit training repository<\/code>.<\/li>\n\n\n\n<li>Click Create.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The repository will initially be empty.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Method 2 \u2014 AWS CLI<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If creating a new repository:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aws codecommit create-repository \\\n  --repository-name demo1 \\\n  --repository-description \"AWS CodeCommit Demo Repository\" \\\n  --region ap-southeast-2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your <code>demo1<\/code> already exists, so skip this creation command for your current environment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">List repositories:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aws codecommit list-repositories \\\n  --region ap-southeast-2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Get repository information:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aws codecommit get-repository \\\n  --repository-name demo1 \\\n  --region ap-southeast-2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">AWS returns repository metadata, including clone URLs and the default branch after initialization. AWS CodeCommit<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Generate an SSH key for CodeCommit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AWS CodeCommit IAM SSH authentication requires RSA-formatted public keys, not ED25519 keys. AWS Identity and Access Management<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5.1 \u2014 Generate a dedicated RSA key<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">On your Mac:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/.ssh\n\nssh-keygen -t rsa -b 4096 \\\n  -f ~\/.ssh\/id_rsa_codecommit \\\n  -C \"aws-codecommit\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Choose a strong passphrase when prompted for better security. If using your existing RSA key, do not run the generation command again or overwrite it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This creates:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>File<\/th><th>Purpose<\/th><\/tr><tr><td><code>~\/.ssh\/id_rsa_codecommit<\/code><\/td><td>Private SSH key; never share<\/td><\/tr><tr><td><code>~\/.ssh\/id_rsa_codecommit.pub<\/code><\/td><td>Public SSH key; upload to IAM<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5.2 \u2014 Display or copy your public key<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cat ~\/.ssh\/id_rsa_codecommit.pub<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On macOS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pbcopy &lt; ~\/.ssh\/id_rsa_codecommit.pub<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output should begin with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh-rsa AAAAB3NzaC1yc2E...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The entire public key must be pasted as one line.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5.3 \u2014 Upload the key to AWS IAM<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Navigate to:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">IAM \u2192 Users \u2192 Your IAM user \u2192 Security credentials \u2192 SSH keys for AWS CodeCommit \u2192 Upload SSH public key<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Paste the public key and upload it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">AWS generates an SSH Key ID resembling:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>APKAXXXXXXXXXXXXXXXX<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is the SSH username used for CodeCommit authentication. It is not your IAM username or your Mac login name.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure the uploaded key has Active status.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Configure SSH on your Mac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6.1 \u2014 Edit the SSH configuration<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>nano ~\/.ssh\/config<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add this configuration, replacing the placeholder with your real SSH Key ID:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Host git-codecommit.*.amazonaws.com\n    User APKAXXXXXXXXXXXXXXXX\n    IdentityFile ~\/.ssh\/id_rsa_codecommit\n    IdentitiesOnly yes<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Save the file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This configuration works for CodeCommit endpoints in multiple AWS Regions, provided the IAM identity and key are valid for the target AWS account.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6.2 \u2014 Set file permissions<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod 700 ~\/.ssh\nchmod 600 ~\/.ssh\/id_rsa_codecommit\nchmod 644 ~\/.ssh\/id_rsa_codecommit.pub\nchmod 600 ~\/.ssh\/config<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6.3 \u2014 Verify the selected SSH identity<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -G git-codecommit.ap-southeast-2.amazonaws.com \\\n  | grep -E '^(user|identityfile|identitiesonly) '<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check that <code>user<\/code> shows your <code>APKA...<\/code> key ID and that <code>identityfile<\/code> points to <code>id_rsa_codecommit<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6.4 \u2014 Test SSH authentication<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -T git-codecommit.ap-southeast-2.amazonaws.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A successful test returns a message similar to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>You have successfully authenticated over SSH.\nYou can use Git to interact with CodeCommit.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For troubleshooting:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -vT git-codecommit.ap-southeast-2.amazonaws.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The AWS documentation confirms this SSH setup and testing workflow. AWS CodeCommit<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Clone your CodeCommit repository<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Move into your desired workspace:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/aws\ncd ~\/aws<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Clone the repository:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone ssh:\/\/git-codecommit.ap-southeast-2.amazonaws.com\/v1\/repos\/demo1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For a brand-new empty repository, Git may warn that it is empty. This is normal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Enter the repository:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd demo1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check the remote:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote -v<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>origin  ssh:\/\/git-codecommit.ap-southeast-2.amazonaws.com\/v1\/repos\/demo1 (fetch)\norigin  ssh:\/\/git-codecommit.ap-southeast-2.amazonaws.com\/v1\/repos\/demo1 (push)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For your existing clone, you do not need to clone again.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Configure Git identity<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This controls the author information recorded in Git commits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Global configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git config --global user.name \"Rajesh Kumar\"\ngit config --global user.email \"devops@rajeshkumar.xyz\"\ngit config --global init.defaultBranch main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or set it for the current repository only:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git config user.name \"Rajesh Kumar\"\ngit config user.email \"devops@rajeshkumar.xyz\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git config --get user.name\ngit config --get user.email\ngit config --list<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The Git author email does not have to match the IAM user identity used for SSH.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Create files, commit and push<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">These are the core Git operations you already completed successfully.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9.1 \u2014 Create a file<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>touch demo.txt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or create it with some content:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"Hello AWS CodeCommit\" &gt; demo.txt<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9.2 \u2014 Check repository status<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>git status<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9.3 \u2014 Stage files<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Stage one file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git add demo.txt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Or stage all changed, added and deleted files:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git add --all<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9.4 \u2014 Commit changes<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>git commit -m \"First commit\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9.5 \u2014 Push to AWS<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For a first push:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push -u origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For subsequent pushes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your first push returned:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;new branch] main -&gt; main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That confirms that the remote <code>main<\/code> branch was created.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">How the Git workflow operates<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">10. Modify files and push additional commits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Edit the file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"Second change\" &gt;&gt; demo.txt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Review the changes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git diff\ngit status<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Stage, commit and push:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git add demo.txt\ngit commit -m \"Updated demo.txt\"\ngit push origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You can confirm the new commit in the CodeCommit console under Repositories \u2192 demo1 \u2192 Commits.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">11. Fetch and pull code from AWS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use these commands whenever the remote repository has newer changes, including changes pushed by teammates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fetch without modifying local files:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git fetch origin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Check incoming commits:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git log --oneline HEAD..origin\/main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Pull changes into your current <code>main<\/code> branch:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git switch main\ngit pull --ff-only origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>--ff-only<\/code> option avoids creating an unexpected merge commit. If Git reports divergent histories, inspect the differences and choose a deliberate merge or rebase strategy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">12. Create and manage branches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A branch lets you develop changes without immediately modifying the main branch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 12.1 \u2014 Create a feature branch<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>git switch main\ngit pull --ff-only origin main\ngit switch -c feature\/add-readme<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 12.2 \u2014 Create a file and commit<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"# AWS CodeCommit Demo\" &gt; README.md\n\ngit add README.md\ngit commit -m \"Add project README\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 12.3 \u2014 Push the branch<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>git push -u origin feature\/add-readme<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 12.4 \u2014 Display and switch branches<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch\ngit branch -a\ngit switch main\ngit switch feature\/add-readme<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 12.5 \u2014 Delete branches after merging<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Delete the local branch once it has been merged:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git branch -d feature\/add-readme<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Delete its remote branch:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push origin --delete feature\/add-readme<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">13. Create a pull request in CodeCommit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A pull request (PR) lets developers propose changes for review before merging them into <code>main<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Method 1 \u2014 AWS Console<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open CodeCommit \u2192 <code>demo1<\/code>.<\/li>\n\n\n\n<li>Select Pull requests.<\/li>\n\n\n\n<li>Choose Create pull request.<\/li>\n\n\n\n<li>Source branch: <code>feature\/add-readme<\/code>.<\/li>\n\n\n\n<li>Destination branch: <code>main<\/code>.<\/li>\n\n\n\n<li>Review the differences.<\/li>\n\n\n\n<li>Enter a title and description.<\/li>\n\n\n\n<li>Choose Create.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">After review and approval, select an appropriate merge strategy, such as fast-forward, squash or three-way merge.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Method 2 \u2014 AWS CLI<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>aws codecommit create-pull-request \\\n  --title \"Add README\" \\\n  --description \"Adding project documentation\" \\\n  --targets repositoryName=demo1,sourceReference=feature\/add-readme,destinationReference=main \\\n  --region ap-southeast-2<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output contains a pull request ID. Use that ID to review or merge the PR through the CLI if desired.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CodeCommit supports pull-request creation and merging using both the console and CLI. AWS CodeCommit+1<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">14. Merge and synchronize branches<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For team development, prefer merging through CodeCommit after the required reviews and approvals.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After the merge:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git switch main\ngit pull --ff-only origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For a repository without review restrictions, a local merge is also possible:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git switch main\ngit merge feature\/add-readme\ngit push origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">However, direct local merges and pushes can bypass pull-request approval requirements. Use IAM controls to restrict direct pushes to protected branches in team repositories. AWS CodeCommit<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">15. View commit history and manage versions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Display the recent commits:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git log --oneline -10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Display the branch graph:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git log --oneline --graph --decorate --all<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inspect one commit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git show b067930<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Show files changed in the last commit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git diff-tree --no-commit-id --name-only -r HEAD<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Compare commits:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git diff 63b86f6 b067930<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your two supplied commits were:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Commit ID<\/th><th>Message<\/th><\/tr><tr><td><code>63b86f6<\/code><\/td><td>First commit<\/td><\/tr><tr><td><code>b067930<\/code><\/td><td>adding bs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Create a version tag<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>git tag -a v1.0.0 -m \"First release\"\ngit push origin v1.0.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">List tags:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git tag -l<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Revert a commit safely<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If a commit has already been pushed and you want to undo it without rewriting shared history:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git revert COMMIT_ID\ngit push origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This creates a new commit that reverses the selected changes. Use a real commit ID after reviewing what the revert will affect.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">16. Add a <code>.gitignore<\/code> file<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <code>.gitignore<\/code> file prevents unwanted local files from being included in future Git commits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat &gt; .gitignore &lt;&lt;'EOF'\n.DS_Store\n.env\n.env.*\n!.env.example\nnode_modules\/\nvendor\/\n.idea\/\n.vscode\/\n*.log\nEOF<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Commit it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git add .gitignore\ngit commit -m \"Add gitignore\"\ngit push origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Do not commit passwords, access keys, SSH private keys or other secrets. <code>.gitignore<\/code> does not remove files that Git is already tracking.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">17. Integrate AWS CodeBuild<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You already added:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>buildspec.yaml<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">One important point: AWS CodeBuild expects <code>buildspec.yml<\/code> by default, not <code>buildspec.yaml<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can either rename the file or configure CodeBuild explicitly to use your existing filename. AWS CodeBuild<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 17.1 \u2014 Rename your existing buildspec<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">From your <code>demo1<\/code> directory:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git mv buildspec.yaml buildspec.yml\n\ngit add --all\ngit commit -m \"Use default CodeBuild buildspec filename\"\ngit push origin main<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This preserves your existing 21-line build specification.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 17.2 \u2014 Understand a basic buildspec<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For a separate simple demonstration, this is a working example of a <code>buildspec.yml<\/code> file. Do not overwrite your existing buildspec unless you intend to replace its commands.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: 0.2\n\nphases:\n  install:\n    commands:\n      - echo \"Install phase started\"\n\n  pre_build:\n    commands:\n      - echo \"Pre-build checks started\"\n      - test -f demo.txt\n\n  build:\n    commands:\n      - echo \"Building the application\"\n      - cat demo.txt\n\n  post_build:\n    commands:\n      - echo \"Build completed successfully\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The stages execute as follows:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Phase<\/th><th>Purpose<\/th><\/tr><tr><td><code>install<\/code><\/td><td>Install dependencies and tools<\/td><\/tr><tr><td><code>pre_build<\/code><\/td><td>Run checks and preparation<\/td><\/tr><tr><td><code>build<\/code><\/td><td>Compile, test or package the application<\/td><\/tr><tr><td><code>post_build<\/code><\/td><td>Perform final processing<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 17.3 \u2014 Create a CodeBuild project<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open the <a href=\"https:\/\/console.aws.amazon.com\/codesuite\/codebuild\/home?utm_source=chatgpt.com\">AWS CodeBuild Console<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose Create build project and configure:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Setting<\/th><th>Value<\/th><\/tr><tr><td>Project name<\/td><td><code>demo1-build<\/code><\/td><\/tr><tr><td>Source provider<\/td><td>AWS CodeCommit<\/td><\/tr><tr><td>Repository<\/td><td><code>demo1<\/code><\/td><\/tr><tr><td>Source branch<\/td><td><code>main<\/code><\/td><\/tr><tr><td>Environment<\/td><td>Managed Linux<\/td><\/tr><tr><td>Runtime image<\/td><td>Current supported standard image<\/td><\/tr><tr><td>Compute<\/td><td>Small suitable compute option<\/td><\/tr><tr><td>Service role<\/td><td>New least-privilege CodeBuild role<\/td><\/tr><tr><td>Buildspec<\/td><td><code>buildspec.yml<\/code><\/td><\/tr><tr><td>Logs<\/td><td>CloudWatch Logs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Create the project and select Start build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once a build starts, CodeBuild retrieves the source, processes your buildspec and shows command execution logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you keep the filename <code>buildspec.yaml<\/code>, set that exact path under Buildspec name instead. AWS CodeBuild+1<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">18. Connect CodeCommit with CodePipeline<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">AWS CodePipeline can orchestrate the steps from source changes through builds and deployments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CodeCommitSource<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CodeBuildBuild &amp; Test<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DeployOptional<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a basic pipeline:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open AWS CodePipeline \u2192 Create pipeline.<\/li>\n\n\n\n<li>Enter a pipeline name, such as <code>demo1-pipeline<\/code>.<\/li>\n\n\n\n<li>Configure the source provider as AWS CodeCommit.<\/li>\n\n\n\n<li>Select <code>demo1<\/code> and branch <code>main<\/code>.<\/li>\n\n\n\n<li>Configure a source change trigger, where available, so new commits start a pipeline.<\/li>\n\n\n\n<li>Configure the build stage to use your <code>demo1-build<\/code> project.<\/li>\n\n\n\n<li>Add an optional deployment stage, such as ECS, EC2 or another supported target.<\/li>\n\n\n\n<li>Configure the required service role permissions and create the pipeline.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Once configured correctly, a push to <code>main<\/code> can initiate an automated build and deployment workflow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">19. Troubleshooting common AWS CodeCommit errors<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Error<\/th><th>Likely cause<\/th><th>Solution<\/th><\/tr><tr><td><code>Unrecognized public key encoding<\/code><\/td><td>Unsupported key type or invalid formatting<\/td><td>Generate RSA 2048\/4096 and upload its <code>.pub<\/code> contents<\/td><\/tr><tr><td><code>Permission denied (publickey)<\/code><\/td><td>Wrong SSH Key ID, wrong private key or inactive IAM SSH credential<\/td><td>Check <code>~\/.ssh\/config<\/code>, IAM key status and SSH debug output<\/td><\/tr><tr><td><code>Repository does not exist<\/code><\/td><td>Wrong name, AWS account or Region<\/td><td>Check repository name, Region and AWS account<\/td><\/tr><tr><td><code>Access denied<\/code><\/td><td>Missing IAM permission<\/td><td>Review <code>GitPull<\/code>, <code>GitPush<\/code> or required API permissions<\/td><\/tr><tr><td><code>non-fast-forward<\/code><\/td><td>Remote contains commits absent locally<\/td><td>Fetch\/pull and integrate changes before pushing<\/td><\/tr><tr><td><code>nothing to commit<\/code><\/td><td>No staged changes to record<\/td><td>Check <code>git status<\/code><\/td><\/tr><tr><td><code>buildspec not found<\/code><\/td><td>Wrong buildspec filename or location<\/td><td>Use <code>buildspec.yml<\/code> or configure the alternate path<\/td><\/tr><tr><td><code>fatal: not a git repository<\/code><\/td><td>Working outside a Git repository<\/td><td>Run <code>cd demo1<\/code> or locate the repository root<\/td><\/tr><tr><td><code>command not found: ks<\/code><\/td><td><code>ks<\/code> is not a standard shell command<\/td><td>Use <code>ls<\/code> to list files<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For SSH failures, this is the most useful diagnostic:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -vT git-codecommit.ap-southeast-2.amazonaws.com<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Look for the SSH username, offered public key and authentication result. AWS documents several causes of public-key authentication failures. AWS CodeCommit<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">20. Master Git command cheat sheet<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Operation<\/th><th>Command<\/th><\/tr><tr><td>Clone<\/td><td><code>git clone &lt;SSH-URL&gt;<\/code><\/td><\/tr><tr><td>Check status<\/td><td><code>git status<\/code><\/td><\/tr><tr><td>Add one file<\/td><td><code>git add filename<\/code><\/td><\/tr><tr><td>Add all<\/td><td><code>git add --all<\/code><\/td><\/tr><tr><td>Commit<\/td><td><code>git commit -m \"message\"<\/code><\/td><\/tr><tr><td>Push<\/td><td><code>git push origin main<\/code><\/td><\/tr><tr><td>Pull<\/td><td><code>git pull --ff-only origin main<\/code><\/td><\/tr><tr><td>Fetch<\/td><td><code>git fetch origin<\/code><\/td><\/tr><tr><td>Show commits<\/td><td><code>git log --oneline<\/code><\/td><\/tr><tr><td>Show branches<\/td><td><code>git branch -a<\/code><\/td><\/tr><tr><td>Create branch<\/td><td><code>git switch -c feature\/test<\/code><\/td><\/tr><tr><td>Switch branch<\/td><td><code>git switch main<\/code><\/td><\/tr><tr><td>Push a branch<\/td><td><code>git push -u origin feature\/test<\/code><\/td><\/tr><tr><td>Merge branch<\/td><td><code>git merge feature\/test<\/code><\/td><\/tr><tr><td>Delete local branch<\/td><td><code>git branch -d feature\/test<\/code><\/td><\/tr><tr><td>View remote<\/td><td><code>git remote -v<\/code><\/td><\/tr><tr><td>View differences<\/td><td><code>git diff<\/code><\/td><\/tr><tr><td>Show last commit<\/td><td><code>git show HEAD<\/code><\/td><\/tr><tr><td>Create tag<\/td><td><code>git tag -a v1.0.0 -m \"Release\"<\/code><\/td><\/tr><tr><td>Push tags<\/td><td><code>git push origin --tags<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">21. Recommended repository structure<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For a small application integrated with CodeBuild, a useful structure is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>demo1\/\n\u251c\u2500\u2500 .gitignore\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 buildspec.yml\n\u251c\u2500\u2500 demo.txt\n\u251c\u2500\u2500 src\/\n\u2502   \u2514\u2500\u2500 application-code\n\u251c\u2500\u2500 tests\/\n\u2502   \u2514\u2500\u2500 application-tests\n\u251c\u2500\u2500 scripts\/\n\u2502   \u2514\u2500\u2500 build.sh\n\u2514\u2500\u2500 docs\/\n    \u2514\u2500\u2500 setup.md<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For team development, a simple branch strategy is to use <code>main<\/code> for reviewed stable code, <code>feature\/*<\/code> for new work, <code>bugfix\/*<\/code> for fixes and <code>release\/*<\/code> when you need a release preparation branch.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">22. Complete daily workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Once your SSH connection and repository are configured, most daily development comes down to these commands:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. Enter repository\ncd ~\/aws\/demo1\n\n# 2. Switch to main and get the latest code\ngit switch main\ngit pull --ff-only origin main\n\n# 3. Create a feature branch\ngit switch -c feature\/new-change\n\n# 4. Make a change\necho \"New change\" &gt;&gt; demo.txt\n\n# 5. Review changes\ngit status\ngit diff\n\n# 6. Stage and commit\ngit add --all\ngit commit -m \"Update demo file\"\n\n# 7. Push feature branch\ngit push -u origin feature\/new-change<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then create a pull request in CodeCommit, review and merge it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After merging:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git switch main\ngit pull --ff-only origin main\n\n# Delete local feature branch\ngit branch -d feature\/new-change<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Your workflow is now:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create repository \u2192 Configure IAM\/SSH \u2192 Clone \u2192 Edit \u2192 Stage \u2192 Commit \u2192 Push \u2192 Pull request \u2192 Merge \u2192 Build \u2192 Deploy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That covers the full source-control lifecycle you can practice with your existing AWS CodeCommit <code>demo1<\/code> repository.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beginner to Advanced | macOS, Linux, Git, SSH, IAM, CodeBuild This master tutorial covers the complete AWS CodeCommit workflow, from creating your first repository to managing source&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1280","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/comments?post=1280"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1280\/revisions"}],"predecessor-version":[{"id":1281,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/1280\/revisions\/1281"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=1280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=1280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=1280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}