Difference between revisions of "Git"

From Minetest Developer Wiki
Jump to navigation Jump to search
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
'''Git is a version control system.''' It handles projects as ''repositories'' (often called ''repos'') with a history. The history consists of commits. A commit is a change to the code with the description.
 
'''Git is a version control system.''' It handles projects as ''repositories'' (often called ''repos'') with a history. The history consists of commits. A commit is a change to the code with the description.
  
Git allows people to create forks of a repo. A fork is a new repo with the same history and content, but when commiting to the fork, the main repo is not affected. This allows developers to work on projects without access to the main repo.
+
Git allows people to create forks of a repository. A fork is a new repository with the same history and content, but when committing to the fork, the main repository is not affected. This allows developers to work on projects without access to the main repo.
  
To bring other peoples work into the main repo, they can open a pull request. This can easily be done in the GUI of [[GitHub]].
+
To bring other peoples work into the main repository, they can open a pull request. This can easily be done in the GUI of GitHub.
  
 
Git also has the ability to create branches in one repository. This allows developers to work on multiple features at the same time.
 
Git also has the ability to create branches in one repository. This allows developers to work on multiple features at the same time.
  
Minetest has two repositories: the engine is in the “minetest” repository, whereas the main game, Minetest Game, is in the “minetest_game” repositories. The repositories are hosted on [[GitHub]].
+
Minetest has two repositories: the engine is in the “minetest” repository, whereas the main game, Minetest Game, is in the “minetest_game” repositories. The repositories are hosted on GitHub.
  
 
== Use Git to get the latest updates ==
 
== Use Git to get the latest updates ==
  
You can use Git to get the latest updates of Minetest in a RUN_IN_PLACE version. To do this, clone the main repo:
+
You can use Git to get the latest updates of Minetest in a RUN_IN_PLACE version. To do this, clone the main repository:
 
<source lang="bash">
 
<source lang="bash">
# Get the engine:
+
# Get the engine
git clone git://github.com/minetest/minetest.git # Creates a directory called "minetest" with all the content.
+
git clone https://github.com/minetest/minetest.git # Creates a directory called "minetest" with all the content.
  
# Get Minetest Game:
+
# Get Minetest Game
 
cd minetest/games/
 
cd minetest/games/
git clone git://github.com/minetest/minetest_game.git # Creates a directory called "minetest_game" with all the content.
+
git clone https://github.com/minetest/minetest_game.git # Creates a directory called "minetest_game" with all the content.
 
</source>
 
</source>
  
To get the latest updates of the engine (you have to compile Minetest after this) do this in the cloned minetest directory:
+
To get the latest updates of the engine (you have to compile Minetest after this), do this in the cloned Minetest directory:
 
<source lang="bash">
 
<source lang="bash">
 
git pull
 
git pull
Line 38: Line 38:
 
{{Template:Note|In this example only the engine repository is used, but you can do the same with the minetest_game repository.}}
 
{{Template:Note|In this example only the engine repository is used, but you can do the same with the minetest_game repository.}}
  
To use Git for development you have to fork the main repository on GitHub first. After this you can clone your repo:
+
To use Git for development, you have to fork the main repository on GitHub first. After this, you can clone your repository:
 
<source lang="bash">
 
<source lang="bash">
 
git clone git://github.com/Your_user_name_on_GitHub/minetest.git #Creates a directory called "minetest" with all the content
 
git clone git://github.com/Your_user_name_on_GitHub/minetest.git #Creates a directory called "minetest" with all the content
Line 60: Line 60:
 
Commit messages should start with a capital letter and use the present tense. They should sum up the feature/fix.
 
Commit messages should start with a capital letter and use the present tense. They should sum up the feature/fix.
  
You can now acces your code in your repository on GitHub and open a pull request for it to the main repo.
+
You can now access your code in your repository on GitHub and open a pull request for it to the main repository.
  
 
To go back to your master branch do:
 
To go back to your master branch do:
Line 80: Line 80:
 
=== Updating your fork ===
 
=== Updating your fork ===
  
You can use Git to update your Minetest fork with the latest changes of the offical repository.
+
You can use Git to update your Minetest fork with the latest changes of the official repository.
  
 
==== Prerequisites ====
 
==== Prerequisites ====
Line 93: Line 93:
 
==== Updating the fork ====
 
==== Updating the fork ====
  
You need to download the changes of the main repo first and then merge them.
+
You need to download the changes of the main repository first and then merge them.
  
 
'''For the engine:'''
 
'''For the engine:'''
 
<source lang="bash">
 
<source lang="bash">
# Get the changes:
+
# Get the changes
 
git fetch upstream
 
git fetch upstream
  
# Merge the changes:
+
# Merge the changes
 
git rebase upstream/master
 
git rebase upstream/master
  
# Push the result to GitHub:
+
# Push the result to GitHub
 
git push
 
git push
 
</source>
 
</source>
Line 113: Line 113:
 
git fetch upstream
 
git fetch upstream
  
# Merge the changes:
+
# Merge the changes
 
