<p>Git squash - это команда, которая позволяет объединить несколько коммитов в один единственный коммит. В результате этой операции история коммитов становится более чистой и логичной. Когда разработчик работает над проектом, он делает несколько коммитов, каждый из которых фиксирует определенные изменения в коде. Однако, иногда эти коммиты могут быть некоординационными или слишком мелкими, что затрудняет чтение истории изменений. И вот в таких случаях git squash может быть полезной командой.</p>
<p>Представьте себе ситуацию, когда вы работаете над новой функцией в ветке разработки. В процессе работы вы сделали несколько коммитов, в каждом из которых было небольшое исправление или изменение. Но когда вы закончили, вы поняли, что все эти коммиты можно объединить в один, чтобы сделать историю изменений более чистой и логичной.</p>
<p>Давайте рассмотрим пример, чтобы лучше понять, как работает git squash. Предположим, у нас есть следующая история коммитов:</p>
<pre>
<code class="hljs">
commit b56fb4d (HEAD)
Author: John Doe <johndoe@example.com>
Date: Tue Sep 14 14:00:00 2022 +0300
Fix bug in login form
commit 98cd566
Author: John Doe <johndoe@example.com>
Date: Mon Sep 13 13:00:00 2022 +0300
Update styles for sidebar
commit 12345ab
Author: John Doe <johndoe@example.com>
Date: Sun Sep 12 12:00:00 2022 +0300
Add new feature
commit abcdefg
Author: John Doe <johndoe@example.com>
Date: Sat Sep 11 11:00:00 2022 +0300
Initial commit
</code>
</pre>
<p>В данном примере мы имеем четыре коммита, каждый из которых представляет определенные изменения. Давайте сейчас объединим первые три коммита в один с помощью команды git squash.</p>
<p>Для этого выполните следующие шаги:</p>
<ol>
<li>Выполните команду <code>git rebase -i HEAD~3</code>, чтобы открыть интерактивный режим rebase с последними тремя коммитами.</li>
<li>В открывшемся текстовом редакторе замените слово "pick" на "squash" или просто "s" для всех коммитов, которые вы хотите объединить.</li>
</ol>
<pre>
<code class="hljs">
pick 98cd566 Update styles for sidebar
squash b56fb4d Fix bug in login form
squash 12345ab Add new feature
</code>
</pre>
<ol start="3">
<li>Сохраните и закройте файл.</li>
<li>Git автоматически откроет еще один файл редактора, где вы можете отредактировать сообщение коммита. Замените его на новое сообщение, которое будет являться суммой всех объединенных коммитов.</li>
</ol>
<pre>
<code class="hljs">
Merge branch 'feature/new-feature'
</code>
</pre>
<ol start="5">
<li>Сохраните и закройте файл.</li>
<li>Git завершит операцию и сделает новый коммит с объединенными изменениями.</li>
</ol>
<p>Теперь история коммитов выглядит следующим образом:</p>
<pre>
<code class="hljs">
commit 1234567 (HEAD)
Author: John Doe <johndoe@example.com>
Date: Tue Sep 14 14:00:00 2022 +0300
Merge branch 'feature/new-feature'
commit abcdefg
Author: John Doe <johndoe@example.com>
Date: Sat Sep 11 11:00:00 2022 +0300
Initial commit
</code>
</pre>
<p>В итоге мы получили один коммит, который содержит все изменения из предыдущих трех коммитов, а также новое сообщение, которое является суммой этих коммитов.</p>
<p>Также есть возможность использовать git squash с помощью команды <code>git merge --squash</code>. Она позволяет сделать squash и merge одновременно, объединяя все коммиты в один и применяя изменения этого коммита к текущей ветке.</p>
<p>Например, для объединения ветки "feature/branch" в текущую ветку выполните следующую команду:</p>
<pre>
<code>
git merge --squash feature/branch
</code>
</pre>
<p>После выполнения этой команды ветка "feature/branch" будет объединена в текущую ветку, и все ее коммиты будут объединены в один коммит, готовый к фиксации.</p>
<p>Важно отметить, что при использовании git squash необходимо быть осторожным, особенно когда делаете это на общедоступных ветках, которые используются другими разработчиками. Объединение коммитов может изменить историю проекта и вызвать проблемы при совместной работе.</p>
<p>В заключение, git squash является полезной командой, которая помогает сделать историю коммитов более понятной и логичной. Она позволяет объединить несколько коммитов в один и, таким образом, упростить работу с проектом. Команда git squash предоставляет возможность очистить историю коммитов и сделать ее более удобной для чтения и понимания.</p>