<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://oldwiki.devbox.themanaworld.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LlubNek</id>
	<title>The Mana World - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://oldwiki.devbox.themanaworld.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=LlubNek"/>
	<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/wiki/Special:Contributions/LlubNek"/>
	<updated>2026-05-06T01:29:18Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:LlubNek&amp;diff=12537</id>
		<title>User talk:LlubNek</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:LlubNek&amp;diff=12537"/>
		<updated>2009-07-06T23:28:59Z</updated>

		<summary type="html">&lt;p&gt;LlubNek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have seen you proposal for a signal-slot system and I have one remark to make: I&#039;ld like to see the &amp;quot;event&amp;quot; that triggered the signal being given as parameter to the signal handler (slot) function. It allows one handler for all key up and down events on an object. (Do you want separate a-up, b-up, a-down, b-down functions?)&lt;br /&gt;
--[[User:MathFox|MathFox]] 13:33, 4 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: The problem with that is that the method used as a slot must then take an event object whenever it is called, even outside of the event system.  For example, a void move_up(); or void attack_target(); method could easily be used by bot, npc or scripting code (for example, implementing one action as several others in sequence), whereas void move_up(SDL_EventType&amp;amp;); or void attack_target(SDL_EventType&amp;amp;); could not.  There may be cases where you do want to pass a value, like what tile you&#039;re over when you click a mouse button, but translating the event object into mouse position should be handled before passing it to the triggered action.  That said, it would make sense to store parameter info for each slot and event, so that only events which supply the appropriate information can be used with a particular action.  Also, I really do want separate &#039;&#039;slots&#039;&#039; for each &#039;&#039;action&#039;&#039; (and separate &#039;&#039;signals&#039;&#039; for each &#039;&#039;event&#039;&#039;)... --[[User:LlubNek|LlubNek]] 22:06, 5 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: Having typed signals and typed slots is something that can easily be done in C++ (using templates to avoid source code duplication). The C++ compiler by itself will be very good in preventing you from attaching non-sense slots to signals. (Note: you want the slots to take const&amp;amp; parameters!) Can you detail your plans so that it becomes clearer what the effects of your proposal are for client programmers and players? --[[User:MathFox|MathFox]] 23:15, 5 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I plan to use this, [https://sourceforge.net/projects/signalslot/ signal/slot library], to create a new input system.&lt;br /&gt;
::: A list of controls will be generated by enumerating the keyboards, mouses and game controllers attached to the system (at least when compiled with SDL 1.3).  There would also be virtual devices (for example, to combine keyboard input from several keyboards).  Each control will have a text string associated with it, constructed from the name of the device, followed by the name of the specific control (such as &amp;quot;Logitech, Inc. Dual Action Gamepad 0: button 0&amp;quot;).  There will also be a set of events associated with each control, which would also be named (&amp;quot;Logitech, Inc. Dual Action Gamepad 0: button 0: pressed&amp;quot;, &amp;quot;Logitech, Inc. Dual Action Gamepad 0: button 0: released&amp;quot;).  These are the names which would appear in an Advanced or Edit Binding window.&lt;br /&gt;
::: A list of slots will also be generated.  Each slot will be given a name, the specific class instance to call it on, and, if necessary, a bit mask indicating what parameters it requires.  This should all be registered with the input system when the instance is constructed.&lt;br /&gt;
::: Once the devices are enumerated and the actions registered, the current bindings will be loaded from a configuration file.  The configuration file would consist of a list of entries, each containing an event name and modifier mask and the associated action name.&lt;br /&gt;
::: Signals will be constructed when specific controls and modifiers are bound and added to a `std::map`.  The keys to this map will be a `std::pair` containing a mask of the modifiers and the event which triggers the signal.  When an SDL event fires, a pair is constructed as above and is checked against the map.  If there is a key which matches that pair, the associated signal is emitted.&lt;br /&gt;
::: Key points:  multiple controls per action, multiple actions per control, virtual devices allow input from sources other than keyboard, mouse and joystick (an automated test suite for example), adding new input devices is fairly simple, adding new actions requires no changes to the input system, and, aside from registering slots with the input system at startup, the rest of the code can pretty much forget the input system exists.  --[[User:LlubNek|LlubNek]] 23:28, 6 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Following up, not all handlers make sense in every situation... So you&#039;ld have to be careful in what you present to the user (keep type information with the signals and slots.)&lt;br /&gt;
--[[User:MathFox|MathFox]] 13:42, 4 July 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>LlubNek</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:LlubNek&amp;diff=12532</id>
		<title>User talk:LlubNek</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User_talk:LlubNek&amp;diff=12532"/>
		<updated>2009-07-05T22:06:57Z</updated>

		<summary type="html">&lt;p&gt;LlubNek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have seen you proposal for a signal-slot system and I have one remark to make: I&#039;ld like to see the &amp;quot;event&amp;quot; that triggered the signal being given as parameter to the signal handler (slot) function. It allows one handler for all key up and down events on an object. (Do you want separate a-up, b-up, a-down, b-down functions?)&lt;br /&gt;
