<?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>Forem: Sinan Mujan</title>
    <description>The latest articles on Forem by Sinan Mujan (@sinanmujan).</description>
    <link>https://forem.com/sinanmujan</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%2F266793%2F7a8d19ec-300e-4570-8ef0-da3f75b9e952.jpg</url>
      <title>Forem: Sinan Mujan</title>
      <link>https://forem.com/sinanmujan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sinanmujan"/>
    <language>en</language>
    <item>
      <title>Install Ruby 3.2.0 with YJIT</title>
      <dc:creator>Sinan Mujan</dc:creator>
      <pubDate>Mon, 09 Jan 2023 13:08:40 +0000</pubDate>
      <link>https://forem.com/wizardhealth/install-ruby-320-with-yjit-3mmo</link>
      <guid>https://forem.com/wizardhealth/install-ruby-320-with-yjit-3mmo</guid>
      <description>&lt;p&gt;Ruby 3.2.0 is here and it offers &lt;a href="https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/"&gt;some nice additions&lt;/a&gt; to the language.&lt;br&gt;
One of the most exciting new things is the addition of a compiler, YJIT. &lt;a href="https://github.com/Shopify/yjit"&gt;YJIT&lt;/a&gt; was created by the folks from Shopify and has been producion tested for a while, so it is safe to use in your environment.&lt;br&gt;
Some benchmarks show the difference in speed compared to Ruby without YJIT. I'll put some links if you want to know more:&lt;br&gt;
&lt;a href="https://speed.yjit.org/"&gt;https://speed.yjit.org/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.solnic.dev/p/benchmarking-ruby-32-with-yjit"&gt;https://www.solnic.dev/p/benchmarking-ruby-32-with-yjit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I will show you the steps necessary to install Ruby using rbenv as it is the most popular Ruby version manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Rust
&lt;/h2&gt;

&lt;p&gt;To install Ruby 3.2.0 with YJIT, the first step is to install Rust. Rust is necessary if we want to add YJIT to our Ruby installation.&lt;br&gt;
The easiest way to install Rust is using Rustup, which is also the recommended way:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You'll be asked which type of installation you want, you can use the default.&lt;br&gt;
If you want alternative installation methods you can follow &lt;a href="https://forge.rust-lang.org/infra/other-installation-methods.html"&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After that, update your $PATH variable. You can do this in many ways, I will show you how to do it by updating your bashrc or zshrc (depending which shell you use).&lt;/p&gt;

&lt;p&gt;Just open ~/.bashrc or ~/.zshrc using your preferred editor and at the end of the file just add the following:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export PATH="$HOME/.cargo/bin:$PATH"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will add the rust bin folder to your path, so you can check if rust was installed correctly easier. After that you have to source your file:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;source ~/.bashrc&lt;br&gt;
or&lt;br&gt;
source ~/.zshrc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then you can check if the Rust installation was successful:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rustc --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You should get an output like this that shows the version of Rust:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rustc 1.66.0 (69f9c33d7 2022-12-12).&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade Ruby build
&lt;/h2&gt;

&lt;p&gt;Before you install Ruby 3.2.0 using rbenv, first you should update your ruby-build tool.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew update &amp;amp;&amp;amp; brew upgrade ruby-build&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command could take some time, just so you know. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Ruby
&lt;/h2&gt;

