<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#60;?blog &#187; patch</title>
	<atom:link href="http://blog.visionsoftware.pl/tag/patch/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.visionsoftware.pl</link>
	<description>...nie tylko o programowaniu</description>
	<lastBuildDate>Sun, 23 Mar 2014 19:23:43 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	
	<item>
		<title>GIT i patche: tworzenie i ładowanie</title>
		<link>http://blog.visionsoftware.pl/roznosci/git-i-patche-tworzenie-i-ladowanie.html</link>
		<comments>http://blog.visionsoftware.pl/roznosci/git-i-patche-tworzenie-i-ladowanie.html#comments</comments>
		<pubDate>Sat, 14 Dec 2013 18:17:41 +0000</pubDate>
		<dc:creator><![CDATA[Marcin Fliszta]]></dc:creator>
				<category><![CDATA[Różności]]></category>
		<category><![CDATA[cherry-pick]]></category>
		<category><![CDATA[format-patch]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[repozytorium]]></category>
		<category><![CDATA[wersjonowanie]]></category>

		<guid isPermaLink="false">http://blog.visionsoftware.pl/?p=631</guid>
		<description><![CDATA[Zdarza się czasem, że potrzebujemy do aplikacji z użyciem GITa dodać jakąś funkcjonalność, jednak z pewnych powodów nie możemy posłużyć się normalnym commitem. Być może nie chcemy komuś przyznać prawa zapisu w repozytorium, lub nakładamy poprawkę na zewnętrzną aplikację, będącą pod kontrolą systemu wersjonowania. W takim przypadku pomocne będzie stworzenie patcha, a następnie załadowanie go do aplikacji. Tworzenie patcha Tworzenie patcha w GIT jest niezwykle proste. Powiedzmy, że chcemy wprowadzić pewną zmianę w działającą, zewnętrzną [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Zdarza się czasem, że potrzebujemy do aplikacji z użyciem GITa dodać jakąś funkcjonalność, jednak z pewnych powodów nie możemy posłużyć się normalnym commitem. Być może nie chcemy komuś przyznać prawa zapisu w repozytorium, lub nakładamy poprawkę na zewnętrzną aplikację, będącą pod kontrolą systemu wersjonowania. W takim przypadku pomocne będzie stworzenie patcha, a następnie załadowanie go do aplikacji.<span id="more-631"></span></p>
<h1>Tworzenie patcha</h1>
<p>Tworzenie patcha w GIT jest niezwykle proste. Powiedzmy, że chcemy wprowadzić pewną zmianę w działającą, zewnętrzną aplikację, a następnie przesłać te zmiany innemu programiście. Na początek powinniśmy stworzyć osobny branch na nasze zmiany:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git checkout -b fix-example master
</pre>
<p>Powyższe polecenie stworzy nowy branch o nazwie fix-example na podstawie gałęzi master i przełączy się na nią.</p>
<p>Następnie wprowadzamy wymagane poprawki i wykonujemy commit:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git add .
git commit -m &quot;My fixes&quot;
</pre>
<p>Teraz pozostaje już tylko wygenerowanie patcha z naszymi zmianami:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git format-patch master --stdout &gt; fix-example.patch
</pre>
<p>Powyższe polecenie wygeneruje plik z wszystkimi zmianami w stosunku do gałęzi master.</p>
<h1>Tworzenie patcha dla pojedynczego commita</h1>
<p>Jeśli chcemy stworzyć osobne patche dla każdego commita, możemy to zrobić w następujący sposób:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git format-patch -2 0c4b265151e8de7416d16d447d7ac89043c75481
</pre>
<p>Pierwszy parametr oznacza, ile patchy chcemy stworzyć, a drugi początkowego commita,. Poszczególne pliki zostaną nazwane na podstawie opisu commita, np:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
0001-My-fix-example.patch
0002-My-fix-examlple-2.patch
</pre>
<h1>Załadowanie patcha</h1>
<p>Ładowanie patcha jest równie proste, co jego tworzenie. Na początek możemy sprawdzić, co nowego wnosi przygotowana poprawka:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git apply --stat fix-example.patch
</pre>
<p>Wynikiem tego działania będzie lista wszystkich plików wraz z podsumowaniem zmian:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
myfile1.php | 4
myfile2.php | 2
2 files changed, 3 insertions(+), 3 deletions(-)
</pre>
<p>W następnym kroku warto sprawdzić, czy załadowanie patcha uda się przeprowadzić bez konfliktów. W końcu w aplikacji mogły się już pojawić jakieś zmiany dokonane przez inne osoby:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git apply --check fix-example.patch
</pre>
<p>W przypadku konfliktów, zostaną one wyświetlone na liście, na przykład:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
error: patch failed: myfile1.php:29
error: myfile1.php: patch does not apply
</pre>
<p>Natomiast w przypadku, gdy wszystko będzie możliwe do załadowania, nie powinniśmy zobaczyć żadnego komunikatu. W takim przypadku pozostaje już tylko faktyczne załadowanie naszej poprawki. Można to zrobić przy pomocy dwóch komend: git apply oraz git am. Druga z nich będzie jednak lepsza, gdyż umożliwia podpisanie patcha przez osobę, która go zaaplikowała:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git am --signoff &lt; fix-example.patch
</pre>
<p>Po zakończeniu operacji zostanie wyświetlona lista commitów, jakie zostały wprowadzone w patchu:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
Applying: my fix example
</pre>
<p>Przeglądając historię, będziemy mogli łatwo odnaleźć informację zarówno o autorze jak i osobie, która ją załadowała do repozytorium:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
$ git log
commit 01ed141f907ffafea6f3f0c9947c9b78dba1bb45
Author: Marcin Fliszta &lt;marcin.fliszta@...&gt;
Date: Sat Nov 30 13:13:40 2013 +0100

my fix example

Signed-off-by: Marcin Fliszta &lt;marcin.fliszta@...&gt;
</pre>
<h1>Wycofanie patcha</h1>
<p>Gdy podczas ładowania patcha coś pójdzie nie tak jak się spodziewaliśmy, możemy łatwo go wycofać. Tryb rozwiązywania problemów jest podobny do tego, z którym mamy do czynienia podczas konfliktów.</p>
<pre class="brush: plain; light: true; title: ; notranslate">
$ git am --signoff &lt; 0001-My-fix-example.patch
Applying: myfile1.php update
error: patch failed: myfile1.php:1
error: myfile1.php: patch does not apply
Patch failed at 0001 myfile1 update
The copy of the patch that failed is found in:
/var/www/patchexample/.git/rebase-apply/patch
When you have resolved this problem, run &quot;git am --resolved&quot;.
If you prefer to skip this patch, run &quot;git am --skip&quot; instead.
To restore the original branch and stop patching, run &quot;git am --abort&quot;.
</pre>
<p>W celu wycofania naszego patcha wystarczy zastosować komendę wymienioną na końcu informacji o niepowodzeniu:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git am --abort
</pre>
<h1>Przenoszenie commitów pomiędzy branchami</h1>
<p>Jeśli widzisz dodatkowe zastosowanie opisanych tutaj rozwiązań w przypadku przenoszenia wybranych commitów pomiedzy lokalnymi branchami, to nie warto zawracać sobie tym głowy. Do tego celu GIT posiada znacznie lepsze polecenie, jakim jest <a title="Dokumentacja GIT: cherry-pick" href="http://git-scm.com/docs/git-cherry-pick" target="_blank">cherry-pick</a>.</p>
<p>Jego składnia i działanie są banalnie proste i może wyglądać następująco:</p>
<pre class="brush: plain; light: true; title: ; notranslate">
git cherry-pick 01ed141f907ffafea6f3f0c9947c9b78dba1bb45
</pre>
<p>Powyższe wywołanie spowoduje wstawienie wybranego po hashu commita do bieżącego brancha. Nie musimy oczywiście wskazywać z jakiego brancha ma być on załadowany, gdyż hash jest unikalny dla całego repozytorium. Dostępne są oczywiście różne opcje tego polecenia, można zapoznać się z nimi w dokumentacji GITa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.visionsoftware.pl/roznosci/git-i-patche-tworzenie-i-ladowanie.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