--[[User:MathFox|MathFox]] 13:33, 4 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: The problem with that is that the method used as a slot must then take an event object whenever it is called, even outside of the event system.  For example, a void move_up(); or void attack_target(); method could easily be used by bot, npc or scripting code (for example, implementing one action as several others in sequence), whereas void move_up(SDL_EventType&amp;amp;); or void attack_target(SDL_EventType&amp;amp;); could not.  There may be cases where you do want to pass a value, like what tile you&#039;re over when you click a mouse button, but translating the event object into mouse position should be handled before passing it to the triggered action.  That said, it would make sense to store parameter info for each slot and event, so that only events which supply the appropriate information can be used with a particular action.  Also, I really do want separate &#039;&#039;slots&#039;&#039; for each &#039;&#039;action&#039;&#039; (and separate &#039;&#039;signals&#039;&#039; for each &#039;&#039;event&#039;&#039;)... --[[User:LlubNek|LlubNek]] 22:06, 5 July 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Following up, not all handlers make sense in every situation... So you&#039;ld have to be careful in what you present to the user (keep type information with the signals and slots.)&lt;br /&gt;
--[[User:MathFox|MathFox]] 13:42, 4 July 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>LlubNek</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=User:LlubNek&amp;diff=12527</id>
		<title>User:LlubNek</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=User:LlubNek&amp;diff=12527"/>
		<updated>2009-07-04T08:37:57Z</updated>

		<summary type="html">&lt;p&gt;LlubNek: New page: == LlubNek ==  === TODO === * Apply signal/slot based input system to TMW client. : Why? :: It allows several different events to trigger the same action. :: Adding new actions is fairly s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== LlubNek ==&lt;br /&gt;
&lt;br /&gt;
=== TODO ===&lt;br /&gt;
* Apply signal/slot based input system to TMW client.&lt;br /&gt;
: Why?&lt;br /&gt;
:: It allows several different events to trigger the same action.&lt;br /&gt;
:: Adding new actions is fairly simple:  create a member function with no parameters which performs the action, register the action with the event system (something like event_dispatch.registerAction(&amp;quot;name&amp;quot;, class_instance, &amp;amp;Class::member);, where class_instance is an instance of Class and Class is a subclass of the slot container class).&lt;br /&gt;
: What would this look like?&lt;br /&gt;
:: &#039;&#039;Default view&#039;&#039;&lt;br /&gt;
:: You are presented with a hierarchal list with each action listed, followed immediately by that actions bindings.  To add a new binding for an action select it or one of it&#039;s existing bindings, click add and trigger whatever event you want to associate with it.  To remove a binding, select it and click remove.  If you click remove with an action selected, all bindings for that action are removed.&lt;br /&gt;
:: &#039;&#039;Advanced view&#039;&#039;&lt;br /&gt;
:: You would have a set of bindings which you can add to or delete from.  When adding a member, you would be presented with a list of actions, a list of triggers (button/key press, button/key release, joystick axis goes positive, joystick axis goes negative, mouse/joystick axis increase, mouse/joystick axis decrease, joystick axis returns to 0), and a list of modifiers (shift, ctrl, etc.).  You would select one action and one trigger and whatever modifiers and click OK/Add/whatever.&lt;br /&gt;
: Considerations:&lt;br /&gt;
:: Signal / slot mechanism introduces some additional overhead, however, this is unlikely to be noticeable in a user input system.  Nobody types that fast.&lt;br /&gt;
:: Events from SDL should first be sent to GUI, then any unhandled events should be passed to input system.  Not the other way around.  However, modifier states will need to be monitored even for GUI handled events.&lt;br /&gt;
:: It may be advantageous to define a condition system instead of simple modifiers, so that action A is triggered only when condition B is true and event C occurs.  So for example, to attack if lshift+A is pressed, but only if lctrl is not pressed use something like this:  if ConditionAnd(left_shift_button_down, ConditionNot(left_ctrl_button_down)) casts to bool as true and KeyPressEvent[SDLK_a] is triggered, call player.attack_target();.&lt;/div&gt;</summary>
		<author><name>LlubNek</name></author>
	</entry>
	<entry>
		<id>https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Git_repository&amp;diff=12526</id>
		<title>Development:Git repository</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.devbox.themanaworld.org/index.php?title=Development:Git_repository&amp;diff=12526"/>
		<updated>2009-07-04T06:58:25Z</updated>

		<summary type="html">&lt;p&gt;LlubNek: Cloning:  removed tmw-website from for statement.  Website URL is of different form from other projects.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page provides some information about our switch to git (which, as of Nov 14th, has been completed). As an initial comforting note, git really isn&#039;t so complicated as some people would have you believe. A few months ago I became familiar with distributed version control by using Mercurial, and since a few weeks we&#039;re using git at work. I think we&#039;ll benefit a lot from switching to it on the long run.&lt;br /&gt;
