<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: castnutt</title>
    <description>The latest articles on DEV Community by castnutt (@castnutt).</description>
    <link>https://dev.to/castnutt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3246819%2F9e60544f-536e-4495-a1f1-b6954a8bd918.png</url>
      <title>DEV Community: castnutt</title>
      <link>https://dev.to/castnutt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/castnutt"/>
    <language>en</language>
    <item>
      <title>BigQuery: query and table optimization to save some money</title>
      <dc:creator>castnutt</dc:creator>
      <pubDate>Mon, 17 Nov 2025 09:57:04 +0000</pubDate>
      <link>https://dev.to/castnutt/bigquery-query-and-table-optimization-to-save-some-money-5cb</link>
      <guid>https://dev.to/castnutt/bigquery-query-and-table-optimization-to-save-some-money-5cb</guid>
      <description>&lt;h2&gt;
  
  
  What is BigQuery?
&lt;/h2&gt;

&lt;p&gt;BigQuery belongs to the Google Cloud Platform suite and it is one of the most used platforms for data warehousing in the data world. You can host tables and query them to transform data and provide useful insights.&lt;/p&gt;

&lt;p&gt;The way users are charged is based on the bytes processed by each query. The cost will depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The number of columns scanned in each row&lt;/li&gt;
&lt;li&gt;The total amount of data read, not the number of rows returned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To help understand this post, let's assume we have a table with a list of orders with the following columns:customer_id, product_id, store_id, product_value, product_name, purchase_date&lt;/p&gt;

&lt;p&gt;For a query like the one below, we are retrieving all columns from all rows. This translates to scanning the entire table, which may be expensive depending on its size:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
  *
FROM orders
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One way to reduce the cost of the above query is to select just the fields that are required. For example, if we want to know which products were bought by which customers and on which date, we are only interested in &lt;code&gt;customer_id&lt;/code&gt;, &lt;code&gt;product_id&lt;/code&gt;, and &lt;code&gt;purchase_date&lt;/code&gt;. There's no need to load fields like &lt;code&gt;store_id&lt;/code&gt; or &lt;code&gt;product_value&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
  customer_id,
  product_id,
  purchase_date
FROM orders 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is how we can optimize queries during development. However, there are two other ways to optimize costs at the table design level, by preparing the table for more efficient querying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partitioning
&lt;/h2&gt;

&lt;p&gt;Partitioning breaks the table into logical segments based on a date or timestamp column. For example, if we select daily partitioning, the table is split into partitions for each day.&lt;/p&gt;

&lt;p&gt;Using the orders table example, imagine we want to retrieve product purchases made during 2024. The query below will only scan the partitions that fall within that date range, in this case 365 partitions (one per day). This helps reduce the amount of data processed by skipping older data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
  customer_id,
  product_id,
  purchase_date
FROM orders
WHERE DATE(partition_field) BETWEEN '2024-01-01' AND '2024-12-31' 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: To take advantage of partition pruning, make sure you filter directly on the partition field without wrapping it in functions like DATE() unless the field itself is a timestamp. If the field is already a DATE type, use it as-is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clustering
&lt;/h2&gt;

&lt;p&gt;Clustering breaks the data further within each partition by organizing it based on the values of selected fields. These are usually the fields most frequently used in WHERE clauses.&lt;/p&gt;

&lt;p&gt;When a table is partitioned, clustering happens within each partition. This helps BigQuery scan only the blocks relevant to your query.&lt;/p&gt;

&lt;p&gt;In our example, if the table is clustered by &lt;code&gt;store_id&lt;/code&gt;, and we want to retrieve products purchased by customers in a specific store, we can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT 
  customer_id,
  product_id,
  purchase_date
FROM orders
WHERE DATE(partition_field) BETWEEN '2024-01-01' AND '2024-12-31'
  AND store_id = 'store_xyz' 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks to partitioning and clustering, this query will skip over irrelevant partitions and blocks, scanning much less data.&lt;/p&gt;

