<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dataflex.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sture</id>
	<title>DataFlex Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://dataflex.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sture"/>
	<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Special:Contributions/Sture"/>
	<updated>2026-04-21T15:05:07Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Using_GIT_for_Dataflex_Development&amp;diff=2670</id>
		<title>Talk:Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Using_GIT_for_Dataflex_Development&amp;diff=2670"/>
		<updated>2016-09-30T18:08:01Z</updated>

		<summary type="html">&lt;p&gt;Sture: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Great article! But references to VDF and Visual DataFlex should omit the &amp;quot;Visual&amp;quot; part. Or maybe just add a note about it in the beginning. -Sture&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Using_GIT_for_Dataflex_Development&amp;diff=2669</id>
		<title>Talk:Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Using_GIT_for_Dataflex_Development&amp;diff=2669"/>
		<updated>2016-09-30T18:07:01Z</updated>

		<summary type="html">&lt;p&gt;Sture: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Great article! But references to VDF and Visual DataFlex should omit the &amp;quot;Visual&amp;quot; part. -Sture&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Using_GIT_for_Dataflex_Development&amp;diff=2668</id>
		<title>Talk:Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Using_GIT_for_Dataflex_Development&amp;diff=2668"/>
		<updated>2016-09-30T18:05:54Z</updated>

		<summary type="html">&lt;p&gt;Sture: Created page with &amp;quot;Great article! But references to VDF and Visual DataFlex should omit the &amp;quot;Visual&amp;quot; part.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Great article! But references to VDF and Visual DataFlex should omit the &amp;quot;Visual&amp;quot; part.&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2667</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2667"/>
		<updated>2016-09-30T17:59:44Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Download and install GIT-Gui */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug was introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle than others. We can identify the following types.&lt;br /&gt;
Historically version control was done by directory backups e.g. by using zip and file naming. The result is very near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category of distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has its own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 2.10.0 and about 30Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in DataFlex Studio. The ‘Configuring the line ending conversions’, leave for DF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2666</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2666"/>
		<updated>2016-09-30T17:59:03Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Download and install GIT-Gui */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug was introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle than others. We can identify the following types.&lt;br /&gt;
Historically version control was done by directory backups e.g. by using zip and file naming. The result is very near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category of distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has its own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 2.10.0 and about 30Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in VDF Studio. The ‘Configuring the line ending conversions’, leave for VDF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2665</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2665"/>
		<updated>2016-09-30T17:54:23Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Types of version control tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug was introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle than others. We can identify the following types.&lt;br /&gt;
Historically version control was done by directory backups e.g. by using zip and file naming. The result is very near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category of distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has its own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 1.8.0 and about 15Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in VDF Studio. The ‘Configuring the line ending conversions’, leave for VDF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2664</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2664"/>
		<updated>2016-09-30T17:52:48Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Types of version control tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug was introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle than others. We can identify the following types.&lt;br /&gt;
Historically version control was done by directory backups e.g. by using zip and file naming. The result is very near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category of distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has his own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 1.8.0 and about 15Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in VDF Studio. The ‘Configuring the line ending conversions’, leave for VDF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2663</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2663"/>
		<updated>2016-09-30T17:50:12Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Types of version control tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug was introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle than others. We can identify the following types.&lt;br /&gt;
Historically version control was done by directory backups e.g. by using zip and file naming. The result is very near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category the distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has its own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 1.8.0 and about 15Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in VDF Studio. The ‘Configuring the line ending conversions’, leave for VDF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2662</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2662"/>
		<updated>2016-09-30T17:44:31Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Why Version control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug was introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle then others. We can identify the following types.&lt;br /&gt;
Historical version control was done by directory backups e.g. by using zip and file naming. The result is many near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category the distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has its own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 1.8.0 and about 15Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in VDF Studio. The ‘Configuring the line ending conversions’, leave for VDF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2661</id>
		<title>Using GIT for Dataflex Development</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Using_GIT_for_Dataflex_Development&amp;diff=2661"/>
		<updated>2016-09-30T17:42:56Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Why Version control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Why Version control ==&lt;br /&gt;
