<div dir="ltr"><div class="gmail_quote">On Wed, Sep 7, 2011 at 7:13 PM, Gabor Szabo <span dir="ltr">&lt;<a href="mailto:szabgab@gmail.com">szabgab@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">On Wed, Sep 7, 2011 at 10:21 AM, sawyer x &lt;<a href="mailto:xsawyerx@gmail.com">xsawyerx@gmail.com</a>&gt; wrote:<br>
&gt; On Mon, Sep 5, 2011 at 8:23 PM, Gabor Szabo &lt;<a href="mailto:szabgab@gmail.com">szabgab@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
</div><div class="im">&gt;&gt; 3) If you need to fix a project of someone else that is on Github,<br>
&gt;&gt; what is your workflow?<br>
&gt;<br>
&gt; I used to just open an RT ticket and try to add a patch. Nowadays, I&#39;ll go<br>
&gt; straight to Github and search for their project (!github PROJECT on my<br>
&gt; DuckDuckGo! toolbar), fork it, start a branch with the fix, commit and send<br>
&gt; a pull request. I try to add tests, as it helps get it integrated much<br>
&gt; quicker.<br>
<br>
</div>That part is what is interesting to be<br>
so far I understood that you<br>
1) for on the Github GUI<br>
2) git clone your own fork to your machine<br>
3) git co -b some_name<br>
4) git cu -m &quot;fix&quot;  (several times)<br>
5) ... ??<br>
<br>
but then I am not sure<br></blockquote><div><br>1. !github Dancer<br>2. Click &quot;fork&quot; on the Dancer github page<br>3. In a local terminal, in my projects directory: git clone git@github.com:xsawyerx/Dancer.git<br>

4. Creating a branch of my own: git checkout -b feature/my-new-feature devel<br>(the &quot;devel&quot; at the end makes sure we&#39;re branching off &quot;devel&quot;, which is the development branch of Dancer)<br>5. git commit -m &quot;adding bling&quot; lib ; git commit -m &quot;adding bling tests&quot; t/ ; ...<br>

6. Pushing the branch to my clone on Github: git push origin feature/my-new-feature<br>7. Going to Github, to my clone of Dancer and picking &quot;Send a pull request&quot;<br>Adding details about what my new feature is.<br>

8. Once it is merged in Dancer, I can delete it locally and remotely:<br>git checkout devel # to leave the branch<br>git branch -d feature/my-new-feature<br>git push origin :feature/my-new-feature<br><br>If I don&#39;t pull the new merged versions of Dancer&#39;s devel, git won&#39;t allow me to delete my branch because it isn&#39;t merged it. I can force git to merge it (since I know it was merged into Dancer and I&#39;ll get it once I update from upstream) by using -D (uppercase D, instead of lowercase D): git branch -D feature/my-new-feature<br>

<br>It might seem like a lot but once you get used to it, it&#39;s hard to go back. Mainly because it&#39;s *very* clean and makes it *much* easier to get your stuff merged cleanly and most importantly - happily.<br> </div>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">&gt; If there is no Github repo, I&#39;ll put a patch (or multiple patches of<br>
&gt; consecutive commits) in an RT ticket on <a href="http://rt.cpan.org" target="_blank">rt.cpan.org</a>.<br>
<br>
</div>There is <a href="https://github.com/gitpan" target="_blank">https://github.com/gitpan</a>  what do you think?<br></blockquote><div><br>That&#39;s a good idea started by Schwern, but he hasn&#39;t updated it in a while. I understood that Olaf Alders (of MetaCPAN fame) wants to update it, so maybe after it gets updated we&#39;ll be able to use it to patch stuff.<br>

<br>I personally found that most projects to which I would want to contribute are already on Github, and those that aren&#39;t I can just create a patch (or a few patches) and put it with a ticket on <a href="http://rt.cpan.org">rt.cpan.org</a>.<br>

<br>Then again, YMMV, and I heard of at least one person who found patching against gitpan very comfortable.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">


<div class="im">
&gt;&gt; 4) How can the main author of the project handle the changes you pushed<br>
&gt;&gt; out?<br>
&gt;<br>
&gt; They can either apply the pull request, or apply the patches, or close it<br>
&gt; and ignore me. :)<br>
<br>
</div>I need the steps  slowly please :)<br></blockquote><div><br>Suppose I get an email notification from Github saying that you pushed a bling feature pull request to Dancer. Now I need to pull it. This can be a delicate process, because of various considerations.<br>

<br>First, I would update my Dancer &quot;devel&quot; branch with all the latest updates:<br>$ cd $DANCER_DIR<br>$ git checkout devel # although I&#39;m usually on &quot;devel&quot; anyway<br>$ git pull origin devel<br><br>

Now I want to get your branch. I can either define you as a new remote and pull your branch, or I can create a new branch and just pull your clone&#39;s stuff in. Let&#39;s pick the second one:<br>$ git checkout -b feature/my-new-feature<br>

$ git pull <a href="https://github.com/szabgab/Dancer.git">https://github.com/szabgab/Dancer.git</a> feature/my-new-feature<br><br>Now I want to merge it in. However, I have to make sure that if I merge it, I won&#39;t cause a problem. Sometimes people add a feature on top of code that has changed over time. Suppose you added this branch last week and I just got around to it today, perhaps someone else already merged stuff into &quot;devel&quot;. That makes your branch incompatible with the &quot;devel&quot; branch of today. I will need to make sure your code is updated.<br>

$ git rebase devel<br><br>Either one of three situations will occur:<br>1. You&#39;re already up-to-date, and git will say exactly that<br>2. There were commits done in &quot;devel&quot; after you made your commits, but it would be trivial to rebase and it will do that and finish.<br>

3. There were commits done in &quot;devel&quot; after your commits, and they conflict with yours. Git will say there&#39;s a conflict and ask you to resolve it and continue with &quot;git rebase --continue&quot;.<br><br>
Once things are up-to-date, I can merge your branch. Sometimes people make a mess with their branches by pulling incorrectly, merging not in place and other stuff. In that case I&#39;ll create another branch and cherry-pick the commits I want from your branch. I&#39;m assuming this isn&#39;t the case.<br>

$ git checkout devel<br>$ git merge --no-ff feature/my-new-feature<br>$ git br -d feature/my-new-feature<br>$ git push origin devel<br><br>Done.<br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">



&gt; Hope that helps,<br>
<br>
It did.<br></blockquote><div><br>Yay! :) <br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
Does that mean you won&#39;t give this as a talk? :)<font color="#888888"></font><br></blockquote><div><br>I&#39;ll be happy to give this as a talk. I&#39;ll have to consider how to explain this in a way that won&#39;t be too confusing. I felt like I scattered a bit with the Git talk.<br>

<br>Have a great day!<br>S. <br></div></div></div>