git rebase upstream/master
 
git rebase upstream/master
  
# Push the result to GitHub:
+
# Push the result to GitHub
 
git push
 
git push
 
</source><br/>
 
</source><br/>
  
 
== Tips ==
 
== Tips ==
simplify making commits:
+
Simplify making commits:
<source lang="bash">sudo echo 'git add -A && git commit -m "$*
+
<source lang="bash">echo 'git add -A && git commit -m "$*
  
$(git status -s)"' > /usr/local/bin/gitdirectcommit && chmod a+x /usr/local/bin/gitdirectcommit</source>
+
$(git status -s)"' | sudo tee /usr/local/bin/gitdirectcommit && sudo chmod +x /usr/local/bin/gitdirectcommit</source>
 
to make a commit, just do changes in your repository and run e.g. <source lang="bash">gitdirectcommit my changes</source>
 
to make a commit, just do changes in your repository and run e.g. <source lang="bash">gitdirectcommit my changes</source>
 
Quotes are not needed and the files (their path relative to the repository path) which are changed are annexed to the end of the commit message automatically.<br/>
 
Quotes are not needed and the files (their path relative to the repository path) which are changed are annexed to the end of the commit message automatically.<br/>
Line 131: Line 131:
  
 
* [http://git-scm.com/book ''Pro Git'' (book)]
 
* [http://git-scm.com/book ''Pro Git'' (book)]
 +
* [https://forum.minetest.net/viewtopic.php?f=3&t=14262 The big git and github Pull Request thread on the forums]
 
[[Category:Git]]
 
[[Category:Git]]

Latest revision as of 19:48, 25 January 2023

Git is a version control system. It handles projects as repositories (often called repos) with a history. The history consists of commits. A commit is a change to the code with the description.

Git allows people to create forks of a repository. A fork is a new repository with the same history and content, but when committing to the fork, the main repository is not affected. This allows developers to work on projects without access to the main repo.

To bring other peoples work into the main repository, they can open a pull request. This can easily be done in the GUI of GitHub.

Git also has the ability to create branches in one repository. This allows developers to work on multiple features at the same time.

Minetest has two repositories: the engine is in the “minetest” repository, whereas the main game, Minetest Game, is in the “minetest_game” repositories. The repositories are hosted on GitHub.

Use Git to get the latest updates

You can use Git to get the latest updates of Minetest in a RUN_IN_PLACE version. To do this, clone the main repository:

# Get the engine
git clone https://github.com/minetest/minetest.git # Creates a directory called "minetest" with all the content.

# Get Minetest Game
cd minetest/games/
git clone https://github.com/minetest/minetest_game.git # Creates a directory called "minetest_game" with all the content.

To get the latest updates of the engine (you have to compile Minetest after this), do this in the cloned Minetest directory:

git pull

To get the latest updates of Minetest Game:

cd games/minetest_game/
git pull

Using Git for development

Creating a fork

note.png
Note: In this example only the engine repository is used, but you can do the same with the minetest_game repository.


To use Git for development, you have to fork the main repository on GitHub first. After this, you can clone your repository:

git clone git://github.com/Your_user_name_on_GitHub/minetest.git #Creates a directory called "minetest" with all the content
cd minetest/

Coding a feature or a bug fix

Create a new branch to code your feature (be sure to give them good names (not just “patch” or “fix”)):

git checkout -b feature_branch

Now, you can code your feature or bug fix. If you are done, you have to commit your changes and push them to your repository on GitHub:

git add . # Adds all changes; alternatively you can specify single files
git commit -m "Your feature"
git push origin feature_branch

Commit messages should start with a capital letter and use the present tense. They should sum up the feature/fix.

You can now access your code in your repository on GitHub and open a pull request for it to the main repository.

To go back to your master branch do:

git checkout master

If you have to update your feature, do:

git checkout feature_branch
# Do changes
git add .
git commit -m "Update message"
git push origin feature_branch

This will automatically be added to the pull request (if there is one).

Updating your fork

You can use Git to update your Minetest fork with the latest changes of the official repository.

Prerequisites

If you haven't already you need to tell git where to get the changes.

git remote add upstream https://github.com/minetest/minetest
cd games/minetest_game
git remote add upstream https://github.com/minetest/minetest_game

Updating the fork

You need to download the changes of the main repository first and then merge them.

For the engine:

# Get the changes
git fetch upstream

# Merge the changes
git rebase upstream/master

# Push the result to GitHub
git push

For the game:

cd games/minetest_game
# Get the changes:
git fetch upstream

# Merge the changes
git rebase upstream/master

# Push the result to GitHub
git push


Tips

Simplify making commits:

echo 'git add -A && git commit -m "$*

$(git status -s)"' | sudo tee /usr/local/bin/gitdirectcommit && sudo chmod +x /usr/local/bin/gitdirectcommit

to make a commit, just do changes in your repository and run e.g.

gitdirectcommit my changes

Quotes are not needed and the files (their path relative to the repository path) which are changed are annexed to the end of the commit message automatically.

See also