Before we jump into GIT in specific, it is important to mention some reasons why developers are more productive when using version control;&lt;br /&gt;
* We can keep track of multiple versions deployed&lt;br /&gt;
* Multiple developers can be working on same project&lt;br /&gt;
* It is helpful with code checks  for auditing or training&lt;br /&gt;
* A proper change log of each change is maintained&lt;br /&gt;
* We can locate changes for one feature/fix across a number of changed files&lt;br /&gt;
* The code is in a safe location, in case of lost hardware&lt;br /&gt;
* We can find when a located bug introduced, so you can see what clients are effected&lt;br /&gt;
It can be tough when you are looking at a piece of code, not knowing when/how it’s used. But when you can run a version control tool, which shows exactly when those lines were added, by who and with what description, it makes it so much easier to decide what to do with that piece of unknown code, whether it’s retiring it, refactoring, documenting or just leave it as it is.&lt;br /&gt;
Another good reason that warrants its own paragraph is when you are developing using Agile sprints/iterations. Oversimplified, you determine a list of features you or your team are going to implement in order of priority, but your iteration is timeboxed to eg 4 weeks. This means that after 4 weeks all approved and tested code stays in the product and the features that did not make it in full or are not fully tested and or approved, are to be taken out and used for the next sprint/iteration. This warrants for a good use of version control, where each feature can very easy be isolated from the packaged software.&lt;br /&gt;
&lt;br /&gt;
=== Types of version control tools ===&lt;br /&gt;
Version control is a way of work, not a tool itself. There are many version control systems, some are more suitable for the VDF development cycle then others. We can identify the following types.&lt;br /&gt;
Historical version control was done by directory backups e.g. by using zip and file naming. The result is many near identical copies. It also requires a lot of self discipline.&lt;br /&gt;
Centralised version control has been very popular for years, where you have one centralised server and many remote clients. Examples are CVS, Subversion, Vault, Visual Source Safe and Team Foundation Server. These work very well when you are connected to the server. When not connected these are not giving much assistance.&lt;br /&gt;
Distributed version control is the latest and most popular peer to peer version control tool. Examples are Mercurial (hg), GIT, BitKeeper etc.&lt;br /&gt;
This white paper focuses on the last category the distributed version control, with GIT in particular.&lt;br /&gt;
If you are currently using a Centralised version control, you might be interested in the following list of major changes with the Distributed flavour;&lt;br /&gt;
* No access to a server is required, the distributed VC has a local repository that gets synch’ed with a remote (central or peer to peer) repository when it can but can work fine on its own.&lt;br /&gt;
* Each developer has its own repository local to their working directory&lt;br /&gt;
* No file checkout is required, just start changing the files&lt;br /&gt;
* You can stage a number of files, so multiple files can be part of one commit (maintaining the relationship of the changes in the files)&lt;br /&gt;
* You can optionally stage only a couple of changed lines in a file (if more changes are made then you want to stage).&lt;br /&gt;
* You commit the staged changes with a comment&lt;br /&gt;
* You push and pull changes between the local and remote repositories&lt;br /&gt;
* Branching used to be hard and therefore hardly used. Now really simple.&lt;br /&gt;
* But commit is local, so developers have to do a push to remote to make the change visible for other developers to do a clone/pull from remote&lt;br /&gt;
&lt;br /&gt;
== Installing and using GIT ==&lt;br /&gt;
Enough theory, we’ll now show how it’s done. GIT is very small and easy to uninstall later if you decide to do so, therefore I strongly suggest you just follow these steps and perform these yourself while reading this white paper.&lt;br /&gt;
&lt;br /&gt;
=== Download and install GIT-Gui ===&lt;br /&gt;
Navigate your browser to http://git-scm.com/downloads and download the latest windows version (at time of writing 1.8.0 and about 15Mb in size). Install on your machine, I recommend keeping the installer suggested components, and suggested ‘Adjusting of PATH environment’. The latter helps when creating menu’s in VDF Studio. The ‘Configuring the line ending conversions’, leave for VDF development as checkout as-is, commit as-is.&lt;br /&gt;
&lt;br /&gt;
=== Creating your first repository ===&lt;br /&gt;
Let’s create a GIT repository of the Dataflex example Order Entry workspace. This workspace always is clean when VDF is installed but in my case, full of test and other changed code after a while. Being able to go back to the original version seems like a good idea for a first repository.&lt;br /&gt;
&lt;br /&gt;
Start with navigate to and select the workspace directory then use the right click (short cut) menu, and select ‘Git Init Here’ as below.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image001.png]]&lt;br /&gt;
&lt;br /&gt;
The Git Init takes about a second. In this second it initialised a local repository in this work directory. You find that a subsequent right mouse click on the same directory now shows a different short cut menu;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image002.png]]&lt;br /&gt;
Inside the Order Entry directory you see a new hidden directory ‘.git’. This directory contains the whole local repository. So if you would delete this, the repository is gone.&lt;br /&gt;
&lt;br /&gt;
Although the repository is created, it has not added any of our files. For this to happen we need to stage the files and then commit. We do this in the following steps;&lt;br /&gt;
&lt;br /&gt;
Go back to the workspace directory and select ‘Git Gui’ from the shortcut menu on the Order Entry directory.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image003.png]]&lt;br /&gt;
&lt;br /&gt;
Git Gui will start like below&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image004.png]]&lt;br /&gt;
&lt;br /&gt;
Panel 1 shows all files that are detected to differ from the repository. As the repository is empty, this means this list contains all files. Clicking on a file name (not the icon) shows in panel 3 the changes compared with the repository version&lt;br /&gt;
&lt;br /&gt;
Panel 2 has the files that you have indicated you want to stage for commit. Clicking on the icon of a file in Panel 1, shifts the file from Panel 1 ‘Unstaged Changes’ to panel 2 ‘Staged Changes’.&lt;br /&gt;
&lt;br /&gt;
If this starts to sound all too complicated bare with me, it is really not that hard and there are very good reasons for doing the staging this way&lt;br /&gt;
&lt;br /&gt;
When you look at the files in Panel 1, the Unstaged Changes, you find that it has a number of files you do not want to track such as IDESrc/Workspace.loc, possibly files in the data directory etc.&lt;br /&gt;
&lt;br /&gt;
We can teach GIT what files to ignore by placing a file called .gitignore in the workspace directory. The content of the file is;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#Exclude the following files for DataFlex Projects&lt;br /&gt;
####################################&lt;br /&gt;
programs/*.exe&lt;br /&gt;
programs/*.dbg&lt;br /&gt;
programs/*.exe.manifest&lt;br /&gt;
programs/webapp.log&lt;br /&gt;
appsrc/*.dep&lt;br /&gt;
appsrc/*.fld&lt;br /&gt;
appsrc/*.pbg&lt;br /&gt;
appsrc/*.pdp&lt;br /&gt;
appsrc/*.pkd&lt;br /&gt;
appsrc/*.prp&lt;br /&gt;
appsrc/*.err&lt;br /&gt;
data/*.cch&lt;br /&gt;
ddsrc/*.bak&lt;br /&gt;
idesrc/studiometadata.mtd&lt;br /&gt;
idesrc/workspace.loc&lt;br /&gt;
&lt;br /&gt;
vssver2.scc&lt;br /&gt;
nppbackup&lt;br /&gt;
&lt;br /&gt;
#personal preference&lt;br /&gt;
####################################&lt;br /&gt;
appsrc/*.prn&lt;br /&gt;
idesrc/*.dsk&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So create this file in notepad, insert  the above content and save with filename’.gitignore’ as sibling next to the ‘Order Entry.sws’ file.&lt;br /&gt;
&lt;br /&gt;
If you kept Git Gui open, use the ‘Rescan’ button (or F5 key) and confirm that the unwanted files are no longer shown in the list of Unstaged changes.&lt;br /&gt;
&lt;br /&gt;
Ok, now it’s time to stage all not to be ignored files. You can either select each file in Panel 1, by clicking its icon,  use the shift key to select multiple and use Ctrl+T Stage to commit, or click ‘Stage changed’ button (that I marked with ‘A’ in the screenshot).&lt;br /&gt;
&lt;br /&gt;
Now enter the Initial Commit Message like ‘VDF 17.0 Order entry sample as released by Data Access’. And click the ‘Commit’ button (marked with ‘B’ in my screenshot).&lt;br /&gt;
&lt;br /&gt;
You noticed that the commit was really quick, and all panels are blank. You have just created a new repository, told GIT what files to ignore, and committed all other files into the repository.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the author in GIT ===&lt;br /&gt;
When you commit, GIT keeps track of not only the changes, but also of the Author of the changes. In the above initial commit, we did not set this and as DAW is the author this did not really matter, but changed from now on, should have yourself as the author.&lt;br /&gt;
&lt;br /&gt;
To set the Author select  menu  Edit – Options.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image005.png]] &lt;br /&gt;
&lt;br /&gt;
As you can see there are many settings you can do. For now just set the Username and email address as indicated below with the arrows. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image006.png]]  &lt;br /&gt;
&lt;br /&gt;
== Using git ==&lt;br /&gt;
&lt;br /&gt;
=== Making changes and revert back ===&lt;br /&gt;
We have our safe initial commit so we can make changes to our hearts content.&lt;br /&gt;
&lt;br /&gt;
Open the Order Entry.sws. Let’s say you want to add the container3D around the objects in the customer view to make it consistent with the other views in this workspace. So I selected in the Design view the Customer Number and Name form, as well as the dbTabDialog. Did Cut, dragged a Container3D from the palette, made it big enough, Pasted the objects back in (while Container3D was selected) and resized the container holding CTRL key to make sure it does not resize the objects. Then I compiled the projects and confirmed all was working.&lt;br /&gt;
&lt;br /&gt;
Notice that I did NOT have to checkout any files!&lt;br /&gt;
&lt;br /&gt;
So when happy with the changes, switch back to Git Gui (Alt+Tab if you leave it running), and do a Rescan by clicking on the button or F5.&lt;br /&gt;
&lt;br /&gt;
Two files are loaded in the Unstaged Changes. As you select the filename you see the changed lines in the third panel.&lt;br /&gt;
&lt;br /&gt;
In this example we have no interest in committing any changes and basically want to lose all uncommitted changes.&lt;br /&gt;
&lt;br /&gt;
From the menu select Branch-Reset. A warning dialog will indicate that you indeed will lose all uncommitted changes. Select Yes.&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and notice that the customer view is back to what it was.&lt;br /&gt;
&lt;br /&gt;
Now hold-on you might say, why is this in the branch menu, I would not have looked there... When we look a bit further at branching I promise it will make more sense. If impatience; the short answer is that the master is also a branch.&lt;br /&gt;
&lt;br /&gt;
=== Creating a branch and making changes ===&lt;br /&gt;
As a developer you should not create changes direct in the master branch. Instead you should create a branch specific to the change you want to make (topic branch), and then when you decide to keep the change, merge the topic branch into the master (or even better in a release branch).&lt;br /&gt;
&lt;br /&gt;
There are two methods of organising the topic branches. The first way is as sibblings, the other way is consecutive. This document starts with the sibbling way.&lt;br /&gt;
&lt;br /&gt;
Let’s create a new branch; switch back to Git gui and select menu: branch – create to open the following dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image007.png]]&lt;br /&gt;
&lt;br /&gt;
I’ve entered a branch name. Notice that the dialog does not allow you to insert spaces, so use Mixed case notation. Use a naming that refers to an ID in your change request system so use something like “CR5612_UpdateFontsOnReports “.&lt;br /&gt;
&lt;br /&gt;
Notice that the starting revision is ‘master’ but don’t worry about this too much, otherwise you might think it’s more complex than it is.&lt;br /&gt;
&lt;br /&gt;
So click on Create after you entered the name. The dialog changes and all you are left in is the message above the Unstaged Changes panel showing the current branch.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image008.png]]&lt;br /&gt;
&lt;br /&gt;
Make some changes like commenting out the Crystal reports to save compile time (Includes and menu’s). And replace in CustomerListWP.rv the ‘arial’ font to ‘Segoe UI’.&lt;br /&gt;
&lt;br /&gt;
Compile the project and see how much better the report looks.&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a Rescan. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image009.png]]&lt;br /&gt;
&lt;br /&gt;
You see the three changed files, and at the right the line old and new line.&lt;br /&gt;
&lt;br /&gt;
Let’s assume that this is all the change you want to do for now.  The work is not fully done, as you want to change the font on all the reports, but need to attend to another change you want in your project.&lt;br /&gt;
&lt;br /&gt;
So you stage and commit these changes into this branch. Click ‘Stage Changed’ button (or Ctrl+I), enter a commit message eg ‘Changed first report and removed crystal reports’. Click ‘Commit’ (or Ctrl+Enter).&lt;br /&gt;
&lt;br /&gt;
The next change you want to make is not related to the above change. So you create a new topic branch. You’ll soon found that for each individual programming request you want to create an own topic branch.&lt;br /&gt;
&lt;br /&gt;
But take care when creating the new branch; you want to create this from the master. So in the create branch dialog (Menu Branch-Create), you want to select the master as the Starting revision local branch;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image010.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I use the name ‘Topic branch’. This is not a name used in GIT itself, but it is used in the GIT documentation to refer to a branch created for the purpose of creating, updating or removal of a specific feature.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image011.png]]  &lt;br /&gt;
&lt;br /&gt;
Hovering over the branch names shows some information regarding the branch, which for the sake of this document highlighted in a green box.&lt;br /&gt;
&lt;br /&gt;
When you click create, you see that the Current Branch is changed to the newly created one.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image012.png]]  &lt;br /&gt;
&lt;br /&gt;
As you selected the master to be the starting revision, you will also find that when switching back to the VDF Studio, the state of source code is back to what it was when we committed the master. This might worry you but this is a good thing.&lt;br /&gt;
&lt;br /&gt;
Please confirm that the Crystal reports are back and the font is also back to arial.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you made a mistake and did not base the new branch on master, just switch away from the new branch with Branch-Checkout and select master. Then do menu Branch-delete and select the wrongly created branch. Once deleted create the new branch again, but this time based on the master.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Make a change like adding the Total sales to the Sales Person entry view. In this revision we just calculate on the spot, but we might later add a field for it;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image013.png]]  &lt;br /&gt;
&lt;br /&gt;
I inserted ‘Use for_all.pkg’ at the top of the SalesP.vw  code and the code below just before the End_object of the oContainer1;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
        End_Procedure&lt;br /&gt;
&lt;br /&gt;
        Object oTotalSalesForm is a Form&lt;br /&gt;
            Set Size to 13 44&lt;br /&gt;
            Set Location to 4 182&lt;br /&gt;
            Set Form_Datatype to Mask_Currency_Window&lt;br /&gt;
            Set Enabled_State to False&lt;br /&gt;
            Set Form_Mask to &amp;quot;$,0.&amp;quot;&lt;br /&gt;
            Set Label to &#039;Total sales:&#039;&lt;br /&gt;
            Set Label_Col_Offset to 2&lt;br /&gt;
            Set Label_Justification_Mode to jMode_Right&lt;br /&gt;
            &lt;br /&gt;
            Procedure CalculateTotalSales&lt;br /&gt;
                Number nTotalSales&lt;br /&gt;
                Open OrderHea&lt;br /&gt;
                For_All OrderHea by 0&lt;br /&gt;
                    Constrain OrderHea Relates to SalesP&lt;br /&gt;
                    do&lt;br /&gt;
                        Add OrderHea.Order_Total to nTotalSales&lt;br /&gt;
                End_For_All&lt;br /&gt;
                Set Value to nTotalSales&lt;br /&gt;
            End_Procedure&lt;br /&gt;
        End_Object&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Switch back to Git Gui and do a rescan (F5). You see that SalesP.vw and probably order.cfg are changed.&lt;br /&gt;
&lt;br /&gt;
If you are happy with the changes, then Stage and commit them.&lt;br /&gt;
&lt;br /&gt;
=== Merge branches ===&lt;br /&gt;
The previous section might unsettle you a bit. We made two changes, both from the same base code (master) but now we want to compile them both into one test version to give to the testers.&lt;br /&gt;
&lt;br /&gt;
We do this by merging. We first create a new branch called ‘Version2.0Beta1’, with starting revision ‘master’. When done we have again the source code the same as the master.&lt;br /&gt;
&lt;br /&gt;
Now we merge the changes in the branch ‘CR5612_UpdateFontsOnReports’ and ‘CR5613_ShowTotalSalesOnSalesPersonDialog’ into this ‘Version2.0Beta1’ branch. Do a local merge via menu open Merge-Local Merge, or Ctrl+M.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image014.png]]&lt;br /&gt;
&lt;br /&gt;
Select the first branch and click Merge. Then go back to the Merge dialog (Ctrl+M) and select the other one.&lt;br /&gt;
&lt;br /&gt;
Git has a fantastic build in 3 way merge, illustrated in the image on the right.&lt;br /&gt;
&lt;br /&gt;
However you possibly see that that there is a conflict and the Automatic 3way merge failed as a change from the base version was found in both branches on the same line. This raises a merge conflict. The following screens go into solving this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image015.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image016.png]]&lt;br /&gt;
&lt;br /&gt;
Close the dialog informing you of the merge fail and check the presented merge conflict. I’ve drawn two arrows to the important text.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image017.png]]&lt;br /&gt;
&lt;br /&gt;
The text ‘VersionBuild=1’ is indicated with ‘HEAD’. This is a pointer to the local current branch, and thus indicates the current committed code for the current branch. The ‘VersionBuild=6’ is marked with the branch name ‘CR5613_ShowTotalSalesOnSalesPersonDialog’.&lt;br /&gt;
&lt;br /&gt;
Please note if you compiled both source codes the same number of times or have turned ‘Auto-increment build version’ off in the project properties, you will not have this conflict. Also if you checked in the branch in the other order, you would have the other branch shown here.&lt;br /&gt;
&lt;br /&gt;
In this case the build number is probably not of great concern but, it is great that GIT detected that you have a change in both branches on the same line and just want to show you this so you can make the correct decision regarding fixing this.&lt;br /&gt;
&lt;br /&gt;
In reality the file in your workdirectory is updated with the &amp;lt;&amp;lt;&amp;lt;Head ... &amp;gt;&amp;gt;&amp;gt; Branch text. This file is also shown as unstaged. You have the following options:&lt;br /&gt;
&lt;br /&gt;
# Update the file outside of git-gui (in this stage eg notepad++). Then save the manually merged file, do a Rescan, Stage &amp;amp; Commit&lt;br /&gt;
# Run Mergetool (eg. KDiff3) to show the base(closest common parent), the first and already merged branch, and the second branch. You can simply select the change to keep. It will create by default a .orig with the merge conflict&lt;br /&gt;
# Use remote version (latest merge) /Local version (previous merge) or Base (closest common parent)&lt;br /&gt;
&lt;br /&gt;
Whatever your choice of addressing the merge conflict, you stage and commit the version to keep.&lt;br /&gt;
&lt;br /&gt;
Now Switch back to the studio, compile the project and confirm that both the sales person amount and the winprint changes are in this ‘Version2.0Beta1’ branch.&lt;br /&gt;
&lt;br /&gt;
The test version is ready for... testing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Just remember to merge, switch to (checkout) the branch you want to merge into. Then select the branch that you want to merge into the current branch.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Further changes required on one of the change requests ===&lt;br /&gt;
&lt;br /&gt;
As normal the test version comes back with a number of changes that are required. Let’s say that the first one is that the total amount form should not be visible if no record is shown.&lt;br /&gt;
&lt;br /&gt;
It could be tempting to make this change in the ‘Version2.0Beta1’ branch but resist. The changes should be made in the branch linked to the change request. So we need to switch branches. In Git this is called ‘checkout’. This does not have much to do with the function Checkout in centralised version control systems, but you can imagine its function is related.&lt;br /&gt;
&lt;br /&gt;
So via the menu do Branch-Checkout or Ctrl+O. On the Checkout Branch dialog select the CR5613_ShowTotalSalesOnSalesPersonDialog local branch and click Checkout.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image018.png]]&lt;br /&gt;
&lt;br /&gt;
If you get an error ‘File level merge required’ regarding the Order.cfg, it means that this file is changed on disk from the current committed code in the current branch (still Version2.0Beta1). This would have been as you probably compiled the code after the last merge and still had the Auto increment on. &lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image019.png]]&lt;br /&gt;
&lt;br /&gt;
So GIT basically checks if any changes would have been lost by changing to another branch (checkout) while the changes were not yet committed or reset.&lt;br /&gt;
&lt;br /&gt;
So we just click ok on the dialog. We rescan and stage the order.cfg file, but for the commit we do not enter a message, instead we use the radio box and move from ‘New commit’ to ‘Amend last commit’. We then do Commit.&lt;br /&gt;
&lt;br /&gt;
This feature of Amend last commit is very helpful when you just committed something and find that you forgot a feature have a silly bug etc and just don’t want this to be tracked as a separate commit.&lt;br /&gt;
&lt;br /&gt;
Now we can go back to our checkout of the CR5613_ShowTotalSalesOnSalesPersonDialog branch. Use Ctrl+O, select the branch and click checkout.&lt;br /&gt;
&lt;br /&gt;
Confirm that the current branch switched;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image020.png]]&lt;br /&gt;
&lt;br /&gt;
Switch back to VDF Studio and the SalesP.vw file. Change the Refresh procedure to the following code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        // This only works from VDF 17.0 where Refresh is also send to containers&lt;br /&gt;
        Procedure Refresh Integer eMode&lt;br /&gt;
            Handle hoServer&lt;br /&gt;
            Boolean bHasRecord&lt;br /&gt;
            &lt;br /&gt;
            Get Server to hoServer              &lt;br /&gt;
            Get HasRecord of hoServer to bHasRecord &lt;br /&gt;
            If (bHasRecord) Send CalculateTotalSales to oTotalSalesForm&lt;br /&gt;
            Set Visible_State of oTotalSalesForm to (bHasRecord)&lt;br /&gt;
&lt;br /&gt;
            Forward Send Refresh eMode&lt;br /&gt;
        End_Procedure&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compile and confirm the code.&lt;br /&gt;
&lt;br /&gt;
To avoid further issues with the config.cfg we will turn the auto increment off. Although I think there is a lot of value in the build number, I think it should be increased for every version that leaves the developer (test and release versions), not during the actual development. In the VDF Studio do Project – Project Properties, select the Version tab and untick the Auto-Increment build version. Click OK to save the change.&lt;br /&gt;
&lt;br /&gt;
We now want to attend to the other changes to the winprint report. But we have not staged and checked in the new code. If you were to forget the ‘file level merge is required’ would appear again. We don’t want this, so we properly stage and commit the change as a new commit with eg ‘Request 1 from testing beta1, hide total amount form on clear.’&lt;br /&gt;
&lt;br /&gt;
We change branch by Checkout of the PlayWithWinPrintReports and make out changes there.&lt;br /&gt;
&lt;br /&gt;
When these are all nicely done and committed, we create a new branch‘Version2.0Beta2’, based on master and merge the two branches in.&lt;br /&gt;
&lt;br /&gt;
You could decide to create the new branch based on ‘Version2.0Beta1’. I personally don’t see an advantage of this, but you could.&lt;br /&gt;
&lt;br /&gt;
=== Branching – Merging wrap-up ===&lt;br /&gt;
&lt;br /&gt;
I think each change request should have its own branch. As you have seen above, it is really easy to create branches, merge the changes and create (test) release branches with the features. This has advantages that features that are not complete at the time of release will simply not be merged into that release. All code changes stay in the branch and will be further worked on when you decide to do so. Working properly with branches means there is a minimal risk of issues and make it much easier to make Agile iteration/sprints where a release is time boxed but the less critical features are not.&lt;br /&gt;
&lt;br /&gt;
You could see the topic branches as only developer help. The commits should have the proper references to the code and properly document the changes. Therefore once the topic branch is merged into the master, the topic branch itself can be deleted, as all the commits are inserted into the master branch.&lt;br /&gt;
&lt;br /&gt;
== Using GIT during developing &amp;amp; a centralised VCS for releases ==&lt;br /&gt;
&lt;br /&gt;
You might find yourself in an environment where the boss insists on using a centralised version control like VSS or Vault for the releases, but you are keen on using GIT with its awesome branch feature.&lt;br /&gt;
&lt;br /&gt;
You would join a great deal of young developers that during their study the last years developed open source software and are very aware of the advantages of GIT. They new find themselves in this situation where they feel they have to do a step backwards.&lt;br /&gt;
&lt;br /&gt;
I think, and many online agree that the two VCS’s are not mutually exclusive. You can use GIT during the development, smoke testing or even proper testing and get all the advantages of the development freedom. When it is time for releasing, just check the code into your centralised VCS.&lt;br /&gt;
&lt;br /&gt;
== Multiple developers, multiple repositories ==&lt;br /&gt;
&lt;br /&gt;
In previous section you got familiar with staging, committing, branching and merging. All of these actions were done on the local repository.&lt;br /&gt;
&lt;br /&gt;
More than likely you are working in a team of developers or at least want a safe backup of the repository. In both cases you want to synchronise your local repository with one or more remote repositories.&lt;br /&gt;
&lt;br /&gt;
=== Create a remote backup repository  ===&lt;br /&gt;
&lt;br /&gt;
To make a backup of your repository you can either use a hosted solution or just on another piece of hardware in the network. The follow the following steps show the latter.&lt;br /&gt;
&lt;br /&gt;
In Git Gui choose menu Remote – Add. Give the backup location a name and the path. Although not mandatory, its common to give the foldername a .git extention.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image021.png]]&lt;br /&gt;
&lt;br /&gt;
Make sure you change the ‘Further Action’ from ‘Fetch Immediately’ to ‘Initialize Remote Repository and Push’, and click Add.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If you are putting a network drive as the location, make sure you use ‘//drive/dir/dir’ instead of ‘\\drive\dir\dir’. Otherwise you will have issues later on.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
What just happened in simplified terms, is that important content of the workspace .git folder is copied and links are setup between the local and the remote repository. This remote repository is often called a ‘bare repository’ is it does not have a working directory.&lt;br /&gt;
&lt;br /&gt;
After you make changes to your local repository, and you would like to update the remote repository, all you have to do is a Push. Menu: Remote – Push or (Ctrl+P);&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image022.png]]&lt;br /&gt;
&lt;br /&gt;
By default the current branch is selected as Source Branch, but you could like above select multiple (Shift or Ctrl left click) branches to be updated.&lt;br /&gt;
&lt;br /&gt;
Please note that you are pushing the whole history of commits, not just the latest state.&lt;br /&gt;
&lt;br /&gt;
== Creating a local repository from a remote repository ==&lt;br /&gt;
&lt;br /&gt;
So your mate has started to use Git in his local repository, and made a backup remote repository on the server. You have to also do some work on this project so you need a local repository.&lt;br /&gt;
&lt;br /&gt;
In Git terminology you want to clone an existing repository.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To practice this there is no reason that this would not be on the same machine (just different directory). Even the remote backup created could have been on the same local machine in its own directory.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Start Git Gui from start menu or by right mouse click on any directory that does not have a repository.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image023.png]]&lt;br /&gt;
&lt;br /&gt;
Click the Clone existing repository link.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image024.png]]&lt;br /&gt;
&lt;br /&gt;
Enter the location of the Remote repository and the NOT YET CREATED target local repository and workspace.&lt;br /&gt;
&lt;br /&gt;
Select the Full Copy, just to be sure. When you’ve worked with Git for a while feel free to experiment with the faster versions, but in the beginning you just want it to work.&lt;br /&gt;
&lt;br /&gt;
When clicked clone, navigate your explorer to the new directory and confirm that you have the full workspace, as well as a .git local repository. You also will find the remote automatically added to the ‘Remote’ menu as ‘origin’.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you added the .gitignore file to not be tracked (my mentioning it in the .gitignore file itself) it was not copied over into the cloned workspace. You probably want to copy this file manually here. It is recommended though that you do stage and commit this file into your repository.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Keeping multiple repositories synchronised ===&lt;br /&gt;
&lt;br /&gt;
In previous sections you have created a new remote repository with ‘Add remote’, and created new local repository by cloning the repository from the remote.&lt;br /&gt;
&lt;br /&gt;
We also discussed that a remote repository can be kept up-to-date with Push.&lt;br /&gt;
&lt;br /&gt;
Suppose developer 1 makes a change to a file eg the remaining WinPrint report fonts are all changed from Arial to Segoe ui. The developer stages the files, and does a commit, this saves the changes into the local repository. He then at the end of the day does a push, to update the remote repository with these changes.&lt;br /&gt;
&lt;br /&gt;
For developer  2 to retrieve these changes, two actions need to be undertaken. First the local repository needs to be updated using the menu option Remote – Fetch. Then the workspace (working tree in GIT language) needs to be updated with changes from the repository. This done by menu option Merge – Local Merge (or Ctrl+M), leaving the defaults in the merge dialog as Tracking branch.&lt;br /&gt;
&lt;br /&gt;
When an automated 3 way merge can be done, this is very simple. When however conflicts occur they are shown to the user, than then can do a proper merge. Once developer 2 is finished merging the developer 1’s changes into their code he makes sure all is committed, then pushes the changes to the remote repository.&lt;br /&gt;
&lt;br /&gt;
This sounds more complex than it is. Git also helps you with this. Basically git’s remote repositories do not allow a push, if there are un-fetched (pulled) changes. Therefore the developer would always be prompted to pull, merge, commit and then push.&lt;br /&gt;
&lt;br /&gt;
=== Local and Remote branches ===&lt;br /&gt;
&lt;br /&gt;
Local branches are not automatically pushed to the remotes. This leaves you with the freedom to use private branches for work you do not want to share.&lt;br /&gt;
&lt;br /&gt;
If you do want to collaborate on a branch, you explicitly push the branch to the remote.&lt;br /&gt;
&lt;br /&gt;
When a branch is pushed to the remote and other developers do a Fetch, they will automatically receive a reference to new remote branches, but you don’t automatically get editable copies of them (only a ‘origin/&amp;lt;branch&amp;gt;’. So if they want to contribute to the branch, they need to create a Tracking branch based on the remote branch. &lt;br /&gt;
&lt;br /&gt;
The tracking branch is to the developer like a local branch, except GIT knows the link to the remote branch, so a push will automatically update the correct remote branch.&lt;br /&gt;
In Git GUI and specifically the dialog below the wording of the labels is confusing. Where it reads ‘Tracking branch’ it should be ‘Remote branch’. After all a tracking branch is the result of the action, not the source&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image025.png]]&lt;br /&gt;
&lt;br /&gt;
So this creates a Tracking branch ‘CR5612_UpdateFontsOnReports’ (due to the ‘Match Tracking branch name’ setting), linked to the remote branch ‘origin/ CR5612_UpdateFontsOnReports’.&lt;br /&gt;
&lt;br /&gt;
So a Tracking branch is a local branch that has a direct relationship to a remote branch. If you are on a tracking branch and do a push, GIT knows what remote and branch to push to. If you do a pull, It fetches all the remote branches and automatically merges in the changes from the remote branch.&lt;br /&gt;
&lt;br /&gt;
=== Collaborating on a topic branches ===&lt;br /&gt;
Some great text on [http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project]&lt;br /&gt;
&lt;br /&gt;
== Browse repository ==&lt;br /&gt;
&lt;br /&gt;
=== Gitk ===&lt;br /&gt;
&lt;br /&gt;
Git-gui comes with a basic visualising tool gitk. It shows the commit and branch history, and the files and lines changed in these commits. It has some search facility in commit messages.&lt;br /&gt;
&lt;br /&gt;
This visual commit viewer is started from git-gui by the repository menu options ‘Visualise &amp;lt;current branch&amp;gt; History’ and ‘Visualise All Branch History’.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image026.png]]&lt;br /&gt;
&lt;br /&gt;
This does the job most of the time. But to get the most out of your carefully build version control documentation, you should have a look at git extensions. You can use git extensions exclusively, meaning you do not need any functionality of git-gui. For learning the basics of git, I believe that git-gui is an excellent way and not get lost straight away in the functionality of git extensions.&lt;br /&gt;
&lt;br /&gt;
=== Git extensions ===&lt;br /&gt;
&lt;br /&gt;
Git extensions is an active open source project. The source code is here https://github.com/gitextensions/gitextensions&lt;br /&gt;
&lt;br /&gt;
However the latest version, wrapped in a windows installer is here http://code.google.com/p/gitextensions/  this is most likely the version you want.&lt;br /&gt;
&lt;br /&gt;
It comes with a manual, that should after reading this document, be quite easy to follow. Especially chapter 3 browse repository is really good.&lt;br /&gt;
&lt;br /&gt;
==== View commit log ====&lt;br /&gt;
&lt;br /&gt;
In addition to seeing commit changes just like in gitk, you can also ctrl click any two commits to view the differences.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image027.png]]&lt;br /&gt;
&lt;br /&gt;
==== Search history ====&lt;br /&gt;
&lt;br /&gt;
Using regular expressions in commit message, author and committer.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image028.png]]&lt;br /&gt;
&lt;br /&gt;
==== Single file history ====&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image029.png]]&lt;br /&gt;
&lt;br /&gt;
==== Blame ====&lt;br /&gt;
&lt;br /&gt;
See for every line, when this was committed. Then double click to see other files of that commit.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image030.png]]&lt;br /&gt;
&lt;br /&gt;
== Tips and Tricks ==&lt;br /&gt;
&lt;br /&gt;
=== Unmodifying a modified file ===&lt;br /&gt;
&lt;br /&gt;
When you realise you don’t want to keep any changes to a file, you can unmodify it – reverting to what it looked like when you last committed (or cloned or merged etc).&lt;br /&gt;
&lt;br /&gt;
In Git Extensions this can be done several ways. One of them is in the commit dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image031.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev image032.png]]&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a file ===&lt;br /&gt;
&lt;br /&gt;
GIT is really smart. If you rename a file, it detects that a file is missing, a new file appeared and the content is (almost) the same. It just picks it up and accepts the rename of the file as a change you can commit.&lt;br /&gt;
&lt;br /&gt;
Extremely cool!&lt;br /&gt;
&lt;br /&gt;
=== Libraries used by multiple workspaces ===&lt;br /&gt;
&lt;br /&gt;
A great way to have copy of a VDF library workspace within every workspace that uses the library, while the version control helps you detect changes and merge them into the ‘local’ library.&lt;br /&gt;
&lt;br /&gt;
More details are here; [http://git-scm.com/book/en/Git-Tools-Submodules]&lt;br /&gt;
&lt;br /&gt;
=== Unstage Line from Commit ===&lt;br /&gt;
&lt;br /&gt;
Sometimes you might have done a number of changes to a file and forgot to commit these separately, while you would like to.&lt;br /&gt;
&lt;br /&gt;
In that case just stage the file, click on the file in the second panel, then in the 3rd panel where you see your code select the lines and use right mouse click to Unstage lines from commit. You could also select stage specific lines when you have not staged the file.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you cannot select the file, it just switches from Unstaged to Staged, you&#039;ve click the file icon, instead of the name. Click the name instead.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Cherry picking ===&lt;br /&gt;
&lt;br /&gt;
Apply a commit from another branch to the current branch. Only the lines changed in the particular commit will be applied.&lt;br /&gt;
&lt;br /&gt;
This is the best way to apply e.g. a bug fix, made in the master branch, onto the development branches. Or if doing consecutive commits, in a development branch you only want to pick some to be updated in this new branch.&lt;br /&gt;
&lt;br /&gt;
=== Keep uncommitted changes when changing branch (Stash) ===&lt;br /&gt;
&lt;br /&gt;
Git protects you from loosing uncommitted changes to your files when changing branches. But sometimes you are just not ready yet to commit. You might be in the middle of some programming that is not ready to compile, while you need to attend to an urgent bug.&lt;br /&gt;
&lt;br /&gt;
This function is not (yet?) in Git Gui, but is very handy. You will however find it in git extensions.&lt;br /&gt;
&lt;br /&gt;
Alternatively in the command line (right mouse cick on workspace directory, select Git Bash. A command window opens. Run the commands ‘Git add .’ and ;Git stash’.&lt;br /&gt;
&lt;br /&gt;
You notice that all changes are ‘removed’ from the working directory and you can checkout another branch. To retrieve the content of the stash, go back to the original branch and do a ‘git stash pop’&lt;br /&gt;
&lt;br /&gt;
Then just change the branch to where you need to be working on.&lt;br /&gt;
&lt;br /&gt;
=== Global .gitignore file ===&lt;br /&gt;
&lt;br /&gt;
If you are sick and tired to add the .gitignore file every time in each new workspace, you can create a global ignore file. This drawback is that this is global for all projects, not just VDF projects. This only goes up if you use GIT also for other files where you do want to track some of these files.&lt;br /&gt;
&lt;br /&gt;
In your user data directory you find your settings in a file called ‘.gitconfig’. Create another file in this directory with the name ‘.gitignore_global’, then update the .gitconfig file to add the excludes file reference as follows;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
[core]&lt;br /&gt;
	excludesfile = c:/Users/Marco/.gitignore_global&lt;br /&gt;
  ...&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also add this using the command interface and the command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git config --global core.excludesfile ~/.gitignore_global &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you are trying to rename eg .gitignore to .gitignore_global windows will bark at you as it sees the file as no name, only extension. If you however rename to .gitignore_global. (with an extra . at the end) it will bypass the validation and rename the file properly.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Setup a different merge and diff tool ===&lt;br /&gt;
&lt;br /&gt;
You can select almost any merge or diff tool. &lt;br /&gt;
&lt;br /&gt;
However the 3 way merge in beyond compare is a version only available in the Pro version. I would focus on getting to know git first. &lt;br /&gt;
&lt;br /&gt;
Channing the merge and diff tool, is easiest using a Git Extensions dialog;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image033.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image034.png]]&lt;br /&gt;
&lt;br /&gt;
After this setting, eg in file history you can use this;&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image035.png]]&lt;br /&gt;
&lt;br /&gt;
The panel of the commit changes will not be changed.&lt;br /&gt;
&lt;br /&gt;
=== Loose objects warning ===&lt;br /&gt;
&lt;br /&gt;
This warning can be really annoying and the check and possible warninig is fired each time that you start Git-gui. To stop the warning, start the Git Bash from your start menu.&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image036.png]]&lt;br /&gt;
&lt;br /&gt;
Then type the following line and press enter&lt;br /&gt;
&lt;br /&gt;
[[File:UsingGitforVdfDev_image037.png]]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt; git config --global gui.gcwarning false &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then close the git bash and the check/warning is gone.&lt;br /&gt;
&lt;br /&gt;
=== Committing PRN files, but exclude from viewing diff ===&lt;br /&gt;
&lt;br /&gt;
Earlier we suggested to add the PRN file to the list of ignored files. However it could be interesting for line numbers of user reported errors. When you do not exclude the PRN, you might find that expecially a larger file with slow down the show difference when clicked by accident.&lt;br /&gt;
&lt;br /&gt;
One trick you can do, is to tell git that a .prn file is a binary file. In that case it will not show any differences, just that they differ. This way you can stage and check in the file, and this retrieve later when required.&lt;br /&gt;
&lt;br /&gt;
Create in your work directory a file with the name ‘.gitattributes’ and content ‘*.prn binary’.&lt;br /&gt;
&lt;br /&gt;
=== Renaming of a remote ===&lt;br /&gt;
&lt;br /&gt;
If you want to rename the alias of a remote you can issue the following command&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git remote rename &amp;lt;currentName&amp;gt; &amp;lt;newName&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tagging ===&lt;br /&gt;
&lt;br /&gt;
You can like most Version control tools, tag specific points in history. Generaly this is used to mark release points (v1.0 etc).&lt;br /&gt;
&lt;br /&gt;
To create an annotated tag (so all information is stored), use the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; git tag –a &amp;lt;tagName&amp;gt; -m &amp;lt;tagMessage&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;If you forgot to place the tag and done some work already after, you can still tag that point in time. Have a look at Tagging  on [http://git-scm.com/book/en/Git-Basics-Tagging]&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
=== Removing a Recent Repository from git gui start screen ===&lt;br /&gt;
&lt;br /&gt;
When git gui is started from a directory that does not contain a repository, it will show create/clone/open options as well as &#039;Open Recent Repositories&#039;.&lt;br /&gt;
These are loaded from the global .gitconfig file.&lt;br /&gt;
&lt;br /&gt;
In my case this is on windows 7 and logged in as marcok; C:\Users\marcok\.gitconfig&lt;br /&gt;
You can remove the recentrepo entries that you no longer wish to have in this list.&lt;br /&gt;
&lt;br /&gt;
Rather than directly changing the text file you can also use the git bash line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git config --global --unset gui.recentrepo &amp;quot;C:/work/VisualLMS&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Further reading or reference material ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|Git reference; an easy to read quick reference. Although it focuses on the commands (using command line), it makes the dialogs in Git Gui easy to understand what the options mean.&lt;br /&gt;
|http://gitref.org/index.html &lt;br /&gt;
|-&lt;br /&gt;
|A beginner tutorial, most of the content is covered in this white page.&lt;br /&gt;
|http://matthew-brett.github.com/pydagogue/git_gui_windows.html&lt;br /&gt;
|-&lt;br /&gt;
|Pro Git book&lt;br /&gt;
|http://git-scm.com/book&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Configuring Source Control for Visual DataFlex&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?116-Configuring-Source-Control-for-Visual-DataFlex&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 101: The Basics&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?117-Source-Control-and-Visual-DataFlex-102-Multi-Developer-Use&lt;br /&gt;
|-&lt;br /&gt;
|DataAccess Blog: Source Control and Visual DataFlex 102: Multi-Developer Use&lt;br /&gt;
|http://support.dataaccess.com/Forums/entry.php?92-Source-Control-and-Visual-DataFlex-101-The-Basics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
If you like this article, find issues or need more explanation on any of this, please send me an email.&lt;br /&gt;
My email is m dot kuipers at internode dot on dot net&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Portal:Development_Tools&amp;diff=1665</id>
		<title>Portal:Development Tools</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Portal:Development_Tools&amp;diff=1665"/>
		<updated>2007-12-31T10:19:31Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Dataflex Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For any Dataflex Developer there are a range of tools useful for many situations.&lt;br /&gt;
&lt;br /&gt;
==Data Access Tools==&lt;br /&gt;
[[Data Access]] provide a core of development tools vital to Dataflex development.&lt;br /&gt;
*[[Visual DataFlex Studio]]&lt;br /&gt;
*[[Database Builder]]&lt;br /&gt;
*[[Database Explorer]]&lt;br /&gt;
&lt;br /&gt;
==Third Party Development Environments==&lt;br /&gt;
Other tools have been developed by the dataflex community over the years.  These tools frequently take inspiration from the larger development community and often preview features which eventually make it into the official VDF Studio.&lt;br /&gt;
*[[Eclipse]]&lt;br /&gt;
*[[The Hammer]]&lt;br /&gt;
&lt;br /&gt;
==Dataflex Libraries==&lt;br /&gt;
*[[VDFQuery]]&lt;br /&gt;
*[[StarZen&#039;s Wizard]]&lt;br /&gt;
*[[StarZen&#039;s Date form control]]&lt;br /&gt;
&lt;br /&gt;
==Other Tools==&lt;br /&gt;
*[[Version Control]]&lt;br /&gt;
*[[File Comparison]]&lt;br /&gt;
*[[Text Editors]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development Tools]]&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=VDFQuery&amp;diff=1493</id>
		<title>VDFQuery</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=VDFQuery&amp;diff=1493"/>
		<updated>2007-12-06T18:13:10Z</updated>

		<summary type="html">&lt;p&gt;Sture: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;VDFQuery is a collection of general-purpose packages that has been available since 1997. As the name implies, its main attraction is an ad hoc query tool for VDF Windows applications.&lt;br /&gt;
&lt;br /&gt;
The general purpose packages are mainly in the form of global functions, most notably for date manipulation, string manipulation and sequential input/output.&lt;br /&gt;
&lt;br /&gt;
The packages are authored mainly by Sture Andersen but over the versions many developers have contributed bug fixes and extensions, which has led to a fairly stable code base.&lt;br /&gt;
&lt;br /&gt;
The download is free for all to use. It is available from the ftp server of DAW in a number of versions. You may need to browse through the readme files to identify the best version for your version of VDF.&lt;br /&gt;
&lt;br /&gt;
[ftp://ftp.dataaccess.com/pub/products/vdf/Software/VDFQuery/ link to download]&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=VDFQuery&amp;diff=1492</id>
		<title>VDFQuery</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=VDFQuery&amp;diff=1492"/>
		<updated>2007-12-06T18:05:20Z</updated>

		<summary type="html">&lt;p&gt;Sture: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;VDFQuery is a collection of general-purpose packages that has been available since 1997. As the name implies, its main attraction is an ad hoc query tool for VDF Windows applications.&lt;br /&gt;
&lt;br /&gt;
The general purpose packages are mainly in the form of global functions, most notably for date manipulation, string manipulation and sequential input/output.&lt;br /&gt;
&lt;br /&gt;
The packages are authored mainly by Sture Andersen but over the versions many developers have contributed bug fixes and extensions, which has led to a fairly stable code base.&lt;br /&gt;
&lt;br /&gt;
The download is free for all to use. It is available from the ftp server of DAW in a number of versions. You may need to browse through the readme files to identify the best version for your version of VDF.&lt;br /&gt;
&lt;br /&gt;
Here is the link ftp://ftp.dataaccess.com/pub/products/vdf/Software/VDFQuery/&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1491</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1491"/>
		<updated>2007-12-06T17:18:22Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Backups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What would you like to see on this wiki? =&lt;br /&gt;
&lt;br /&gt;
Feel free to discuss the purpose of this wiki on this page. You are also welcome to provide feedback on how you want this site to interact with other resources (e.g the newsgroups and vdf-guidance.com) --[[User:Jka|Jka]] 23:35, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Overall goal ==&lt;br /&gt;
&lt;br /&gt;
I think VdfWiki should be a place assemble knowledge and articles in the long term (in a structured manner). &lt;br /&gt;
&lt;br /&gt;
There are some guidelines for keeping VdfWiki on the right track :[[VdfWiki_guidelines]]&lt;br /&gt;
&lt;br /&gt;
The newsgroups are still &#039;&#039;&#039;THE&#039;&#039;&#039; place to ask question and chat about current events.--[[User:Jka|Jka]] 08:28, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiki Structure Proposal==&lt;br /&gt;
I ([[User:Mikepeat|Mike]]) have just modifed the sidebar (the panel on the left of every page) to add &amp;quot;sections&amp;quot;.  (If any Sysop is not happy with this then it can be undone by editing the page [[MediaWiki:Sidebar]], or by just reverting my changes to it.)  I have used the sections as currently laid out on the main page, but I would like to propose a significant restructuring of those sections.  I will take no action until there has been reasonable discussion of it here and a consensus reached however.&lt;br /&gt;
&lt;br /&gt;
=== Overall structure (from Mike)===&lt;br /&gt;
I would propose something like the following overall structure:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;big&amp;gt;&#039;&#039;&#039;Main Page&#039;&#039;&#039;&amp;lt;/big&amp;gt; (Brief Product Overview)&lt;br /&gt;
** Product Detail&lt;br /&gt;
** &#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
*** CodeJock&lt;br /&gt;
*** OLE/COM/ActiveX&lt;br /&gt;
*** Reporting&lt;br /&gt;
** &#039;&#039;&#039;Web&#039;&#039;&#039;&lt;br /&gt;
*** AJAX&lt;br /&gt;
*** JavaScript&lt;br /&gt;
** &#039;&#039;&#039;Character Mode&#039;&#039;&#039;&lt;br /&gt;
*** DOS/Console Mode&lt;br /&gt;
*** Unix/Linux&lt;br /&gt;
** &#039;&#039;&#039;Web Services&#039;&#039;&#039;&lt;br /&gt;
*** SOA&lt;br /&gt;
** &#039;&#039;&#039;Databases&#039;&#039;&#039;&lt;br /&gt;
*** Embedded&lt;br /&gt;
*** MS SQL Server&lt;br /&gt;
*** Oracle&lt;br /&gt;
*** IBM DB/2&lt;br /&gt;
*** Pervasive&lt;br /&gt;
*** MySQL&lt;br /&gt;
*** ODBC&lt;br /&gt;
&lt;br /&gt;
(All comments and abuse will be gratefully received! [[Image:Smile-tpvgames.gif|20px]])&lt;br /&gt;
&lt;br /&gt;
--[[User:Mikepeat|Mike]] 02:46, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::I agree, the current structure on the main page isn&#039;t clear enough at the moment. [[User:Hellboy1975|Hellboy1975]] 05:37, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::: Marco here... I agree too. I&#039;d like to add some gotcha&#039;s about moving from DataFlex tables to DB2, accessed from DF32 on Linux and VDF on Win32.&lt;br /&gt;
&lt;br /&gt;
=== Data Dictionaries ===&lt;br /&gt;
::: I also want to add a topic on batch create/update/delete using DataDictionaries. Where would that live? Would it be a topic referenced from Web and Windows and Webservices, or should this be another section, &#039;Data Dictionaries&#039;?&lt;br /&gt;
::: I think a section about &#039;Data Dictionaries&#039; could be great. I&#039;ll just add one (also containing the Databases&#039; links from Mike --[[User:Jka|Jka]] 10:16, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Suggestion for topic  (Development Tools)===&lt;br /&gt;
&lt;br /&gt;
Can I suggest that we add a new section or link on the main page for general development tools and articles that sit outside of the existing Web/Windows/WS/Console categories. [[User:Hellboy1975|Hellboy1975]] 00:07, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Sounds perfectly sensible to me... &amp;quot;Other&amp;quot; as a general catch-all, or &amp;quot;Other Tools&amp;quot;: a bit more specific, but then we might have issues with things that fell outside that &#039;&#039;and&#039;&#039; our existing sections.  --[[User:Mikepeat|Mike]] 00:14, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:: I am OK with a &amp;quot;tools&amp;quot; section. We can still lay down the law in that page :P The trick is to create a separate page for each tool we want to describe - and keep the external links down to a minimum (this should make it easier to keep track of the content on the page). I think the title &amp;quot;Development tools&amp;quot;  could work.  articles not related to these sections can be attached to a specific user page - we should try not to clutter the frontpage and 1st level navigation too much. --[[User:Jka|Jka]] 08:15, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Discussing cookbooks == &lt;br /&gt;
&lt;br /&gt;
::That structure looks reasonable. My original idea with the &amp;quot;cookbooks&amp;quot; was to put a list of howto-do-stuffs in there. E.g a list of recipes in them - and have the &amp;quot;other&amp;quot; page contain the description. E.g &amp;quot;Windows&amp;quot; contains the description and &amp;quot;Windows cookbook&amp;quot; contains the recipes. I&#039;ve found that the early contributions have been about &amp;quot;howto do stuff&amp;quot; (e.g something that should go in the cookbook). I can see now , that there should be no distinction between e.g &amp;quot;Windows&amp;quot; and &amp;quot;Windows cookbook&amp;quot; - they should be the same page. --[[User:Jka|Jka]] 09:38, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::On the &amp;quot;&#039;&#039;cookbooks&#039;&#039;&amp;quot; issue... perhaps using &amp;quot;Categories&amp;quot; might be a help.  This is not a subject I understand well enough (yet!), but it seems to me that it might add a multi-dimentional element to how articles are arranged and accessed, so that they can be come at from more than one direction (don&#039;t know how yet - research needed!). I think the original idea had merit - that some articles will be of a &amp;quot;howto&amp;quot; nature while others will be more descriptive, others discursive and still others umm... complaining (whining? - &amp;quot;&#039;&#039;why don&#039;t DAW do more with the Linux product?&#039;&#039;&amp;quot; &amp;lt;g&amp;gt;).  In a big Wiki like Wikipedia, searching is usually the only way to start, but with our rather less ambitious subject matter, good organisation might lead people quickly to what they need (even if they didn&#039;t know they needed it and didn&#039;t know it was there).  --[[User:Mikepeat|Mike]] 11:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::Yes . The need for having a &amp;quot;cookbook&amp;quot; can be adressed by having a category for all the different recipees. I think we should proceed in this direction . I removed the cookbook links from the frontpage and the navigation. --[[User:Jka|Jka]] 20:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Style Guide?==&lt;br /&gt;
At the suggestion of [[User:Hellboy1975|Hellboy1975]] (what is that all about anyway, Matt? &amp;lt;g&amp;gt;) - see [[Talk:Web_Service_Basics]] - I have been changing the colour I am using to emphasise stuff - in this case (for now anyway) changing &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;blue&amp;lt;/span&amp;gt; to &amp;lt;span style=&amp;quot;color:midnightblue;&amp;quot;&amp;gt;midnightblue&amp;lt;/span&amp;gt; to avoid confusion with hypertext links (I&#039;m not sure that is enough - I think I&#039;ve just made that text look like visited links).&lt;br /&gt;
&lt;br /&gt;
However it would have saved me this effort if I&#039;d had a guideline on what colours etc. to use from the start.  I think we need to evolve some kind of consensus &amp;quot;Style Guide&amp;quot; which would help us all use a nice, clear, consistent style for various things. It would be bound to be an evolving document, as we are unlikely to think of everything on day one and will have to be flexible and inclusive rather than prescriptive, but the sooner we start laying it down, the less time will be wasted later fixing stuff up that doesn&#039;t match or looks ugly.  (&#039;&#039;I did experiment with using a template - [[Template:Colorise]] - but couldn&#039;t get what I wanted to work: the amount of time I can afford to devote to learning the WikiMedia Template [http://en.wikipedia.org/wiki/Domain-specific_programming_language DSL] is strictly limited!&#039;&#039; &amp;lt;g&amp;gt;) [[User:Mikepeat|Mike]] 11:03, 22 November 2007 (CET)&lt;br /&gt;
:I should have said &#039;&#039;pr&amp;lt;u&amp;gt;o&amp;lt;/u&amp;gt;scriptive&#039;&#039; above - it would indeed be &#039;&#039;pr&amp;lt;u&amp;gt;e&amp;lt;/u&amp;gt;scriptive&#039;&#039;, by intent! [[User:Mikepeat|Mike]] 14:54, 22 November 2007 (CET)&lt;br /&gt;
:Something like the Wikipedia [http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style Manual of Style] is always a good place to start.  Another place to look for examples are in some of the programming manuals on Wikibooks.  Here&#039;s one of the pages in the C++ manual for instance. [http://en.wikibooks.org/wiki/C%2B%2B_Programming/Variables] [[User:Hellboy1975|Hellboy1975]] 00:20, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Opensource/community libraries==&lt;br /&gt;
&lt;br /&gt;
I understand that there is a [[Data Access Worldwide|DAW]] community site in the works. please consider this when describing available available [[Open Source]] [[Visual DataFlex]] libraries. --[[User:Jka|Jka]] 00:49, 1 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Main Page ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m sure you&#039;ve all noticed by now I&#039;ve made a bit of a change to the front page.  It&#039;s more or less the same as before, just with a bit more information for users who are a bit new to the whole wiki thing.  What do you guys think? [[User:Hellboy1975|Hellboy1975]] 05:21, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Looks good Matt... you might consider mentioning [[Special:Categories]] in addition to the [[Category Index]], and maybe adding the [[Category Index]] to the &amp;quot;navigation&amp;quot; pane (edit [[MediaWiki:Sidebar]]).  ...And be careful who you say doesn&#039;t bite: &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039; haven&#039;t had any coffee yet!  [[Image:Smile.gif]]&lt;br /&gt;
&lt;br /&gt;
:I think we probably need a single person (oops: that would be you... &#039;&#039;sucker!&#039;&#039; You have only yourself to blame!) to head-up work on structure, accessibility, cross-indexing and the like. We have made a big step forward with Categories, giving us the three tools you mention: Structure, Search and Categories... &#039;&#039;now&#039;&#039; let&#039;s talk &#039;&#039;&#039;&#039;&#039;namespaces!&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
::Given that [[User:Hellboy1975|Matt]] has proclaimed himself &#039;category enforcer&#039; - then I think he could lead the overall structure on the wiki ;) --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::That&#039;s fine, I&#039;m happy to take on the roll of structuring the site for now.  My first goal is to make the main page a bit more accessable, and then each of the main categories (Web, Windows, Character Mode, DD&#039;s and Development Tools).  I guess my plan with these pages at the moment is to make the more structures, in much the same way as the Main Page on Wikipedia [[User:Hellboy1975|Hellboy1975]] 00:25, 6 December 2007 (CET)&lt;br /&gt;
::::Take a look at [[Main_Page_1]] for a preview [[User:Hellboy1975|Hellboy1975]] 01:53, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::::Like it Matt! &#039;&#039;Very&#039;&#039; nice. Keep up the good work!  --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET)&lt;br /&gt;
:::::Awesome effort :) You rock  --[[User:Jka|Jka]] 10:06, 6 December 2007 (CET)&lt;br /&gt;
:::::So... when are you going to make that live? I can&#039;t believe anybody is going to think we should &#039;&#039;not&#039;&#039; go with it... it is just a question of fleshing out some of those &amp;quot;wanted&amp;quot; links first IMO. --[[User:Mikepeat|Mike]] 10:22, 6 December 2007 (CET)&lt;br /&gt;
::::::Still got a couple of little things I want to do, mainly including some more info from the original main page.  All things going well sometime tomorrow or over the weekend. [[User:Hellboy1975|Hellboy1975]] 13:08, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Actually, namespaces require modification of the LocalSettings.php file on the server I think, so adding them is non-trivial (i.e. down to somebody with OS access to the server: Jacob, Johan or Sture, etc.) and thus they are a blunter and less flexible tool than Categories, but worth thinking about, in a background sort of way.&lt;br /&gt;
&lt;br /&gt;
::Let&#039;s do some experimenting with namespaces when we have a backup copy of VDFWiki running on a separate machine.  --[[User:Jka|Jka]] 10:10, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Backups==&lt;br /&gt;
(Seem to have spawned a different thread here, so... [[Image:Smile.jpg]] --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
I have two other MediaWikis set up that I can play/practice on (but they are hosted on &#039;&#039;real&#039;&#039; operating systems [[Image:Smile.gif]]), and if you are going to do that stuff I suggest you set one up for yourself, if you have not already - the software is a snap to set up, at least on Linux. Actually, several of us might consider doing that just to take periodic back-up copies of VdfWiki onto... just a thought.&lt;br /&gt;
&lt;br /&gt;
:Good idea to do multiple backups. Sture and I have been talking about uploading the content to &#039;somebody&#039;s ftp server - to have it duplicated. is that &#039;somebody&#039; you , Mike? --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::It &#039;&#039;could&#039;&#039; be. Right now I have MediaWikis running on two Linux boxen - one in the office (Ububtu server) and one at home (Fedora). I realise that you guys are running under WinDoze/IIS - would that cause any issues do you think? We have a public, hosted FTP server that I &#039;&#039;should&#039;&#039; be able to configure access to for you, so we are a possibility as a backup, but I think DAW or DAE are probably a better bet, both from a technical and an administrative PoV. If needed, I could act as &amp;quot;&#039;&#039;third string&#039;&#039;&amp;quot; to a DAW/DAE &amp;quot;&#039;&#039;second string&#039;&#039;&amp;quot;, in that you could dump stuff nightly to my FTP server (and I would then ignore it), where, in the event of an emergency, it could be restored from to a MediaWiki I could set up specifically for it (on another Fedora machine that I have spare in the office).  If I set up VdfWiki on that, it would be sitting ready to go from backup...  But I&#039;d explore the Data Access options first I think.  --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::Or... we also have our [http://www.unicorninterglobal.com web site] hosted, with the ability to host others (we do host a couple of others there). I have work to do in moving that all to a new machine on the hosting site (I&#039;m just too overloaded to contemplate it ATM), but once I&#039;ve done that we could offer a WinDoze compatible alternative hosting platform as a backup (primary or otherwise). --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::: DAE has agreed to set up an ftp account for our purpose. Its content will be part of their backup sequence (cool). Once we get it [[User:Jka|Jacob]] will upload a vdfwiki image and we&#039;ll see if it runs easily at your server(s). --[[User:Sture|Sture]] 18:16, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Common Editing Mistakes==&lt;br /&gt;
Something to watch for (and maybe warn against): I had occasion last night to move an article ([[Add Workspace Parameter]]) by [[User:Peter Brooks|Peter Brooks]] which he had put on the [[:Category:How To]] page; I moved it off onto its own page, but it is an easy mistake to make: just go to a Category and start editing. --[[User:Mikepeat|Mike]] 11:01, 5 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1490</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1490"/>
		<updated>2007-12-06T17:16:49Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Backups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What would you like to see on this wiki? =&lt;br /&gt;
&lt;br /&gt;
Feel free to discuss the purpose of this wiki on this page. You are also welcome to provide feedback on how you want this site to interact with other resources (e.g the newsgroups and vdf-guidance.com) --[[User:Jka|Jka]] 23:35, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Overall goal ==&lt;br /&gt;
&lt;br /&gt;
I think VdfWiki should be a place assemble knowledge and articles in the long term (in a structured manner). &lt;br /&gt;
&lt;br /&gt;
There are some guidelines for keeping VdfWiki on the right track :[[VdfWiki_guidelines]]&lt;br /&gt;
&lt;br /&gt;
The newsgroups are still &#039;&#039;&#039;THE&#039;&#039;&#039; place to ask question and chat about current events.--[[User:Jka|Jka]] 08:28, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiki Structure Proposal==&lt;br /&gt;
I ([[User:Mikepeat|Mike]]) have just modifed the sidebar (the panel on the left of every page) to add &amp;quot;sections&amp;quot;.  (If any Sysop is not happy with this then it can be undone by editing the page [[MediaWiki:Sidebar]], or by just reverting my changes to it.)  I have used the sections as currently laid out on the main page, but I would like to propose a significant restructuring of those sections.  I will take no action until there has been reasonable discussion of it here and a consensus reached however.&lt;br /&gt;
&lt;br /&gt;
=== Overall structure (from Mike)===&lt;br /&gt;
I would propose something like the following overall structure:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;big&amp;gt;&#039;&#039;&#039;Main Page&#039;&#039;&#039;&amp;lt;/big&amp;gt; (Brief Product Overview)&lt;br /&gt;
** Product Detail&lt;br /&gt;
** &#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
*** CodeJock&lt;br /&gt;
*** OLE/COM/ActiveX&lt;br /&gt;
*** Reporting&lt;br /&gt;
** &#039;&#039;&#039;Web&#039;&#039;&#039;&lt;br /&gt;
*** AJAX&lt;br /&gt;
*** JavaScript&lt;br /&gt;
** &#039;&#039;&#039;Character Mode&#039;&#039;&#039;&lt;br /&gt;
*** DOS/Console Mode&lt;br /&gt;
*** Unix/Linux&lt;br /&gt;
** &#039;&#039;&#039;Web Services&#039;&#039;&#039;&lt;br /&gt;
*** SOA&lt;br /&gt;
** &#039;&#039;&#039;Databases&#039;&#039;&#039;&lt;br /&gt;
*** Embedded&lt;br /&gt;
*** MS SQL Server&lt;br /&gt;
*** Oracle&lt;br /&gt;
*** IBM DB/2&lt;br /&gt;
*** Pervasive&lt;br /&gt;
*** MySQL&lt;br /&gt;
*** ODBC&lt;br /&gt;
&lt;br /&gt;
(All comments and abuse will be gratefully received! [[Image:Smile-tpvgames.gif|20px]])&lt;br /&gt;
&lt;br /&gt;
--[[User:Mikepeat|Mike]] 02:46, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::I agree, the current structure on the main page isn&#039;t clear enough at the moment. [[User:Hellboy1975|Hellboy1975]] 05:37, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::: Marco here... I agree too. I&#039;d like to add some gotcha&#039;s about moving from DataFlex tables to DB2, accessed from DF32 on Linux and VDF on Win32.&lt;br /&gt;
&lt;br /&gt;
=== Data Dictionaries ===&lt;br /&gt;
::: I also want to add a topic on batch create/update/delete using DataDictionaries. Where would that live? Would it be a topic referenced from Web and Windows and Webservices, or should this be another section, &#039;Data Dictionaries&#039;?&lt;br /&gt;
::: I think a section about &#039;Data Dictionaries&#039; could be great. I&#039;ll just add one (also containing the Databases&#039; links from Mike --[[User:Jka|Jka]] 10:16, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Suggestion for topic  (Development Tools)===&lt;br /&gt;
&lt;br /&gt;
Can I suggest that we add a new section or link on the main page for general development tools and articles that sit outside of the existing Web/Windows/WS/Console categories. [[User:Hellboy1975|Hellboy1975]] 00:07, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Sounds perfectly sensible to me... &amp;quot;Other&amp;quot; as a general catch-all, or &amp;quot;Other Tools&amp;quot;: a bit more specific, but then we might have issues with things that fell outside that &#039;&#039;and&#039;&#039; our existing sections.  --[[User:Mikepeat|Mike]] 00:14, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:: I am OK with a &amp;quot;tools&amp;quot; section. We can still lay down the law in that page :P The trick is to create a separate page for each tool we want to describe - and keep the external links down to a minimum (this should make it easier to keep track of the content on the page). I think the title &amp;quot;Development tools&amp;quot;  could work.  articles not related to these sections can be attached to a specific user page - we should try not to clutter the frontpage and 1st level navigation too much. --[[User:Jka|Jka]] 08:15, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Discussing cookbooks == &lt;br /&gt;
&lt;br /&gt;
::That structure looks reasonable. My original idea with the &amp;quot;cookbooks&amp;quot; was to put a list of howto-do-stuffs in there. E.g a list of recipes in them - and have the &amp;quot;other&amp;quot; page contain the description. E.g &amp;quot;Windows&amp;quot; contains the description and &amp;quot;Windows cookbook&amp;quot; contains the recipes. I&#039;ve found that the early contributions have been about &amp;quot;howto do stuff&amp;quot; (e.g something that should go in the cookbook). I can see now , that there should be no distinction between e.g &amp;quot;Windows&amp;quot; and &amp;quot;Windows cookbook&amp;quot; - they should be the same page. --[[User:Jka|Jka]] 09:38, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::On the &amp;quot;&#039;&#039;cookbooks&#039;&#039;&amp;quot; issue... perhaps using &amp;quot;Categories&amp;quot; might be a help.  This is not a subject I understand well enough (yet!), but it seems to me that it might add a multi-dimentional element to how articles are arranged and accessed, so that they can be come at from more than one direction (don&#039;t know how yet - research needed!). I think the original idea had merit - that some articles will be of a &amp;quot;howto&amp;quot; nature while others will be more descriptive, others discursive and still others umm... complaining (whining? - &amp;quot;&#039;&#039;why don&#039;t DAW do more with the Linux product?&#039;&#039;&amp;quot; &amp;lt;g&amp;gt;).  In a big Wiki like Wikipedia, searching is usually the only way to start, but with our rather less ambitious subject matter, good organisation might lead people quickly to what they need (even if they didn&#039;t know they needed it and didn&#039;t know it was there).  --[[User:Mikepeat|Mike]] 11:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::Yes . The need for having a &amp;quot;cookbook&amp;quot; can be adressed by having a category for all the different recipees. I think we should proceed in this direction . I removed the cookbook links from the frontpage and the navigation. --[[User:Jka|Jka]] 20:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Style Guide?==&lt;br /&gt;
At the suggestion of [[User:Hellboy1975|Hellboy1975]] (what is that all about anyway, Matt? &amp;lt;g&amp;gt;) - see [[Talk:Web_Service_Basics]] - I have been changing the colour I am using to emphasise stuff - in this case (for now anyway) changing &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;blue&amp;lt;/span&amp;gt; to &amp;lt;span style=&amp;quot;color:midnightblue;&amp;quot;&amp;gt;midnightblue&amp;lt;/span&amp;gt; to avoid confusion with hypertext links (I&#039;m not sure that is enough - I think I&#039;ve just made that text look like visited links).&lt;br /&gt;
&lt;br /&gt;
However it would have saved me this effort if I&#039;d had a guideline on what colours etc. to use from the start.  I think we need to evolve some kind of consensus &amp;quot;Style Guide&amp;quot; which would help us all use a nice, clear, consistent style for various things. It would be bound to be an evolving document, as we are unlikely to think of everything on day one and will have to be flexible and inclusive rather than prescriptive, but the sooner we start laying it down, the less time will be wasted later fixing stuff up that doesn&#039;t match or looks ugly.  (&#039;&#039;I did experiment with using a template - [[Template:Colorise]] - but couldn&#039;t get what I wanted to work: the amount of time I can afford to devote to learning the WikiMedia Template [http://en.wikipedia.org/wiki/Domain-specific_programming_language DSL] is strictly limited!&#039;&#039; &amp;lt;g&amp;gt;) [[User:Mikepeat|Mike]] 11:03, 22 November 2007 (CET)&lt;br /&gt;
:I should have said &#039;&#039;pr&amp;lt;u&amp;gt;o&amp;lt;/u&amp;gt;scriptive&#039;&#039; above - it would indeed be &#039;&#039;pr&amp;lt;u&amp;gt;e&amp;lt;/u&amp;gt;scriptive&#039;&#039;, by intent! [[User:Mikepeat|Mike]] 14:54, 22 November 2007 (CET)&lt;br /&gt;
:Something like the Wikipedia [http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style Manual of Style] is always a good place to start.  Another place to look for examples are in some of the programming manuals on Wikibooks.  Here&#039;s one of the pages in the C++ manual for instance. [http://en.wikibooks.org/wiki/C%2B%2B_Programming/Variables] [[User:Hellboy1975|Hellboy1975]] 00:20, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Opensource/community libraries==&lt;br /&gt;
&lt;br /&gt;
I understand that there is a [[Data Access Worldwide|DAW]] community site in the works. please consider this when describing available available [[Open Source]] [[Visual DataFlex]] libraries. --[[User:Jka|Jka]] 00:49, 1 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Main Page ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m sure you&#039;ve all noticed by now I&#039;ve made a bit of a change to the front page.  It&#039;s more or less the same as before, just with a bit more information for users who are a bit new to the whole wiki thing.  What do you guys think? [[User:Hellboy1975|Hellboy1975]] 05:21, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Looks good Matt... you might consider mentioning [[Special:Categories]] in addition to the [[Category Index]], and maybe adding the [[Category Index]] to the &amp;quot;navigation&amp;quot; pane (edit [[MediaWiki:Sidebar]]).  ...And be careful who you say doesn&#039;t bite: &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039; haven&#039;t had any coffee yet!  [[Image:Smile.gif]]&lt;br /&gt;
&lt;br /&gt;
:I think we probably need a single person (oops: that would be you... &#039;&#039;sucker!&#039;&#039; You have only yourself to blame!) to head-up work on structure, accessibility, cross-indexing and the like. We have made a big step forward with Categories, giving us the three tools you mention: Structure, Search and Categories... &#039;&#039;now&#039;&#039; let&#039;s talk &#039;&#039;&#039;&#039;&#039;namespaces!&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
::Given that [[User:Hellboy1975|Matt]] has proclaimed himself &#039;category enforcer&#039; - then I think he could lead the overall structure on the wiki ;) --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::That&#039;s fine, I&#039;m happy to take on the roll of structuring the site for now.  My first goal is to make the main page a bit more accessable, and then each of the main categories (Web, Windows, Character Mode, DD&#039;s and Development Tools).  I guess my plan with these pages at the moment is to make the more structures, in much the same way as the Main Page on Wikipedia [[User:Hellboy1975|Hellboy1975]] 00:25, 6 December 2007 (CET)&lt;br /&gt;
::::Take a look at [[Main_Page_1]] for a preview [[User:Hellboy1975|Hellboy1975]] 01:53, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::::Like it Matt! &#039;&#039;Very&#039;&#039; nice. Keep up the good work!  --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET)&lt;br /&gt;
:::::Awesome effort :) You rock  --[[User:Jka|Jka]] 10:06, 6 December 2007 (CET)&lt;br /&gt;
:::::So... when are you going to make that live? I can&#039;t believe anybody is going to think we should &#039;&#039;not&#039;&#039; go with it... it is just a question of fleshing out some of those &amp;quot;wanted&amp;quot; links first IMO. --[[User:Mikepeat|Mike]] 10:22, 6 December 2007 (CET)&lt;br /&gt;
::::::Still got a couple of little things I want to do, mainly including some more info from the original main page.  All things going well sometime tomorrow or over the weekend. [[User:Hellboy1975|Hellboy1975]] 13:08, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Actually, namespaces require modification of the LocalSettings.php file on the server I think, so adding them is non-trivial (i.e. down to somebody with OS access to the server: Jacob, Johan or Sture, etc.) and thus they are a blunter and less flexible tool than Categories, but worth thinking about, in a background sort of way.&lt;br /&gt;
&lt;br /&gt;
::Let&#039;s do some experimenting with namespaces when we have a backup copy of VDFWiki running on a separate machine.  --[[User:Jka|Jka]] 10:10, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Backups==&lt;br /&gt;
(Seem to have spawned a different thread here, so... [[Image:Smile.jpg]] --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
I have two other MediaWikis set up that I can play/practice on (but they are hosted on &#039;&#039;real&#039;&#039; operating systems [[Image:Smile.gif]]), and if you are going to do that stuff I suggest you set one up for yourself, if you have not already - the software is a snap to set up, at least on Linux. Actually, several of us might consider doing that just to take periodic back-up copies of VdfWiki onto... just a thought.&lt;br /&gt;
&lt;br /&gt;
:Good idea to do multiple backups. Sture and I have been talking about uploading the content to &#039;somebody&#039;s ftp server - to have it duplicated. is that &#039;somebody&#039; you , Mike? --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::It &#039;&#039;could&#039;&#039; be. Right now I have MediaWikis running on two Linux boxen - one in the office (Ububtu server) and one at home (Fedora). I realise that you guys are running under WinDoze/IIS - would that cause any issues do you think? We have a public, hosted FTP server that I &#039;&#039;should&#039;&#039; be able to configure access to for you, so we are a possibility as a backup, but I think DAW or DAE are probably a better bet, both from a technical and an administrative PoV. If needed, I could act as &amp;quot;&#039;&#039;third string&#039;&#039;&amp;quot; to a DAW/DAE &amp;quot;&#039;&#039;second string&#039;&#039;&amp;quot;, in that you could dump stuff nightly to my FTP server (and I would then ignore it), where, in the event of an emergency, it could be restored from to a MediaWiki I could set up specifically for it (on another Fedora machine that I have spare in the office).  If I set up VdfWiki on that, it would be sitting ready to go from backup...  But I&#039;d explore the Data Access options first I think.  --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::Or... we also have our [http://www.unicorninterglobal.com web site] hosted, with the ability to host others (we do host a couple of others there). I have work to do in moving that all to a new machine on the hosting site (I&#039;m just too overloaded to contemplate it ATM), but once I&#039;ve done that we could offer a WinDoze compatible alternative hosting platform as a backup (primary or otherwise). --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::: DAE has agreed to set up an ftp account for our purpose. Its content will be part of their backup sequence (cool). Once we get it [[User:Jka|Jacob]] will upload a vdfwiki image and you can experiment with your servers. --[[User:Sture|Sture]] 18:16, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Common Editing Mistakes==&lt;br /&gt;
Something to watch for (and maybe warn against): I had occasion last night to move an article ([[Add Workspace Parameter]]) by [[User:Peter Brooks|Peter Brooks]] which he had put on the [[:Category:How To]] page; I moved it off onto its own page, but it is an easy mistake to make: just go to a Category and start editing. --[[User:Mikepeat|Mike]] 11:01, 5 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1489</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1489"/>
		<updated>2007-12-06T17:16:33Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Backups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What would you like to see on this wiki? =&lt;br /&gt;
&lt;br /&gt;
Feel free to discuss the purpose of this wiki on this page. You are also welcome to provide feedback on how you want this site to interact with other resources (e.g the newsgroups and vdf-guidance.com) --[[User:Jka|Jka]] 23:35, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Overall goal ==&lt;br /&gt;
&lt;br /&gt;
I think VdfWiki should be a place assemble knowledge and articles in the long term (in a structured manner). &lt;br /&gt;
&lt;br /&gt;
There are some guidelines for keeping VdfWiki on the right track :[[VdfWiki_guidelines]]&lt;br /&gt;
&lt;br /&gt;
The newsgroups are still &#039;&#039;&#039;THE&#039;&#039;&#039; place to ask question and chat about current events.--[[User:Jka|Jka]] 08:28, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiki Structure Proposal==&lt;br /&gt;
I ([[User:Mikepeat|Mike]]) have just modifed the sidebar (the panel on the left of every page) to add &amp;quot;sections&amp;quot;.  (If any Sysop is not happy with this then it can be undone by editing the page [[MediaWiki:Sidebar]], or by just reverting my changes to it.)  I have used the sections as currently laid out on the main page, but I would like to propose a significant restructuring of those sections.  I will take no action until there has been reasonable discussion of it here and a consensus reached however.&lt;br /&gt;
&lt;br /&gt;
=== Overall structure (from Mike)===&lt;br /&gt;
I would propose something like the following overall structure:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;big&amp;gt;&#039;&#039;&#039;Main Page&#039;&#039;&#039;&amp;lt;/big&amp;gt; (Brief Product Overview)&lt;br /&gt;
** Product Detail&lt;br /&gt;
** &#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
*** CodeJock&lt;br /&gt;
*** OLE/COM/ActiveX&lt;br /&gt;
*** Reporting&lt;br /&gt;
** &#039;&#039;&#039;Web&#039;&#039;&#039;&lt;br /&gt;
*** AJAX&lt;br /&gt;
*** JavaScript&lt;br /&gt;
** &#039;&#039;&#039;Character Mode&#039;&#039;&#039;&lt;br /&gt;
*** DOS/Console Mode&lt;br /&gt;
*** Unix/Linux&lt;br /&gt;
** &#039;&#039;&#039;Web Services&#039;&#039;&#039;&lt;br /&gt;
*** SOA&lt;br /&gt;
** &#039;&#039;&#039;Databases&#039;&#039;&#039;&lt;br /&gt;
*** Embedded&lt;br /&gt;
*** MS SQL Server&lt;br /&gt;
*** Oracle&lt;br /&gt;
*** IBM DB/2&lt;br /&gt;
*** Pervasive&lt;br /&gt;
*** MySQL&lt;br /&gt;
*** ODBC&lt;br /&gt;
&lt;br /&gt;
(All comments and abuse will be gratefully received! [[Image:Smile-tpvgames.gif|20px]])&lt;br /&gt;
&lt;br /&gt;
--[[User:Mikepeat|Mike]] 02:46, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::I agree, the current structure on the main page isn&#039;t clear enough at the moment. [[User:Hellboy1975|Hellboy1975]] 05:37, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::: Marco here... I agree too. I&#039;d like to add some gotcha&#039;s about moving from DataFlex tables to DB2, accessed from DF32 on Linux and VDF on Win32.&lt;br /&gt;
&lt;br /&gt;
=== Data Dictionaries ===&lt;br /&gt;
::: I also want to add a topic on batch create/update/delete using DataDictionaries. Where would that live? Would it be a topic referenced from Web and Windows and Webservices, or should this be another section, &#039;Data Dictionaries&#039;?&lt;br /&gt;
::: I think a section about &#039;Data Dictionaries&#039; could be great. I&#039;ll just add one (also containing the Databases&#039; links from Mike --[[User:Jka|Jka]] 10:16, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Suggestion for topic  (Development Tools)===&lt;br /&gt;
&lt;br /&gt;
Can I suggest that we add a new section or link on the main page for general development tools and articles that sit outside of the existing Web/Windows/WS/Console categories. [[User:Hellboy1975|Hellboy1975]] 00:07, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Sounds perfectly sensible to me... &amp;quot;Other&amp;quot; as a general catch-all, or &amp;quot;Other Tools&amp;quot;: a bit more specific, but then we might have issues with things that fell outside that &#039;&#039;and&#039;&#039; our existing sections.  --[[User:Mikepeat|Mike]] 00:14, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:: I am OK with a &amp;quot;tools&amp;quot; section. We can still lay down the law in that page :P The trick is to create a separate page for each tool we want to describe - and keep the external links down to a minimum (this should make it easier to keep track of the content on the page). I think the title &amp;quot;Development tools&amp;quot;  could work.  articles not related to these sections can be attached to a specific user page - we should try not to clutter the frontpage and 1st level navigation too much. --[[User:Jka|Jka]] 08:15, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Discussing cookbooks == &lt;br /&gt;
&lt;br /&gt;
::That structure looks reasonable. My original idea with the &amp;quot;cookbooks&amp;quot; was to put a list of howto-do-stuffs in there. E.g a list of recipes in them - and have the &amp;quot;other&amp;quot; page contain the description. E.g &amp;quot;Windows&amp;quot; contains the description and &amp;quot;Windows cookbook&amp;quot; contains the recipes. I&#039;ve found that the early contributions have been about &amp;quot;howto do stuff&amp;quot; (e.g something that should go in the cookbook). I can see now , that there should be no distinction between e.g &amp;quot;Windows&amp;quot; and &amp;quot;Windows cookbook&amp;quot; - they should be the same page. --[[User:Jka|Jka]] 09:38, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::On the &amp;quot;&#039;&#039;cookbooks&#039;&#039;&amp;quot; issue... perhaps using &amp;quot;Categories&amp;quot; might be a help.  This is not a subject I understand well enough (yet!), but it seems to me that it might add a multi-dimentional element to how articles are arranged and accessed, so that they can be come at from more than one direction (don&#039;t know how yet - research needed!). I think the original idea had merit - that some articles will be of a &amp;quot;howto&amp;quot; nature while others will be more descriptive, others discursive and still others umm... complaining (whining? - &amp;quot;&#039;&#039;why don&#039;t DAW do more with the Linux product?&#039;&#039;&amp;quot; &amp;lt;g&amp;gt;).  In a big Wiki like Wikipedia, searching is usually the only way to start, but with our rather less ambitious subject matter, good organisation might lead people quickly to what they need (even if they didn&#039;t know they needed it and didn&#039;t know it was there).  --[[User:Mikepeat|Mike]] 11:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::Yes . The need for having a &amp;quot;cookbook&amp;quot; can be adressed by having a category for all the different recipees. I think we should proceed in this direction . I removed the cookbook links from the frontpage and the navigation. --[[User:Jka|Jka]] 20:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Style Guide?==&lt;br /&gt;
At the suggestion of [[User:Hellboy1975|Hellboy1975]] (what is that all about anyway, Matt? &amp;lt;g&amp;gt;) - see [[Talk:Web_Service_Basics]] - I have been changing the colour I am using to emphasise stuff - in this case (for now anyway) changing &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;blue&amp;lt;/span&amp;gt; to &amp;lt;span style=&amp;quot;color:midnightblue;&amp;quot;&amp;gt;midnightblue&amp;lt;/span&amp;gt; to avoid confusion with hypertext links (I&#039;m not sure that is enough - I think I&#039;ve just made that text look like visited links).&lt;br /&gt;
&lt;br /&gt;
However it would have saved me this effort if I&#039;d had a guideline on what colours etc. to use from the start.  I think we need to evolve some kind of consensus &amp;quot;Style Guide&amp;quot; which would help us all use a nice, clear, consistent style for various things. It would be bound to be an evolving document, as we are unlikely to think of everything on day one and will have to be flexible and inclusive rather than prescriptive, but the sooner we start laying it down, the less time will be wasted later fixing stuff up that doesn&#039;t match or looks ugly.  (&#039;&#039;I did experiment with using a template - [[Template:Colorise]] - but couldn&#039;t get what I wanted to work: the amount of time I can afford to devote to learning the WikiMedia Template [http://en.wikipedia.org/wiki/Domain-specific_programming_language DSL] is strictly limited!&#039;&#039; &amp;lt;g&amp;gt;) [[User:Mikepeat|Mike]] 11:03, 22 November 2007 (CET)&lt;br /&gt;
:I should have said &#039;&#039;pr&amp;lt;u&amp;gt;o&amp;lt;/u&amp;gt;scriptive&#039;&#039; above - it would indeed be &#039;&#039;pr&amp;lt;u&amp;gt;e&amp;lt;/u&amp;gt;scriptive&#039;&#039;, by intent! [[User:Mikepeat|Mike]] 14:54, 22 November 2007 (CET)&lt;br /&gt;
:Something like the Wikipedia [http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style Manual of Style] is always a good place to start.  Another place to look for examples are in some of the programming manuals on Wikibooks.  Here&#039;s one of the pages in the C++ manual for instance. [http://en.wikibooks.org/wiki/C%2B%2B_Programming/Variables] [[User:Hellboy1975|Hellboy1975]] 00:20, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Opensource/community libraries==&lt;br /&gt;
&lt;br /&gt;
I understand that there is a [[Data Access Worldwide|DAW]] community site in the works. please consider this when describing available available [[Open Source]] [[Visual DataFlex]] libraries. --[[User:Jka|Jka]] 00:49, 1 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Main Page ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m sure you&#039;ve all noticed by now I&#039;ve made a bit of a change to the front page.  It&#039;s more or less the same as before, just with a bit more information for users who are a bit new to the whole wiki thing.  What do you guys think? [[User:Hellboy1975|Hellboy1975]] 05:21, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Looks good Matt... you might consider mentioning [[Special:Categories]] in addition to the [[Category Index]], and maybe adding the [[Category Index]] to the &amp;quot;navigation&amp;quot; pane (edit [[MediaWiki:Sidebar]]).  ...And be careful who you say doesn&#039;t bite: &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039; haven&#039;t had any coffee yet!  [[Image:Smile.gif]]&lt;br /&gt;
&lt;br /&gt;
:I think we probably need a single person (oops: that would be you... &#039;&#039;sucker!&#039;&#039; You have only yourself to blame!) to head-up work on structure, accessibility, cross-indexing and the like. We have made a big step forward with Categories, giving us the three tools you mention: Structure, Search and Categories... &#039;&#039;now&#039;&#039; let&#039;s talk &#039;&#039;&#039;&#039;&#039;namespaces!&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
::Given that [[User:Hellboy1975|Matt]] has proclaimed himself &#039;category enforcer&#039; - then I think he could lead the overall structure on the wiki ;) --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::That&#039;s fine, I&#039;m happy to take on the roll of structuring the site for now.  My first goal is to make the main page a bit more accessable, and then each of the main categories (Web, Windows, Character Mode, DD&#039;s and Development Tools).  I guess my plan with these pages at the moment is to make the more structures, in much the same way as the Main Page on Wikipedia [[User:Hellboy1975|Hellboy1975]] 00:25, 6 December 2007 (CET)&lt;br /&gt;
::::Take a look at [[Main_Page_1]] for a preview [[User:Hellboy1975|Hellboy1975]] 01:53, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::::Like it Matt! &#039;&#039;Very&#039;&#039; nice. Keep up the good work!  --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET)&lt;br /&gt;
:::::Awesome effort :) You rock  --[[User:Jka|Jka]] 10:06, 6 December 2007 (CET)&lt;br /&gt;
:::::So... when are you going to make that live? I can&#039;t believe anybody is going to think we should &#039;&#039;not&#039;&#039; go with it... it is just a question of fleshing out some of those &amp;quot;wanted&amp;quot; links first IMO. --[[User:Mikepeat|Mike]] 10:22, 6 December 2007 (CET)&lt;br /&gt;
::::::Still got a couple of little things I want to do, mainly including some more info from the original main page.  All things going well sometime tomorrow or over the weekend. [[User:Hellboy1975|Hellboy1975]] 13:08, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Actually, namespaces require modification of the LocalSettings.php file on the server I think, so adding them is non-trivial (i.e. down to somebody with OS access to the server: Jacob, Johan or Sture, etc.) and thus they are a blunter and less flexible tool than Categories, but worth thinking about, in a background sort of way.&lt;br /&gt;
&lt;br /&gt;
::Let&#039;s do some experimenting with namespaces when we have a backup copy of VDFWiki running on a separate machine.  --[[User:Jka|Jka]] 10:10, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Backups==&lt;br /&gt;
(Seem to have spawned a different thread here, so... [[Image:Smile.jpg]] --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
I have two other MediaWikis set up that I can play/practice on (but they are hosted on &#039;&#039;real&#039;&#039; operating systems [[Image:Smile.gif]]), and if you are going to do that stuff I suggest you set one up for yourself, if you have not already - the software is a snap to set up, at least on Linux. Actually, several of us might consider doing that just to take periodic back-up copies of VdfWiki onto... just a thought.&lt;br /&gt;
&lt;br /&gt;
:Good idea to do multiple backups. Sture and I have been talking about uploading the content to &#039;somebody&#039;s ftp server - to have it duplicated. is that &#039;somebody&#039; you , Mike? --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::It &#039;&#039;could&#039;&#039; be. Right now I have MediaWikis running on two Linux boxen - one in the office (Ububtu server) and one at home (Fedora). I realise that you guys are running under WinDoze/IIS - would that cause any issues do you think? We have a public, hosted FTP server that I &#039;&#039;should&#039;&#039; be able to configure access to for you, so we are a possibility as a backup, but I think DAW or DAE are probably a better bet, both from a technical and an administrative PoV. If needed, I could act as &amp;quot;&#039;&#039;third string&#039;&#039;&amp;quot; to a DAW/DAE &amp;quot;&#039;&#039;second string&#039;&#039;&amp;quot;, in that you could dump stuff nightly to my FTP server (and I would then ignore it), where, in the event of an emergency, it could be restored from to a MediaWiki I could set up specifically for it (on another Fedora machine that I have spare in the office).  If I set up VdfWiki on that, it would be sitting ready to go from backup...  But I&#039;d explore the Data Access options first I think.  --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::Or... we also have our [http://www.unicorninterglobal.com web site] hosted, with the ability to host others (we do host a couple of others there). I have work to do in moving that all to a new machine on the hosting site (I&#039;m just too overloaded to contemplate it ATM), but once I&#039;ve done that we could offer a WinDoze compatible alternative hosting platform as a backup (primary or otherwise). --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::: DAE has agreed to set up an ftp account for our purpose. Its content will be part of their backup sequence (cool). Once we get it [[User:Jka|Jacob]] will upload a vdfwiki image and you can experiment with your servers. --[[User:Sture|Sture]] --[[User:Sture|Sture]] 18:16, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Common Editing Mistakes==&lt;br /&gt;
Something to watch for (and maybe warn against): I had occasion last night to move an article ([[Add Workspace Parameter]]) by [[User:Peter Brooks|Peter Brooks]] which he had put on the [[:Category:How To]] page; I moved it off onto its own page, but it is an easy mistake to make: just go to a Category and start editing. --[[User:Mikepeat|Mike]] 11:01, 5 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1488</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Talk:Main_Page&amp;diff=1488"/>
		<updated>2007-12-06T17:14:39Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Backups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= What would you like to see on this wiki? =&lt;br /&gt;
&lt;br /&gt;
Feel free to discuss the purpose of this wiki on this page. You are also welcome to provide feedback on how you want this site to interact with other resources (e.g the newsgroups and vdf-guidance.com) --[[User:Jka|Jka]] 23:35, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Overall goal ==&lt;br /&gt;
&lt;br /&gt;
I think VdfWiki should be a place assemble knowledge and articles in the long term (in a structured manner). &lt;br /&gt;
&lt;br /&gt;
There are some guidelines for keeping VdfWiki on the right track :[[VdfWiki_guidelines]]&lt;br /&gt;
&lt;br /&gt;
The newsgroups are still &#039;&#039;&#039;THE&#039;&#039;&#039; place to ask question and chat about current events.--[[User:Jka|Jka]] 08:28, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Wiki Structure Proposal==&lt;br /&gt;
I ([[User:Mikepeat|Mike]]) have just modifed the sidebar (the panel on the left of every page) to add &amp;quot;sections&amp;quot;.  (If any Sysop is not happy with this then it can be undone by editing the page [[MediaWiki:Sidebar]], or by just reverting my changes to it.)  I have used the sections as currently laid out on the main page, but I would like to propose a significant restructuring of those sections.  I will take no action until there has been reasonable discussion of it here and a consensus reached however.&lt;br /&gt;
&lt;br /&gt;
=== Overall structure (from Mike)===&lt;br /&gt;
I would propose something like the following overall structure:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;big&amp;gt;&#039;&#039;&#039;Main Page&#039;&#039;&#039;&amp;lt;/big&amp;gt; (Brief Product Overview)&lt;br /&gt;
** Product Detail&lt;br /&gt;
** &#039;&#039;&#039;Windows&#039;&#039;&#039;&lt;br /&gt;
*** CodeJock&lt;br /&gt;
*** OLE/COM/ActiveX&lt;br /&gt;
*** Reporting&lt;br /&gt;
** &#039;&#039;&#039;Web&#039;&#039;&#039;&lt;br /&gt;
*** AJAX&lt;br /&gt;
*** JavaScript&lt;br /&gt;
** &#039;&#039;&#039;Character Mode&#039;&#039;&#039;&lt;br /&gt;
*** DOS/Console Mode&lt;br /&gt;
*** Unix/Linux&lt;br /&gt;
** &#039;&#039;&#039;Web Services&#039;&#039;&#039;&lt;br /&gt;
*** SOA&lt;br /&gt;
** &#039;&#039;&#039;Databases&#039;&#039;&#039;&lt;br /&gt;
*** Embedded&lt;br /&gt;
*** MS SQL Server&lt;br /&gt;
*** Oracle&lt;br /&gt;
*** IBM DB/2&lt;br /&gt;
*** Pervasive&lt;br /&gt;
*** MySQL&lt;br /&gt;
*** ODBC&lt;br /&gt;
&lt;br /&gt;
(All comments and abuse will be gratefully received! [[Image:Smile-tpvgames.gif|20px]])&lt;br /&gt;
&lt;br /&gt;
--[[User:Mikepeat|Mike]] 02:46, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::I agree, the current structure on the main page isn&#039;t clear enough at the moment. [[User:Hellboy1975|Hellboy1975]] 05:37, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::: Marco here... I agree too. I&#039;d like to add some gotcha&#039;s about moving from DataFlex tables to DB2, accessed from DF32 on Linux and VDF on Win32.&lt;br /&gt;
&lt;br /&gt;
=== Data Dictionaries ===&lt;br /&gt;
::: I also want to add a topic on batch create/update/delete using DataDictionaries. Where would that live? Would it be a topic referenced from Web and Windows and Webservices, or should this be another section, &#039;Data Dictionaries&#039;?&lt;br /&gt;
::: I think a section about &#039;Data Dictionaries&#039; could be great. I&#039;ll just add one (also containing the Databases&#039; links from Mike --[[User:Jka|Jka]] 10:16, 25 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Suggestion for topic  (Development Tools)===&lt;br /&gt;
&lt;br /&gt;
Can I suggest that we add a new section or link on the main page for general development tools and articles that sit outside of the existing Web/Windows/WS/Console categories. [[User:Hellboy1975|Hellboy1975]] 00:07, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Sounds perfectly sensible to me... &amp;quot;Other&amp;quot; as a general catch-all, or &amp;quot;Other Tools&amp;quot;: a bit more specific, but then we might have issues with things that fell outside that &#039;&#039;and&#039;&#039; our existing sections.  --[[User:Mikepeat|Mike]] 00:14, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:: I am OK with a &amp;quot;tools&amp;quot; section. We can still lay down the law in that page :P The trick is to create a separate page for each tool we want to describe - and keep the external links down to a minimum (this should make it easier to keep track of the content on the page). I think the title &amp;quot;Development tools&amp;quot;  could work.  articles not related to these sections can be attached to a specific user page - we should try not to clutter the frontpage and 1st level navigation too much. --[[User:Jka|Jka]] 08:15, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Discussing cookbooks == &lt;br /&gt;
&lt;br /&gt;
::That structure looks reasonable. My original idea with the &amp;quot;cookbooks&amp;quot; was to put a list of howto-do-stuffs in there. E.g a list of recipes in them - and have the &amp;quot;other&amp;quot; page contain the description. E.g &amp;quot;Windows&amp;quot; contains the description and &amp;quot;Windows cookbook&amp;quot; contains the recipes. I&#039;ve found that the early contributions have been about &amp;quot;howto do stuff&amp;quot; (e.g something that should go in the cookbook). I can see now , that there should be no distinction between e.g &amp;quot;Windows&amp;quot; and &amp;quot;Windows cookbook&amp;quot; - they should be the same page. --[[User:Jka|Jka]] 09:38, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::On the &amp;quot;&#039;&#039;cookbooks&#039;&#039;&amp;quot; issue... perhaps using &amp;quot;Categories&amp;quot; might be a help.  This is not a subject I understand well enough (yet!), but it seems to me that it might add a multi-dimentional element to how articles are arranged and accessed, so that they can be come at from more than one direction (don&#039;t know how yet - research needed!). I think the original idea had merit - that some articles will be of a &amp;quot;howto&amp;quot; nature while others will be more descriptive, others discursive and still others umm... complaining (whining? - &amp;quot;&#039;&#039;why don&#039;t DAW do more with the Linux product?&#039;&#039;&amp;quot; &amp;lt;g&amp;gt;).  In a big Wiki like Wikipedia, searching is usually the only way to start, but with our rather less ambitious subject matter, good organisation might lead people quickly to what they need (even if they didn&#039;t know they needed it and didn&#039;t know it was there).  --[[User:Mikepeat|Mike]] 11:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::Yes . The need for having a &amp;quot;cookbook&amp;quot; can be adressed by having a category for all the different recipees. I think we should proceed in this direction . I removed the cookbook links from the frontpage and the navigation. --[[User:Jka|Jka]] 20:12, 21 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Style Guide?==&lt;br /&gt;
At the suggestion of [[User:Hellboy1975|Hellboy1975]] (what is that all about anyway, Matt? &amp;lt;g&amp;gt;) - see [[Talk:Web_Service_Basics]] - I have been changing the colour I am using to emphasise stuff - in this case (for now anyway) changing &amp;lt;span style=&amp;quot;color:blue;&amp;quot;&amp;gt;blue&amp;lt;/span&amp;gt; to &amp;lt;span style=&amp;quot;color:midnightblue;&amp;quot;&amp;gt;midnightblue&amp;lt;/span&amp;gt; to avoid confusion with hypertext links (I&#039;m not sure that is enough - I think I&#039;ve just made that text look like visited links).&lt;br /&gt;
&lt;br /&gt;
However it would have saved me this effort if I&#039;d had a guideline on what colours etc. to use from the start.  I think we need to evolve some kind of consensus &amp;quot;Style Guide&amp;quot; which would help us all use a nice, clear, consistent style for various things. It would be bound to be an evolving document, as we are unlikely to think of everything on day one and will have to be flexible and inclusive rather than prescriptive, but the sooner we start laying it down, the less time will be wasted later fixing stuff up that doesn&#039;t match or looks ugly.  (&#039;&#039;I did experiment with using a template - [[Template:Colorise]] - but couldn&#039;t get what I wanted to work: the amount of time I can afford to devote to learning the WikiMedia Template [http://en.wikipedia.org/wiki/Domain-specific_programming_language DSL] is strictly limited!&#039;&#039; &amp;lt;g&amp;gt;) [[User:Mikepeat|Mike]] 11:03, 22 November 2007 (CET)&lt;br /&gt;
:I should have said &#039;&#039;pr&amp;lt;u&amp;gt;o&amp;lt;/u&amp;gt;scriptive&#039;&#039; above - it would indeed be &#039;&#039;pr&amp;lt;u&amp;gt;e&amp;lt;/u&amp;gt;scriptive&#039;&#039;, by intent! [[User:Mikepeat|Mike]] 14:54, 22 November 2007 (CET)&lt;br /&gt;
:Something like the Wikipedia [http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style Manual of Style] is always a good place to start.  Another place to look for examples are in some of the programming manuals on Wikibooks.  Here&#039;s one of the pages in the C++ manual for instance. [http://en.wikibooks.org/wiki/C%2B%2B_Programming/Variables] [[User:Hellboy1975|Hellboy1975]] 00:20, 23 November 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Opensource/community libraries==&lt;br /&gt;
&lt;br /&gt;
I understand that there is a [[Data Access Worldwide|DAW]] community site in the works. please consider this when describing available available [[Open Source]] [[Visual DataFlex]] libraries. --[[User:Jka|Jka]] 00:49, 1 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
== Main Page ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m sure you&#039;ve all noticed by now I&#039;ve made a bit of a change to the front page.  It&#039;s more or less the same as before, just with a bit more information for users who are a bit new to the whole wiki thing.  What do you guys think? [[User:Hellboy1975|Hellboy1975]] 05:21, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Looks good Matt... you might consider mentioning [[Special:Categories]] in addition to the [[Category Index]], and maybe adding the [[Category Index]] to the &amp;quot;navigation&amp;quot; pane (edit [[MediaWiki:Sidebar]]).  ...And be careful who you say doesn&#039;t bite: &#039;&#039;&#039;&#039;&#039;I&#039;&#039;&#039;&#039;&#039; haven&#039;t had any coffee yet!  [[Image:Smile.gif]]&lt;br /&gt;
&lt;br /&gt;
:I think we probably need a single person (oops: that would be you... &#039;&#039;sucker!&#039;&#039; You have only yourself to blame!) to head-up work on structure, accessibility, cross-indexing and the like. We have made a big step forward with Categories, giving us the three tools you mention: Structure, Search and Categories... &#039;&#039;now&#039;&#039; let&#039;s talk &#039;&#039;&#039;&#039;&#039;namespaces!&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
::Given that [[User:Hellboy1975|Matt]] has proclaimed himself &#039;category enforcer&#039; - then I think he could lead the overall structure on the wiki ;) --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::That&#039;s fine, I&#039;m happy to take on the roll of structuring the site for now.  My first goal is to make the main page a bit more accessable, and then each of the main categories (Web, Windows, Character Mode, DD&#039;s and Development Tools).  I guess my plan with these pages at the moment is to make the more structures, in much the same way as the Main Page on Wikipedia [[User:Hellboy1975|Hellboy1975]] 00:25, 6 December 2007 (CET)&lt;br /&gt;
::::Take a look at [[Main_Page_1]] for a preview [[User:Hellboy1975|Hellboy1975]] 01:53, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::::Like it Matt! &#039;&#039;Very&#039;&#039; nice. Keep up the good work!  --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET)&lt;br /&gt;
:::::Awesome effort :) You rock  --[[User:Jka|Jka]] 10:06, 6 December 2007 (CET)&lt;br /&gt;
:::::So... when are you going to make that live? I can&#039;t believe anybody is going to think we should &#039;&#039;not&#039;&#039; go with it... it is just a question of fleshing out some of those &amp;quot;wanted&amp;quot; links first IMO. --[[User:Mikepeat|Mike]] 10:22, 6 December 2007 (CET)&lt;br /&gt;
::::::Still got a couple of little things I want to do, mainly including some more info from the original main page.  All things going well sometime tomorrow or over the weekend. [[User:Hellboy1975|Hellboy1975]] 13:08, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:Actually, namespaces require modification of the LocalSettings.php file on the server I think, so adding them is non-trivial (i.e. down to somebody with OS access to the server: Jacob, Johan or Sture, etc.) and thus they are a blunter and less flexible tool than Categories, but worth thinking about, in a background sort of way.&lt;br /&gt;
&lt;br /&gt;
::Let&#039;s do some experimenting with namespaces when we have a backup copy of VDFWiki running on a separate machine.  --[[User:Jka|Jka]] 10:10, 6 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
==Backups==&lt;br /&gt;
(Seem to have spawned a different thread here, so... [[Image:Smile.jpg]] --[[User:Mikepeat|Mike]] 09:54, 6 December 2007 (CET))&lt;br /&gt;
&lt;br /&gt;
I have two other MediaWikis set up that I can play/practice on (but they are hosted on &#039;&#039;real&#039;&#039; operating systems [[Image:Smile.gif]]), and if you are going to do that stuff I suggest you set one up for yourself, if you have not already - the software is a snap to set up, at least on Linux. Actually, several of us might consider doing that just to take periodic back-up copies of VdfWiki onto... just a thought.&lt;br /&gt;
&lt;br /&gt;
:Good idea to do multiple backups. Sture and I have been talking about uploading the content to &#039;somebody&#039;s ftp server - to have it duplicated. is that &#039;somebody&#039; you , Mike? --[[User:Jka|Jka]] 11:45, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
::It &#039;&#039;could&#039;&#039; be. Right now I have MediaWikis running on two Linux boxen - one in the office (Ububtu server) and one at home (Fedora). I realise that you guys are running under WinDoze/IIS - would that cause any issues do you think? We have a public, hosted FTP server that I &#039;&#039;should&#039;&#039; be able to configure access to for you, so we are a possibility as a backup, but I think DAW or DAE are probably a better bet, both from a technical and an administrative PoV. If needed, I could act as &amp;quot;&#039;&#039;third string&#039;&#039;&amp;quot; to a DAW/DAE &amp;quot;&#039;&#039;second string&#039;&#039;&amp;quot;, in that you could dump stuff nightly to my FTP server (and I would then ignore it), where, in the event of an emergency, it could be restored from to a MediaWiki I could set up specifically for it (on another Fedora machine that I have spare in the office).  If I set up VdfWiki on that, it would be sitting ready to go from backup...  But I&#039;d explore the Data Access options first I think.  --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::Or... we also have our [http://www.unicorninterglobal.com web site] hosted, with the ability to host others (we do host a couple of others there). I have work to do in moving that all to a new machine on the hosting site (I&#039;m just too overloaded to contemplate it ATM), but once I&#039;ve done that we could offer a WinDoze compatible alternative hosting platform as a backup (primary or otherwise). --[[User:Mikepeat|Mike]] 13:05, 5 December 2007 (CET)&lt;br /&gt;
&lt;br /&gt;
:::: DAE has agreed to set up an ftp account for our purpose. Its content will be part of their backup sequence (cool). Once we get it [[User:Jka|Jacob]] will upload a vdfwiki image and you can experiment with your servers. --[[User:Sture|Sture]]&lt;br /&gt;
&lt;br /&gt;
==Common Editing Mistakes==&lt;br /&gt;
Something to watch for (and maybe warn against): I had occasion last night to move an article ([[Add Workspace Parameter]]) by [[User:Peter Brooks|Peter Brooks]] which he had put on the [[:Category:How To]] page; I moved it off onto its own page, but it is an easy mistake to make: just go to a Category and start editing. --[[User:Mikepeat|Mike]] 11:01, 5 December 2007 (CET)&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=User:Sture&amp;diff=1417</id>
		<title>User:Sture</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=User:Sture&amp;diff=1417"/>
		<updated>2007-12-03T12:44:51Z</updated>

		<summary type="html">&lt;p&gt;Sture: New page: = Information =  {{User| |Name=Sture Andersen |Email=sture@sture.dk |Company=Sture Aps }}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Information =&lt;br /&gt;
&lt;br /&gt;
{{User|&lt;br /&gt;
|Name=Sture Andersen&lt;br /&gt;
|Email=sture@sture.dk&lt;br /&gt;
|Company=Sture Aps&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Main_Page&amp;diff=164</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Main_Page&amp;diff=164"/>
		<updated>2007-08-25T19:04:53Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Welcome to StureWiki. Here you can share your Visual DataFlex programming knowledge (and learn a little too).&lt;br /&gt;
&lt;br /&gt;
== Subjects ==&lt;br /&gt;
*[[AJAX Library for Visual DataFlex| AJAX programming (AJAX Library for Visual DataFlex)]]&lt;br /&gt;
*[[Visual DataFlex| Windows programming  (Visual DataFlex)]]&lt;br /&gt;
*[[DataFlex| Character mode (DataFlex)]]&lt;br /&gt;
*[[Electos| Content Management (Electos)]]&lt;br /&gt;
&lt;br /&gt;
== Tools==&lt;br /&gt;
*[[SCM| Source code Management]]&lt;br /&gt;
*[[Editors| Editors]]&lt;br /&gt;
&lt;br /&gt;
==  Projects ==&lt;br /&gt;
*[[VDFQuery| VDFQuery :  the framework behind Wasp ]]&lt;br /&gt;
*[[WikiKnowledgeBase| Using a wiki for a knowledge base ]]&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
*[http://www.vdf-guidance.com vdf-guidance.com]&lt;br /&gt;
*[http://blog.front-it.dk &#039;Charlottes web&#039;]&lt;br /&gt;
*[http://www.dataaccess.com/support.asp?pageid=771 Data Access Worldwide whitepapers]&lt;br /&gt;
*[http://www.sture.com/wasp &#039;WASP (Newsgroup search)&#039;]&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Main_Page&amp;diff=163</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Main_Page&amp;diff=163"/>
		<updated>2007-08-25T18:58:51Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Welcome to StureWiki. Here you can brag about your VDF programming powers (and learn a little too).&lt;br /&gt;
&lt;br /&gt;
== Subjects ==&lt;br /&gt;
*[[AJAX Library for Visual DataFlex| AJAX programming (AJAX Library for Visual DataFlex)]]&lt;br /&gt;
*[[Visual DataFlex| Windows programming  (Visual DataFlex)]]&lt;br /&gt;
*[[DataFlex| Character mode (DataFlex)]]&lt;br /&gt;
*[[Electos| Content Management (Electos)]]&lt;br /&gt;
&lt;br /&gt;
== Tools==&lt;br /&gt;
*[[SCM| Source code Management]]&lt;br /&gt;
*[[Editors| Editors]]&lt;br /&gt;
&lt;br /&gt;
==  Projects ==&lt;br /&gt;
*[[VDFQuery| VDFQuery :  the framework behind Wasp ]]&lt;br /&gt;
*[[WikiKnowledgeBase| Using a wiki for a knowledge base ]]&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
*[http://www.vdf-guidance.com vdf-guidance.com]&lt;br /&gt;
*[http://blog.front-it.dk &#039;Charlottes web&#039;]&lt;br /&gt;
*[http://www.dataaccess.com/support.asp?pageid=771 Data Access Worldwide whitepapers]&lt;br /&gt;
*[http://www.sture.com/wasp &#039;WASP (Newsgroup search)&#039;]&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Main_Page&amp;diff=162</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Main_Page&amp;diff=162"/>
		<updated>2007-08-25T18:57:27Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* Other resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Welcome to StureWiki. Here you can brag about your godlike programming powers (and learn a little too).&lt;br /&gt;
&lt;br /&gt;
== Subjects ==&lt;br /&gt;
*[[AJAX Library for Visual DataFlex| AJAX programming (AJAX Library for Visual DataFlex)]]&lt;br /&gt;
*[[Visual DataFlex| Windows programming  (Visual DataFlex)]]&lt;br /&gt;
*[[DataFlex| Character mode (DataFlex)]]&lt;br /&gt;
*[[Electos| Content Management (Electos)]]&lt;br /&gt;
&lt;br /&gt;
== Tools==&lt;br /&gt;
*[[SCM| Source code Management]]&lt;br /&gt;
*[[Editors| Editors]]&lt;br /&gt;
&lt;br /&gt;
==  Projects ==&lt;br /&gt;
*[[VDFQuery| VDFQuery :  the framework behind Wasp ]]&lt;br /&gt;
*[[WikiKnowledgeBase| Using a wiki for a knowledge base ]]&lt;br /&gt;
&lt;br /&gt;
== Other resources ==&lt;br /&gt;
*[http://www.vdf-guidance.com vdf-guidance.com]&lt;br /&gt;
*[http://blog.front-it.dk &#039;Charlottes web&#039;]&lt;br /&gt;
*[http://www.dataaccess.com/support.asp?pageid=771 Data Access Worldwide whitepapers]&lt;br /&gt;
*[http://www.sture.com/wasp &#039;WASP (Newsgroup search)&#039;]&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Visual_DataFlex&amp;diff=102</id>
		<title>Visual DataFlex</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Visual_DataFlex&amp;diff=102"/>
		<updated>2007-08-17T12:02:25Z</updated>

		<summary type="html">&lt;p&gt;Sture: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hey hey wiki world&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* http://www.visualdataflex.com&lt;br /&gt;
* http://www.dataaccess.com&lt;br /&gt;
* http://www.dataaccess.nl&lt;br /&gt;
* [http://www.sture.com/wasp/ WASP Newsgroup search] engine&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[DataFlex Connectivity Kit|Connectivity]]&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=SVN&amp;diff=100</id>
		<title>SVN</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=SVN&amp;diff=100"/>
		<updated>2007-08-17T11:53:47Z</updated>

		<summary type="html">&lt;p&gt;Sture: /* omitting data files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= omitting data files= &lt;br /&gt;
When coding DataFlex with the native database, then we do not want .dat files in version control. (They will take up too much space on the server in different versions). To solve this we either need to tweak the svn setup.&lt;br /&gt;
&lt;br /&gt;
Tweaking the svn setup : http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html&lt;br /&gt;
&lt;br /&gt;
Global ignore pattern could be set to:&lt;br /&gt;
&lt;br /&gt;
*.dat *.k* *.vld *.hdr *.mtd *.dsk *.loc *.prn *.prp *.bak *.pkd *.pbg *.fld *.exe *.dbg *.trc *.doc&lt;br /&gt;
&lt;br /&gt;
= Importing a project =&lt;br /&gt;
If you are importing a project , then remember to have write access to the repository url you are writing to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is a description of how to do it in tortoise svn: http://wsmoak.net/subversion/demo/tsvn-import.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Links = &lt;br /&gt;
*docs: http://svnbook.red-bean.com/&lt;br /&gt;
*client: http://tortoisesvn.tigris.org/&lt;br /&gt;
*server: http://svn1clicksetup.tigris.org/&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=SVN&amp;diff=99</id>
		<title>SVN</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=SVN&amp;diff=99"/>
		<updated>2007-08-17T11:53:23Z</updated>

		<summary type="html">&lt;p&gt;Sture: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= omitting data files= &lt;br /&gt;
When coding DataFlex with the native database, then we do not want .dat files in version control. (They will take up too much space on the server in different versions). To solve this we either need to tweak the svn setup.&lt;br /&gt;
&lt;br /&gt;
Tweaking the svn setup : http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html&lt;br /&gt;
&lt;br /&gt;
Global ignore pattern could be set to &lt;br /&gt;
&lt;br /&gt;
&amp;quot;*.dat *.k* *.vld *.hdr *.mtd *.dsk *.loc *.prn *.prp *.bak *.pkd *.pbg *.fld *.exe *.dbg *.trc *.doc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Importing a project =&lt;br /&gt;
If you are importing a project , then remember to have write access to the repository url you are writing to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here is a description of how to do it in tortoise svn: http://wsmoak.net/subversion/demo/tsvn-import.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Links = &lt;br /&gt;
*docs: http://svnbook.red-bean.com/&lt;br /&gt;
*client: http://tortoisesvn.tigris.org/&lt;br /&gt;
*server: http://svn1clicksetup.tigris.org/&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=DataFlex_Wiki:Site_support&amp;diff=41</id>
		<title>DataFlex Wiki:Site support</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=DataFlex_Wiki:Site_support&amp;diff=41"/>
		<updated>2007-08-16T14:32:34Z</updated>

		<summary type="html">&lt;p&gt;Sture: New page: No donations, please&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No donations, please&lt;/div&gt;</summary>
		<author><name>Sture</name></author>
	</entry>
</feed>