&lt;p&gt;See below an image of how a table would look without any partitioning or clustering, and how it looks after adding these optimizations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fso7awr8a2q7q3qzedqt1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fso7awr8a2q7q3qzedqt1.png" alt="Sourced from https://cloud.google.com/bigquery/docs/clustered-tables" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you aware of any other optimizations? Share them in the comments&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>bigquery</category>
      <category>partitioning</category>
      <category>clustering</category>
    </item>
    <item>
      <title>Git basics - cheatsheet</title>
      <dc:creator>castnutt</dc:creator>
      <pubDate>Fri, 06 Jun 2025 15:12:28 +0000</pubDate>
      <link>https://dev.to/castnutt/git-basics-cheatsheet-nfo</link>
      <guid>https://dev.to/castnutt/git-basics-cheatsheet-nfo</guid>
      <description>&lt;h2&gt;
  
  
  Git general knowledge
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Git is a distributed version control system  that tracks changes in source code. It helps enabling collaboration and history management for projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The name "origin" is a shorthand name for the remote repository that a project was originally cloned from. It is a standard convention used instead of that original repository's URL, making referencing much easier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;code&gt;.gitignore&lt;/code&gt; file is used to exclude files in the repository. These files wont be part of a commit. Used with personal, configuration or library files.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It is best practises to use branches for your own development and merge later instead of committing directly to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Default branch for a repository is called main. Before it was called master, but that has now been deprecated (can be found in old repositories)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Useful sequences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Standard dev sequence
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Checkout the main branch and pull any updates so that your local copy of the repository is up to date.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git checkout main
  git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new branch and start development&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git checkout -b new_dev_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add any modified or new files into a stage so that they can be committed.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git add new_files
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Commit files and push to the remote repository&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  git commit -m 'commit message' 
  git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Merge with/without conflicts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Rebase your branch to main - download any updates from main so that your branch is up to date
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git fetch origin/main
git merge origin/main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If no conflicts, then push the changes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If conflicts are found, then resolve the conflicts and push the changes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add any_files
git commit -m 'updating my branch'
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Top used git commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  git config
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Set username and email for global config
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name "username"
git config --global user.email "email"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Set username and email for local config
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --local user.name "username"
git config --local user.email "email"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git pull
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Get the latest version of the repository for the current active branch
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get the latest version of the repository for a specific branch (main in this case)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git pull origin main 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git checkout
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a branch for work
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout -b work_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Change to a different branch (main for the default repository branch)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Get just a single file from another branch (if origin/main used, then it will reset the file status to the repository's main branch)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout origin/master -- filename
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git branch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Delete branch locally
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -d work_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Delete branch remotely
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin --delete work_branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Rename branch from main
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -m old_name new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Rename branch from the same branch
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -m new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Rename the local branch to the new name
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch -m $old_name $new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Delete the old branch on remote
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push $remote --delete $old_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Prevent git from using the old name when pushing in the next step
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch --unset-upstream $new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Push the new branch to remote
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push $remote $new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Reset the upstream branch for the new_name local branch
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push $remote -u $new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git status
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;See the status of the repository. Which branch you are in, what files have been modified and what files have been created ad new.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git add
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stage all changes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add . --all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git diff
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Differences between commits
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git diff --name-only commit_hash commit_hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;See changes between branches (diff)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git diff master...branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Export the differences between two branches into an external file.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git diff branch1..branch2 -- file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git reset
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Discard local changes as only indexed files
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reset –hard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Discard all the file
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clean -fxd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Reset branch to the same status as origin
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git fetch origin
git reset --hard origin/main 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git commit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Commit changes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m 'message'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git log
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Commit history/log
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Summarized log to one line
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log --oneline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;List the modified file names in each commit
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log --name-only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Compact summary with commit message plus filenames with a note whether they are gone
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log --compact-summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git revert
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Find a previous commit and revert to it
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log --oneline
git revert to_commit_hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git push
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Push changes to repo
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin 'work_branch'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Push a new branch to remote
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push --set-upstream origin new-branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git stash
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Save current changes into a dirty directory (push) and then retrieve them later (pop)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash push/pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Stash work with a message
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash save 'message'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Retrieve a specific stash
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash pop --index n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;List of all stashes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Delete specific stash
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash drop index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Delete all stashes
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git stash clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  git merge
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Git merge while resolving conflicts (our changes or their changes)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git merge branch --strategy-option ours/theirs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Abort a merge command
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git merge --abort
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;As always, if you think anything is missing, wrong or can be improved, add your comments.&lt;/p&gt;

</description>
      <category>git</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Google Cloud Associate Cloud Engineer - My Experience</title>
      <dc:creator>castnutt</dc:creator>
      <pubDate>Thu, 05 Jun 2025 16:04:59 +0000</pubDate>
      <link>https://dev.to/castnutt/google-cloud-associate-cloud-engineer-my-experience-5hmh</link>
      <guid>https://dev.to/castnutt/google-cloud-associate-cloud-engineer-my-experience-5hmh</guid>
      <description>&lt;p&gt;In February 2025, I took the Google Cloud Associate Cloud Engineer certification exam, and it turned out to be quite a journey. I'd like to share my experience, including what worked, what didn't, and a few tips I wish I had from the start.&lt;/p&gt;

&lt;p&gt;I decided to pursue the certification in November 2024. While the Associate Cloud Engineer exam isn't the most technical or specialized, I found it to be a great entry point into the Google Cloud ecosystem. It didn't disappoint. It provided a solid foundation and broad overview of GCP services.&lt;/p&gt;

&lt;p&gt;I enrolled in Google's Get Certified program and completed it in 10 weeks. The program includes hands-on labs and instructor-led sessions, which helped reinforce concepts and answer questions. Some of the test-style examples they walked through were particularly useful.&lt;/p&gt;

&lt;p&gt;That said, I still faced several challenges along the way.&lt;/p&gt;

&lt;p&gt;From the beginning, I found the scope of the exam difficult to pin down. Google offers a study guide, but it felt overly broad, and the services it referenced were scattered across multiple sections. What really helped was building a clear, structured understanding of the platform and its major components.&lt;/p&gt;

&lt;p&gt;The official documentation is comprehensive, but that's part of the problem. It's so detailed and dense that it quickly becomes overwhelming. And while the labs are great for hands-on practice, they don't always align with what's needed to actually pass the exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  The three resources that made the biggest difference for me:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dan Sullivan's book: it might be a bit outdated, but it was still the key for building a structured approach and getting a solid conceptual overview of the platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aldovelio Castremonte's practice questions: these were incredibly helpful for getting used to the exam format and spotting gaps in my understanding. Whenever I came across a question I couldn't confidently answer, I'd dig into the topic, add it to my notes, and make sure I fully understood it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My own summarized notes: after working through books, videos, practice exams, and asking ChatGPT a hundred questions, I created a condensed set of notes focused on what truly matters for the exam. This became my go-to resource for review. You can check it out &lt;a href="https://gitlab.com/castnutt/pyc-gcp-associate-cloud-engineer" rel="noopener noreferrer"&gt;here&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If there is anything missing or that can be improved, please add your comments&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>certification</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