&lt;p&gt;You are now ready to install Ruby 3.2.0 with YJIT.&lt;br&gt;
Enter the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RUBY_CONFIGURE_OPTS="--enable-yjit" rbenv install 3.2.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You notice the RUBY_CONFIGURE_OPTS variable where you explicitly say that you want to enable YJIT. You can also add the --with-jemalloc flag as well to install jemalloc, the general purpose malloc implementation that performs better at memory usage than the standard malloc.&lt;br&gt;
Many benchmarks showed how much better your applications perform using jemalloc, I can also confirm that from my personal experience.&lt;br&gt;
Here are a few links that show the performance gain from using jemalloc:&lt;br&gt;
&lt;a href="https://engineering.binti.com/jemalloc-with-ruby-and-docker/"&gt;https://engineering.binti.com/jemalloc-with-ruby-and-docker/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://engineering.appfolio.com/appfolio-engineering/2018/2/1/benchmarking-rubys-heap-malloc-tcmalloc-jemalloc"&gt;https://engineering.appfolio.com/appfolio-engineering/2018/2/1/benchmarking-rubys-heap-malloc-tcmalloc-jemalloc&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/motive-eng/we-solved-our-rails-memory-leaks-with-jemalloc-5c3711326456"&gt;https://medium.com/motive-eng/we-solved-our-rails-memory-leaks-with-jemalloc-5c3711326456&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can set the new Ruby version for your local project or even on your entire environment using the local/global flags:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rbenv local 3.2.0&lt;br&gt;
rbenv global 3.2.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Don't forget to run the rehash command for rbenv:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rbenv rehash&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The last step is to ensure that everything went right. Check your ruby version this way:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ruby -v --yjit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With the --yjit option, we should get the following output:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ruby 3.2.0 (2022-12-25 revision a528908271) +YJIT [x86_64-darwin21]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The +YJIT shows that YJIT has been enabled in your Ruby 3.2.0 installation.&lt;/p&gt;

&lt;p&gt;Nice work!&lt;/p&gt;

&lt;p&gt;I hope this little tutorial will help you. :)&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>yjit</category>
    </item>
    <item>
      <title>Meza: Extract text from file</title>
      <dc:creator>Sinan Mujan</dc:creator>
      <pubDate>Thu, 16 Jan 2020 13:52:20 +0000</pubDate>
      <link>https://forem.com/wizardhealth/meza-extract-text-from-file-5h9b</link>
      <guid>https://forem.com/wizardhealth/meza-extract-text-from-file-5h9b</guid>
      <description>&lt;p&gt;If you ever have a situation where you have a huge file and want to extract a certain portion from this file (e.g. a log file or database dump), you can use the &lt;strong&gt;sed&lt;/strong&gt; command.&lt;/p&gt;

&lt;p&gt;Sed is a &lt;em&gt;stream editor&lt;/em&gt; that is used to perform basic text transformations on a file or input stream.&lt;/p&gt;

&lt;p&gt;👇&lt;/p&gt;

&lt;p&gt;Extract between two patterns (or words):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="s1"&gt;'/beginning_pattern/,/end_pattern/p'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Extract from a pattern (word) to the end of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="s1"&gt;'/beginning_pattern/,$p'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For more information about sed, check out this &lt;a href="https://www.gnu.org/software/sed/manual/sed.html"&gt;link&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>productivity</category>
      <category>commandline</category>
    </item>
    <item>
      <title>Useful Heroku CLI commands</title>
      <dc:creator>Sinan Mujan</dc:creator>
      <pubDate>Tue, 19 Nov 2019 08:48:36 +0000</pubDate>
      <link>https://forem.com/wizardhealth/useful-heroku-cli-commands-2h03</link>
      <guid>https://forem.com/wizardhealth/useful-heroku-cli-commands-2h03</guid>
      <description>&lt;p&gt;Many of us use Heroku on a daily bases but are not aware of some interesting and useful CLI commands that may help you in your everyday work. Here we will take a look at some useful Heroku CLI commands.&lt;/p&gt;

&lt;h1&gt;
  
  
  heroku apps:info
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        app to run command against
  -j, --json
  -r, --remote=remote  git remote of app to use
  -s, --shell          output more shell friendly key/value pairs&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;If you want to check some basic information about your app that is running on Heroku, you can do so from your CLI. The command and output look something like this:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku apps:info -a name-of-your-app&lt;/b&gt;

&lt;i&gt;=== name-of-your-app
Addons:         heroku-postgresql:standard-0
                heroku-redis:premium-0
                timber-logging:free