&lt;br /&gt;
== The primary repository ==&lt;br /&gt;
&lt;br /&gt;
=== Initial setup ===&lt;br /&gt;
&lt;br /&gt;
With Git, we&#039;ll have one repository for each project. The central repositories through which we cooperate are hosted on [http://gitorious.org/ gitorious.org]. Gitorious is a friendly website that is also open source. On Gitorious the main repository for each project is called &#039;&#039;mainline&#039;&#039;. Once you click to the mainline repository, you can see several ways to clone it (the new &amp;lt;code&amp;gt;svn checkout&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
We&#039;ve categorized all projects related to The Mana World, so you can easily see the complete [http://gitorious.org/search?q=category%3Athe-mana-world list of The Mana World projects] on Gitorious. The projects have different clone URLs for read-only or developer access. The URL for developer access is called the &amp;quot;push URL&amp;quot;, since it allows you to push commits into the repository via ssh. The list below is for your convenience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
! Project&lt;br /&gt;
! Read-only URL&lt;br /&gt;
! Push URL (Developers only)&lt;br /&gt;
! Atom feed&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmw TMW client]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmw/mainline.git&lt;br /&gt;
| git@gitorious.org:tmw/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmw/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository contains the client for The Mana World&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmwdata TMW client data]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmwdata/mainline.git&lt;br /&gt;
| git@gitorious.org:tmwdata/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmwdata/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository has the client data.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmwserv TMW server]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmwserv/mainline.git&lt;br /&gt;
| git@gitorious.org:tmwserv/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmwserv/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository contains the our own server.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmwserv-data TMW server data]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmwserv-data/mainline.git&lt;br /&gt;
| git@gitorious.org:tmwserv-data/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmwserv-data/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository contains the data for TMWServ.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmwweb TMW web frontend]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmwweb/mainline.git&lt;br /&gt;
| git@gitorious.org:tmwweb/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmwweb/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository has the web module for TMWServ.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmw/website TMW website]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmw/website.git&lt;br /&gt;
| git@gitorious.org:tmw/website.git&lt;br /&gt;
| [http://gitorious.org/tmw/website/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository has our website.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmw-eathena eAthena server]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmw-eathena/mainline.git&lt;br /&gt;
| git@gitorious.org:tmw-eathena/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmw-eathena/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository contains our hacked up eAthena.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmw-eathena-data eAthena data]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmw-eathena-data/mainline.git&lt;br /&gt;
| git@gitorious.org:tmw-eathena-data/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmw-eathena-data/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository has the data for our eAthena.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[http://gitorious.org/tmwart TMW Art]&#039;&#039;&#039;&lt;br /&gt;
| git://gitorious.org/tmwart/mainline.git&lt;br /&gt;
| git@gitorious.org:tmwart/mainline.git&lt;br /&gt;
| [http://gitorious.org/tmwart/mainline/commits/master/feed.atom Atom]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=4|This repository has some sources for our artwork.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Git uses ssh&#039;s private/public key authentication for identifying committers. For development purposes you should clone the &amp;quot;push url&amp;quot;, but this requires that you have:&lt;br /&gt;
&lt;br /&gt;
# Signed up to gitorious.org&lt;br /&gt;
# Generated a private/public ssh keypair (if you haven&#039;t got this already)&lt;br /&gt;
# Filled in your public key in your account details on Gitorious&lt;br /&gt;
&lt;br /&gt;
=== Cloning ===&lt;br /&gt;
&lt;br /&gt;
If you simply &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; the URL without any additional arguments, it will create the repository in a directory called &amp;quot;mainline&amp;quot;. This is generally not what you want. Hence, after the clone url, you should pass the name of the directory you want to have created (just like with Subversion):&lt;br /&gt;
&lt;br /&gt;
 $ git clone &amp;lt;clone_url&amp;gt; project&lt;br /&gt;
&lt;br /&gt;
If you want to have all projects in one place, you probably want to do something like this:&lt;br /&gt;
&lt;br /&gt;
 $ mkdir tmw&lt;br /&gt;
 $ cd tmw&lt;br /&gt;
 $ git clone git@gitorious.org:tmwserv/mainline.git tmwserv&lt;br /&gt;
 $ git clone git@gitorious.org:tmw-eathena-data/mainline.git eathena-data&lt;br /&gt;
 etc.&lt;br /&gt;
 or for all of them in one go (after the cd tmw step):&lt;br /&gt;
 $ for repo in  tmw tmwdata tmwserv tmwweb tmw-eathena tmw-eathena-data ; do git clone git://gitorious.org/${repo}/mainline.git $repo  ; done&lt;br /&gt;
&lt;br /&gt;
The way Gitorious works, we can&#039;t have one top-level &amp;quot;tmw&amp;quot; project under which we put all these repositories, since they&#039;re really separate projects. Gitorious allows multiple repositories for each project, but they are clones of each other (you can only create new ones by cloning existing ones). This allows anybody (not just the development team) to make clones and start hacking on them. Changes can easily be merged from one one repository to another. So instead of all the inconvenience with TMW forks we had in the past, now comes the time to encourage people to clone!&lt;br /&gt;
&lt;br /&gt;
==== Shallow cloning for non-developers ====&lt;br /&gt;
&lt;br /&gt;
One of our repositories, tmwdata, has grown quite large cause of its long history filled with relatively large binary files. If you are only interested in getting the latest version, and have no need to be able to push back changes, then you can make a shallow clone:&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 git://gitorious.org/tmwdata/mainline.git tmwdata&lt;br /&gt;
&lt;br /&gt;
== Working with git ==&lt;br /&gt;
&lt;br /&gt;
=== Commit ===&lt;br /&gt;
&lt;br /&gt;
From now on, a commit is something you do locally. Others won&#039;t see your change on Gitorious unless you push it there. You&#039;ll notice committing is very fast, and you can commit multiple times before you decide to push. You can also make corrections to your last commit.&lt;br /&gt;
&lt;br /&gt;
Before you start committing, it is important to identify yourself to git, so that it can include the correct authorship information with your commit. You are no longer identified with a username, as was the case with Subversion. You can read exactly how to do this, as well as other useful information geared towards people switching from Subversion, on this page:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Git - SVN Crash Course:&#039;&#039;&#039; http://git.or.cz/course/svn.html&lt;br /&gt;
&lt;br /&gt;
=== Pushing ===&lt;br /&gt;
&lt;br /&gt;
Once you have committed some stuff, you can push these to the repository on Gitorious using &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;. This works since by default the push command pushes to a &#039;&#039;remote&#039;&#039; called &#039;&#039;origin&#039;&#039;, and this remote is automatically set up when you clone. However, the push will fail if there have been new commits on the remote repository. In that case, you&#039;ll first have to pull in these changes (just like with Subversion, however Subversion allowed this as long as the same files weren&#039;t touched, git doesn&#039;t).&lt;br /&gt;
&lt;br /&gt;
=== Pulling ===&lt;br /&gt;
&lt;br /&gt;
When you want to get the latest changes from the repository on Gitorious, you generally use &amp;lt;code&amp;gt;git pull&amp;lt;/code&amp;gt;. However, note that this command does not work when you have local changes. Also, when you have local commits, the pull command will generate a merge commit (and before that you may have to resolve some conflicts).&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to create merge commits, but would rather stack your local commits on top of any incoming commits, you should use &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt;. This &#039;&#039;rebases&#039;&#039; your local commits on top of the incoming ones. You should never do this when you have pushed these commits elsewhere, so only do it when you are sure the commits are only on your machine.&lt;br /&gt;
&lt;br /&gt;
If you have local changes and want to update your checkout, then there are several options:&lt;br /&gt;
&lt;br /&gt;
* You commit your local changes, and do a pull, optionally with --rebase.&lt;br /&gt;
* Or you use &amp;lt;code&amp;gt;git stash&amp;lt;/code&amp;gt; to place your local changes on a &amp;quot;hidden&amp;quot; stash. Then, after pulling, you apply your changes again with &amp;lt;code&amp;gt;git stash apply&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Or you create a patch of your local changes that you apply again after the pull. This approach sometimes makes sense, but I would say in general it&#039;s the more clumsy way to go. There are git commands that help you with this though.&lt;br /&gt;
&lt;br /&gt;
=== Resolving conflicts ===&lt;br /&gt;
&lt;br /&gt;
Rather similar to Subversion. When there are conflicts, a merge or a rebase will add conflict markers into files. Use &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt; to see which files remain in conflict and use &amp;lt;code&amp;gt;git add&amp;lt;/code&amp;gt; on files to mark them as resolved. When you did a merge and you have resolved all conflicts, you commit. When you were doing a rebase of several commits, you do &amp;lt;code&amp;gt;git rebase --continue&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
=== Patch making ===&lt;br /&gt;
&lt;br /&gt;
Git has an easy way to send patches to other people to review and commit for you. After you have made a commit, &amp;lt;code&amp;gt;git format-patch&amp;lt;/code&amp;gt; will make a patch out of it. The patch includes your author information the commit message you gave, and all the changes to be done. The recipient can just &amp;lt;code&amp;gt;git am [patch file]&amp;lt;/code&amp;gt; to apply the commit. After it has been pushed, you&#039;ll need to remove the patch from your local repository, &amp;lt;code&amp;gt;git reset --hard HEAD^&amp;lt;/code&amp;gt; will do that. If you don&#039;t do that, you&#039;ll get a conflict when your patch is pulled from the central repository.&lt;br /&gt;
&lt;br /&gt;
=== Good to know ===&lt;br /&gt;
&lt;br /&gt;
Git has several useful commands to figure out the current state of your repository, your files and what recently changed. Below is a non-exhaustive list of commands that are useful to know:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;git branch&#039;&#039;&#039;: Without any parameters, this command lists your local branches, and indicates which branch you&#039;re currently on.&lt;br /&gt;
* &#039;&#039;&#039;git whatchanged&#039;&#039;&#039;: This shows a list of all commits on the current branch similar to &amp;lt;code&amp;gt;git log&amp;lt;/code&amp;gt;, but with a list of the files that have been touched in each commit as well.&lt;br /&gt;
* &#039;&#039;&#039;git status&#039;&#039;&#039;: This shows all kind of things about your current checkout: which files changed, untracked (unknown) files, added or removed files, files that have conflicts (during merge), etc. It also shows the status of your index, which is what git will commit once you do &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt;. If you&#039;re new to git I would recommend to wait a bit with learning how to use the index, but not to avoid it forever.&lt;br /&gt;
&lt;br /&gt;
There are also additional applications that help you with using git:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;gitk&#039;&#039;&#039;: A simple but effective tool that visualizes the history and some of your current state. Run with &amp;lt;code&amp;gt;--all&amp;lt;/code&amp;gt; to have it show all branches, otherwise it will just show stuff relevant to your current branch.&lt;br /&gt;
* &#039;&#039;&#039;tig&#039;&#039;&#039;: A textual interface, rather similar to an email reader.&lt;br /&gt;
* &#039;&#039;&#039;git gui&#039;&#039;&#039;: A gui tool like gitk which helps you prepare and perform your commits. Also makes it easier to understand the index concept.&lt;br /&gt;
&lt;br /&gt;
=== git on Windows ===&lt;br /&gt;
&lt;br /&gt;
When using git on Windows you might use [http://code.google.com/p/msysgit/ msysgit]. If you notice that some files seem to have changed after doing a fresh clone, you may want to disable &amp;lt;code&amp;gt;core.autocrlf&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;git config core.autocrlf false&amp;lt;/code&amp;gt;. However, this is not recommended for contributors since the setting makes sure you don&#039;t commit Windows style newlines into the repository. When encountering this problem it is usually best to consult other developers about the affected files.&lt;/div&gt;</summary>
		<author><name>LlubNek</name></author>
	</entry>
</feed>