Auto Cert Mgmt: false
Dynos:          web: 2, worker: 1
Git URL:        https://git.heroku.com/name-of-your-app.git
Owner:          owner@heroku.com
Region:         eu
Repo Size:      234 MB
Slug Size:      234 MB
Stack:          heroku-18
Web URL:        https://name-of-your-app.herokuapp.com/&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku buildpacks:search [term]
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;ARGUMENTS&lt;/b&gt;
  &lt;i&gt;TERM  search term that searches across name, namespace, and description&lt;/i&gt;

&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;--description=description  buildpack description to filter on

  --name=name                buildpack names to filter on using a comma
                             separated list

  --namespace=namespace      buildpack namespaces to filter on using a comma
                             separated list&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;You probably know that you can add or remove buildpacks but one useful command is the buildpack search command. Let's say you want to search for the &lt;strong&gt;elastic&lt;/strong&gt; buildpack, you can find it easily:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku buildpacks:search elastic&lt;/b&gt;

&lt;i&gt;Buildpack                                   Category  Description
──────────────────────────────────────────  ────────  ───────────────────────────────────
doctolib/heroku-buildpack-ci-elasticsearch  tools     Installs an in-dyno ElasticSearch …

1 buildpack found&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;Then you can eventually add the buildpack you just found and see that it is added to the bottom of your buildpacks list. One thing to notice is that this newly added buildpack will be applied to your app the next time you deploy, not instantly:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku buildpacks:add doctolib/heroku-buildpack-ci-elasticsearch -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Buildpack added. Next release on your-app-name will use:
  1. heroku/nodejs
  2. https://github.com/mojodna/heroku-buildpack-jemalloc
  3. heroku/ruby
  4. doctolib/heroku-buildpack-ci-elasticsearch&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku ci
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app            app name
  -p, --pipeline=pipeline  name of pipeline
  --json                   output in json format
  --watch                  keep running and watch for new and update tests&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;If you want to check the latest test runs for a given app or pipeline, you can do so with this command:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ci -a name-of-your-app&lt;/b&gt;

&lt;i&gt;=== Showing latest test runs for the lab pipeline
✓  2961  last_commit                fbe70c8  succeeded
✓  2960  second_commit              4615132  succeeded
✗  2959  first_commit               a3563a9  failed&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku:ci debug
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app            app to run command against
  -p, --pipeline=pipeline  pipeline
  -r, --remote=remote      git remote of app to use
  --no-cache               start test run with an empty cache
  --no-setup               start test dyno without running test-setup&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;One problem that some of you might have seen is tests that pass locally but fail on your Heroku CI. This command opens a new debug test run. This enables you to inspect the Heroku CI environment and the execution of tests inside a test dyno. It will first start the test setup script (if one is present) and then open a new terminal window from inside the new debug dyno, so you can run your tests from inside the CI.&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ci:debug -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Preparing source... done
Creating test run... done
Running setup and attaching to test dyno...
...
~ $&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku config:edit [key]
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;ARGUMENTS&lt;/b&gt;
  &lt;i&gt;KEY  edit a single key&lt;/i&gt;

&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against
  -r, --remote=remote  git remote of app to use&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;If you want to quickly edit a config variable that you have in your app, this is a great way. It opens the default text editor set by $VISUAL or $EDITOR. After editing and saving your file, you will be asked to confirm your edit by typing "yes" at the prompt.&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku config:edit APP_DISTRIBUTOR -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Fetching config... done

Config Diff:
APP_DISTRIBUTOR=test
APP_DISTRIBUTOR=test-new

Update config on ⬢ name-of-your-app with these values?:
Update config on ⬢ name-of-your-app with these values?: yes
Updating config... done&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku ps:scale
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against
  -r, --remote=remote  git remote of app to use&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;To resize your dynos you can use the ps:scale option. If you enter the command without any options you will see the current dyno formation:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ps:scale -a name-of-your-app&lt;/b&gt;

&lt;i&gt;console=0:Standard-1X rake=0:Standard-1X release=0:Standard-1X web=2:Standard-1X worker=1:Standard-1X&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;Let's say you want to scale your worker count up, you can do this in 2 ways:&lt;/p&gt;

&lt;p&gt;1.&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ps:scale worker=2:Standard-1X -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Scaling dynos... done, now running worker at 2:Standard-1X&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;2.&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ps:scale worker+1 -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Scaling dynos... done, now running worker at 2:Standard-1X&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;The same goes for scaling down, you can type the exact dyno formation you want or you can decrease it with the dash ( - ) sign.&lt;/p&gt;

&lt;h1&gt;
  
  
  heroku logs
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against

  -d, --dyno=dyno      only show output from this dyno type (such as "web" or
                       "worker")

  -n, --num=num        number of lines to display

  -r, --remote=remote  git remote of app to use

  -s, --source=source  only show output from this source (such as "app" or
                       "heroku")

  -t, --tail           continually stream logs

  --force-colors       force use of colors (even on non-tty output)&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;To check your application logs you can use the logs command. You can filter by dyno type, edit the number of lines you want to see, continually stream logs etc.&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku logs -n=4 -a name-of-your-app&lt;/b&gt;

&lt;i&gt;2019-11-04T13:34:02.024374+00:00 heroku[web.1]: Restarting
2019-11-04T13:34:02.097510+00:00 heroku[web.1]: State changed from up to starting
2019-11-04T13:34:02.191176+00:00 heroku[worker.1]: Restarting
2019-11-04T13:34:02.264730+00:00 heroku[worker.1]: State changed from up to starting&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku pg:backups:capture [database]
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app                  (required) app to run command against
  -r, --remote=remote            git remote of app to use
  -v, --verbose
  --wait-interval=wait-interval&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;To create a new database backup file, you can use this command. You have to enter the name of your database config variable (in this example it is HEROKU_POSTGRESQL_ORANGE_URL). You can find out the correct name for your database by checking the &lt;b&gt;&lt;i&gt;heroku config&lt;/i&gt;&lt;/b&gt; command. Then just enter the command like this:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:backups:create HEROKU_POSTGRESQL_ORANGE_URL -a name-of-your-app&lt;/b&gt;

 &lt;i&gt;▸    Continuous protection is already enabled for this database. Logical backups of large databases are likely to fail.
 ▸    See https://devcenter.heroku.com/articles/heroku-postgres-data-safety-and-continuous-protection#physical-backups-on-heroku-postgres.
Starting backup of add-on-name... done

Use Ctrl-C at any time to stop monitoring progress; the backup will continue running.
Use heroku pg:backups:info to check progress.
Stop a running backup with heroku pg:backups:cancel.

Backing up ORANGE to b002... done&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;To download you newly created backup, first check the backup_id:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:backups -a name-of-your-app&lt;/b&gt;

&lt;i&gt;=== Backups
ID    Created at                 Status                               Size      Database
────  ─────────────────────────  ───────────────────────────────────  ────────  ────────
b002  2019-11-04 13:56:58 +0000  Completed 2019-11-04 14:02:24 +0000  397.92MB  ORANGE&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;and then you can download it:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:backups:download b002 -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Getting backup from ⬢ name-of-your-app... done, #2
Downloading latest.dump... ████████████████████████▏  100% 00:00 397.92MB&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku pg:bloat [database]
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against
  -r, --remote=remote  git remote of app to use&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;To show information about table and index bloat in your database, you can use this command:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:bloat HEROKU_POSTGRESQL_ORANGE_URL -a name-of-your-app&lt;/b&gt;

 &lt;i&gt;type  | schemaname |             object_name             | bloat |   waste    
-------+------------+-------------------------------------+-------+------------
 table | public     | table_1                             |   1.1 | 41 MB
 table | public     | table_2                             |   1.1 | 7360 kB
 table | public     | table_3                             |   1.1 | 4656 kB
 table | public     | table_4                             |   1.0 | 2480 kB&lt;/i&gt;  
&lt;/pre&gt;

&lt;p&gt;The &lt;b&gt;&lt;i&gt;bloat&lt;/i&gt;&lt;/b&gt; column shows the bloat factor, which is the fraction of the original table that exists as bloat. Because it is a ratio, there are no units. The &lt;b&gt;&lt;i&gt;waste&lt;/i&gt;&lt;/b&gt; column shows the total bloat (in bytes) in each table and index in the system.&lt;/p&gt;

&lt;h1&gt;
  
  
  heroku pg:psql [database]
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app            (required) app to run command against
  -c, --command=command    SQL command to run
  -f, --file=file          SQL file to run
  -r, --remote=remote      git remote of app to use
  --credential=credential  credential to use&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;You can access a psql shell of your database this way:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:psql HEROKU_POSTGRESQL_ORANGE_URL -a name-of-your-app&lt;/b&gt;

&lt;i&gt;--&amp;gt; Connecting to add-on-name
psql (11.3, server 11.5 (Ubuntu 11.5-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: cipher-code, bits: 256, compression: off)
Type "help" for help.

name-of-your-app::HEROKU_POSTGRESQL_ORANGE=&amp;gt;&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;You can now query your database with standard SQL commands, do insert, update or delete statements if you need to.&lt;/p&gt;

&lt;h1&gt;
  
  
  heroku pg:pull source target
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app                            (required) app to run command against
  -r, --remote=remote                      git remote of app to use

  --exclude-table-data=exclude-table-data  tables for which data should be
                                           excluded (use ';' to split multiple
                                           names)&lt;/i&gt;

&lt;b&gt;DESCRIPTION&lt;/b&gt;
  &lt;i&gt;Pull from SOURCE into TARGET.

  TARGET must be one of:
     * a database name (i.e. on a local PostgreSQL server)  =&amp;gt; TARGET must not
  exist and will be created
     * a fully qualified URL to a local PostgreSQL server   =&amp;gt; TARGET must not
  exist and will be created
     * a fully qualified URL to a remote PostgreSQL server  =&amp;gt; TARGET must exist
  and be empty&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;This command can come in handy if your local database is not big enough but you want to test some feature. This way, you can copy a staging/production database to a new local database:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:pull HEROKU_POSTGRESQL_ORANGE_URL name_of_local_new_db -a name-of-your-app&lt;/b&gt;

&lt;i&gt;heroku-cli: Pulling add-on-name ---&amp;gt; name_of_local_new_db
...
heroku-cli: Pulling complete.&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;You can also do the opposite, to push one of your local databases to Heroku, with &lt;strong&gt;pg:push&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  heroku pipelines:diff
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against
  -r, --remote=remote  git remote of app to use&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;If you want to check if your staging and production app are in sync, you can do so with the &lt;strong&gt;pipelines:diff&lt;/strong&gt; command:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pipelines:diff -a name-of-your-staging-app&lt;/b&gt;

&lt;i&gt;Fetching apps from pipeline... done
Fetching release info for all apps... done

⬢ name-of-your-staging-app is up to date with ⬢ name-of-your-production-app&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;If they are not in sync, you will get a detailed commit diff with the differences:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pipelines:diff -a name-of-your-staging-app&lt;/b&gt;

&lt;i&gt;Fetching apps from pipeline... done
Fetching release info for all apps... done

=== ⬢ name-of-your-staging-app is ahead of ⬢ name-of-your-production-app by 2 commits
SHA      Date                  Author        Message
some-sha 2019-10-23T11:56:47Z  sinanmujan    Update Ruby version to 2.6.5
some-sha 2019-10-10T07:00:08Z  sinanmujan    Fix redirect middleware&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku ps
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against
  -r, --remote=remote  git remote of app to use
  --json               display as json&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;To get information about all the dynos in your application, their startup command and up time, you can do this:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ps -a name-of-your-app&lt;/b&gt;

&lt;i&gt;=== web (Standard-1X): jemalloc.sh bundle exec puma -C config/puma.rb (1)
web.1: up 2019/11/05 00:40:48 +0100 (~ 10h ago)

=== worker (Standard-1X): bundle exec sidekiq -e production -C config/sidekiq.yml (1)
worker.1: up 2019/11/04 17:44:06 +0100 (~ 17h ago)&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku ps:exec
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app        (required) app to run command against
  -d, --dyno=dyno      specify the dyno to connect to
  -r, --remote=remote  git remote of app to use
  --ssh                use native ssh
  --status             lists the status of the SSH server in the dyno&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;If you want to connect to one of your dynos through SSH, you can do so like this:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku ps:exec -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Establishing credentials... done
Connecting to web.1 on ⬢ name-of-your-app...
~ $&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  heroku redis:cli
&lt;/h1&gt;

&lt;pre&gt;
&lt;b&gt;OPTIONS&lt;/b&gt;
  &lt;i&gt;-a, --app=app          (required) app to run command against
  -c, --confirm=confirm
  -r, --remote=remote    git remote of app to use&lt;/i&gt;
&lt;/pre&gt;

&lt;p&gt;You can access the Redis resource of your application:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku redis:cli -a name-of-your-app&lt;/b&gt;

&lt;i&gt;Connecting to redis-horizontal-35620 (REDIS_URL):
some-redis-url:20099&amp;gt;&lt;/i&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  Copy database between Heroku apps
&lt;/h1&gt;

&lt;p&gt;If you want to copy the entire database from one Heroku application to another, you can do it this way:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku pg:copy source_app::source_db_name destination_db_name -a destination_app&lt;/b&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  Copy ENV variables between Heroku apps
&lt;/h1&gt;

&lt;p&gt;If you want to copy ENV variables between 2 Heroku apps, there is an easy way to do this. First, we need to copy the settings from the current app to a text file on your local machine:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;heroku config -s -a existing-heroku-app &amp;gt; config.txt&lt;/b&gt;
&lt;/pre&gt;

&lt;p&gt;Then you can add the contents of this config file to your new Heroku app:&lt;/p&gt;

&lt;pre&gt;
&lt;b&gt;cat config.txt | tr '\n' ' ' | xargs heroku config:set -a new-heroku-app&lt;/b&gt;
&lt;/pre&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;These were just some interesting and hopefully helpful Heroku commands. You may find more useful tips and tricks in the official &lt;a href="https://devcenter.heroku.com/categories/reference"&gt;Heroku documentation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>heroku</category>
      <category>ci</category>
      <category>webdev</category>
      <category>cli</category>
    </item>
    <item>
      <title>Working with Git</title>
      <dc:creator>Sinan Mujan</dc:creator>
      <pubDate>Mon, 11 Nov 2019 08:44:45 +0000</pubDate>
      <link>https://forem.com/wizardhealth/working-with-git-2cl8</link>
      <guid>https://forem.com/wizardhealth/working-with-git-2cl8</guid>
      <description>&lt;p&gt;Git is known as a free and open source version control system. It is used by many developers to speed up and coordinate their work with ease and offers many ways to accomplish this. There are different ways and approaches how people use Git. In this post, I will try to show a simple yet effective way of using Git for your own projects or if you want to make OSS contributions.&lt;/p&gt;

&lt;h1&gt;
  
  
  Forking the project
&lt;/h1&gt;

&lt;p&gt;The first step is to create a &lt;strong&gt;fork&lt;/strong&gt; (copy) of the project you want to work on. This way you can work on your own copy and don't need to worry about making mistakes on the main repository. Go to the Github page of the project you want to work on and click the Fork button on the top right side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TMoL8hme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/eut9giof41imaholp0qs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TMoL8hme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/eut9giof41imaholp0qs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have successfully created a fork of the main project. Your fork is now located at:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloning the repository
&lt;/h1&gt;

&lt;p&gt;After forking the project, the next thing to do is to clone your fork (copy) into your local machine. In your terminal type:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone &amp;lt;url_of_your_cloned_repo&amp;gt;.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The URL of your cloned repo looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After cloning the project to your local machine, you can access your project folder:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd &amp;lt;your_project_name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and check the current branch you are on:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;By default you will be on &lt;strong&gt;master&lt;/strong&gt; branch, which is the main branch of the project. You should never make changes to the master branch and only use it for updating your current project with the latest version from the main repository (more on that later).&lt;/p&gt;

&lt;h1&gt;
  
  
  Starting your work
&lt;/h1&gt;

&lt;p&gt;Now you want to start working on the project, so what should you do?&lt;br&gt;
The first thing is to create a &lt;strong&gt;new branch&lt;/strong&gt; from your master branch. This way, you are logically separating your new work from the current (master) version of the project and you will avoid having possible merge problems with the master branch later on.&lt;br&gt;
You create a new branch like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout -b &amp;lt;name_of_your_working_branch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will create a new branch from your current (in this case master) branch. It is basically a copy of your master branch now.&lt;/p&gt;
&lt;h1&gt;
  
  
  Adding a remote repository
&lt;/h1&gt;

&lt;p&gt;Imagine you start working on your new branch and someone updates the main repository (from where you forked your project). This could lead to problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Someone else already finished work you wanted to do or changed files that you were about to change. This will lead to conflicts, you can eventually resolve them but it's easier not to get to this point because making a mistake while resolving a conflict could break the entire application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Someone else updated a gem version or even a new version of the application that makes your changes obsolete.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are just 2 problems that could occur if you don't update your repository regularly. The first thing you need to do is to add a remote repository:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git remote add &amp;lt;name_of_remote&amp;gt; &amp;lt;url_of_the_main_repository&amp;gt;.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The name of the remote can be any name that is not already added as a remote. When you clone your project, your forked repository is added by default as &lt;strong&gt;origin&lt;/strong&gt;, you can check this with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git remote -v&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The result should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  origin    https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt; (fetch)
  origin    https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt; (push)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Usually the name of the main repository that is used is &lt;strong&gt;upstream&lt;/strong&gt;. So after entering the above git remote add command with upstream as the remote name, checking your remotes as before will give you a new result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  origin    https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt; (fetch)
  origin    https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt; (push)
  upstream  https://github.com/&amp;lt;the_original_repository&amp;gt;/&amp;lt;your_project_name&amp;gt; (fetch)
  upstream  https://github.com/&amp;lt;the_original_repository&amp;gt;/&amp;lt;your_project_name&amp;gt; (push)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now you have your forked (origin) and the main (upstream) repositories added, so you can start doing some work.&lt;/p&gt;

&lt;h1&gt;
  
  
  Saving changes
&lt;/h1&gt;

&lt;p&gt;After you have done some work, you can check all the files that have changed with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first step in the process of pushing your changes is to add all the files for commit:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git add -A&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The difference between these 2 is that the &lt;strong&gt;-A&lt;/strong&gt; option adds all changes to the staging state (for commit). The &lt;strong&gt;dot (.)&lt;/strong&gt; option adds all but the removed files.&lt;br&gt;
Next, after you have added all the files you can &lt;strong&gt;commit&lt;/strong&gt; them. Commiting means saving your changes to your local repository. You can do it in different ways:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will open a text editor where you can add a commit title and description of your changes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit -m "&amp;lt;your_commit_message&amp;gt;"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This way you can add the commit details in the same line, without having to enter them in your text editor.&lt;/p&gt;

&lt;h1&gt;
  
  
  Merging or rebasing changes
&lt;/h1&gt;

&lt;p&gt;Before you go on and push your newly created commit to your local repository on Github, this is the best moment to sync your repository with the main repository. First you need to change back to your master branch, because as stated earlier, we use it for updating our project to the latest version (commit).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you have switched to your master branch and need to update it with the latest version of the main repository. For this, you can use the &lt;strong&gt;fetch&lt;/strong&gt; command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git fetch upstream master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or the &lt;strong&gt;pull&lt;/strong&gt; command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git pull upstream master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The difference here is that the &lt;strong&gt;fetch&lt;/strong&gt; command fetches the changes from the upstream repository but does not apply them to your local repository. You need to run the &lt;strong&gt;merge&lt;/strong&gt; or &lt;strong&gt;rebase&lt;/strong&gt; command next (explained in the next section).&lt;br&gt;
The &lt;strong&gt;pull&lt;/strong&gt; command does both, it fetches the changes and applies (merges) the changes to your local repository.&lt;br&gt;
Important to notice is the third parameter (upstream) is the name of the remote repository that you fetch (pull) from. Since we need to sync our local repository with the main repository, we choose upstream. The next step is to switch back to the branch you were working on:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout &amp;lt;name_of_your_working_branch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What's left is to apply the new changes from your master branch (that we previously synced with the latest version of the main repository) with your current working branch. There are 2 ways of doing this.&lt;/p&gt;

&lt;h1&gt;
  
  
  Merging
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;git merge master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first way is merging your commit with all commits from the main repository, which will create a new merge commit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TyoG5FkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bj9j4ow2904clh3jehjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TyoG5FkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/bj9j4ow2904clh3jehjd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, C4 is the commit you just created, C3 is a new commit in the main repository. By doing the merge command, you create a new merge commit (C5) that consists of commits C3 and C4.&lt;/p&gt;

&lt;h1&gt;
  
  
  Rebasing
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;git rebase master&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The second way is rebasing your commit with all commits from the main repository, which will not create a new merge commit as with merging but will leave the number of commits the same (all commits from the main repository + your new commit). The next image shows how it looks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jiti7ce0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2a0vdkvh58orgurjs0il.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jiti7ce0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2a0vdkvh58orgurjs0il.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;C4 is the commit you just created, C3 is a new commit in the main repository. Your commit is being applied to the new change from the main repository (commit C3).&lt;/p&gt;

&lt;p&gt;The question is - which one to use? It is recommended to use &lt;strong&gt;rebase&lt;/strong&gt; if you are working alone on a project because you can make your commit history cleaner. If you are working on a project with other people it may lead to inconsistency if you use rebase, with &lt;strong&gt;merge&lt;/strong&gt; you always preserve the commit history. Ultimately, it comes down to personal preference or how the project maintainer wishes to see the project.&lt;/p&gt;

&lt;h1&gt;
  
  
  Pushing changes
&lt;/h1&gt;

&lt;p&gt;Now that you have successfully merged or rebased your commit with the changes from the main repository, you can finally push your changes to your repository on Github. Remember that our forked remote repository is named &lt;strong&gt;origin&lt;/strong&gt;, so the command to push your changes is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git push origin &amp;lt;name_of_your_working_branch&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You have successfully pushed your changes to your forked remote repository on Github.&lt;br&gt;
The last step is to create a new Pull Request to the main remote repository, to apply your work. For that, you need to go to your forked repository on Github:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/&amp;lt;your_github_username&amp;gt;/&amp;lt;your_project_name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There you will get a new message that looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xVJ0nOvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/iw6j43n05iwu7t75r172.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xVJ0nOvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/iw6j43n05iwu7t75r172.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking the &lt;strong&gt;Compare and pull request&lt;/strong&gt; button opens a new prompt where you have to choose your repository (head repository) and the main repository branch (base repository) and the respective branches (in this case "name_of_your_working_branch" for the head repository and "master" for the base repository). The next image shows an example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Un2ow6lI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/nvx7c8w0cl2wrj8ag345.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Un2ow6lI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/nvx7c8w0cl2wrj8ag345.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can edit your Pull Request title and description if you want to. After you are satisfied, you only have to click &lt;strong&gt;Create pull request&lt;/strong&gt; to create the pull request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KoqoRs5m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/095ydkjfdh1nl2rl1ohn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KoqoRs5m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/095ydkjfdh1nl2rl1ohn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating the pull request, the maintainer of the project will make a review of your code and decide whether it's ok to merge or if you need to make changes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;In this post I explained how to start working with Git, the process of preparing your repository, adding changes, pushing them to Github and creating pull requests. You should have a better understanding of how to work with Git and hopefully it will improve your coding experience.&lt;/p&gt;

</description>
      <category>git</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
