Git: Difference between revisions
| (22 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
Git is a popular version control system made by Linus Torvalds. | Git is a popular version control system made by Linus Torvalds. | ||
== | ==Installation== | ||
===Basic Usage | ===Windows=== | ||
Download [https://git-scm.com/downloads Git for Windows] or use [https://community.chocolatey.org/packages/git chocolatey]. | |||
<pre> | |||
choco install git --params "/WindowsTerminalProfile" | |||
</pre> | |||
===Linux=== | |||
[https://git-scm.com/download/linux git-scm install] | |||
<syntaxhighlight lang="bash"> | |||
# PPA for the latest stable version. | |||
sudo add-apt-repository ppa:git-core/ppa | |||
sudo apt update | |||
sudo apt install git git-lfs | |||
</syntaxhighlight> | |||
==Basic Usage== | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
# Clone or download a repository | # Clone or download a repository | ||
git clone <url> | git clone <url> [<foldername>] | ||
# cd into the cloned folder | |||
cd <foldername> | |||
# Note that some repos have submodules which will also need to be cloned | |||
git submodule update --init --recursive | |||
# Stage your changes | # Stage your changes | ||
| Line 23: | Line 42: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Branches== | |||
Branches allow you to work on the repository without creating new forks and using more disk space. | |||
You can use them to create and test changes from a static copy of the code repo. | |||
You can also discard a branch if you decide the feature is no longer needed. | |||
Once the feature has been fully developed, you should rebase the branch onto the head of the main branch. | |||
Then you can merge the branch to add the feature to main/master. | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
# Make a branch | # Make a branch | ||
| Line 34: | Line 59: | ||
# Push | # Push | ||
git push --set-upstream origin my_feature | git push --set-upstream origin my_feature | ||
# Checkout a branch | |||
git checkout my_branch | |||
# Checkout a single file from another branch | |||
git checkout my_branch -- other_file.txt | |||
</syntaxhighlight> | |||
==Patches== | |||
Patches are a way to represent and share changes without actually making commits or new branches. | |||
<syntaxhighlight lang="bash"> | |||
# For unstaged changes | |||
git diff > changes.patch | |||
# For staged changes | |||
git diff --cached > changes.patch | |||
# You can also add --binary to include binary files | |||
# Apply the patch | |||
git apply changes.patch | |||
</syntaxhighlight> | </syntaxhighlight> | ||
See [https://stackoverflow.com/questions/5159185/create-a-git-patch-from-the-uncommitted-changes-in-the-current-working-directory create git patch] | |||
==Pull Requests== | |||
See [https://stackoverflow.com/questions/20289599/are-pull-requests-part-of-git-or-a-feature-of-tools-like-github-gerrit-and-atl Are pull requests are part of Git?] | |||
Pull requests are a way to submit changes to repositories you do not manage. | |||
First, you fork the repository to create a working-copy for yourself to develop on. | |||
Once your changes are finished, you create a pull request asking the original repo to incorporate your changes. | |||
It's easiest to just use the web interfaces of GitHub or GitLab for this. | |||
To do this manually, see [https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project Git Book: Contributing to a project]. | |||
==Migrating Repositories== | |||
How to migrate repositories to another Git server | How to migrate repositories to another Git server | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
| Line 51: | Line 104: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Changing Remote URL== | |||
[https://help.github.com/en/articles/changing-a-remotes-url Reference]<br> | [https://help.github.com/en/articles/changing-a-remotes-url Reference]<br> | ||
You will need to change the remote url if it is changed on the server. E.g. if you change the project name.<br> | You will need to change the remote url if it is changed on the server. E.g. if you change the project name.<br> | ||
| Line 58: | Line 111: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===gitignore=== | ==Special Files== | ||
.gitignore is used to ignore certain files to make sure they do not get accidentally pushed to the remote git repo.<br> | ===<code>.gitignore</code>=== | ||
<code>.gitignore</code> is used to ignore certain files to make sure they do not get accidentally pushed to the remote git repo.<br> | |||
You can find a collection of .gitignore files on [https://github.com/github/gitignore Github's gitignore repo].<br> | You can find a collection of .gitignore files on [https://github.com/github/gitignore Github's gitignore repo].<br> | ||
Or you can create a custom .gitignore file at [https://www.gitignore.io gitignore.io]. | Or you can create a custom .gitignore file at [https://www.gitignore.io gitignore.io]. | ||
===gitattributes=== | ===<code>.gitattributes</code>=== | ||
.gitattributes are used to give attributes to paths.<br> | <code>.gitattributes</code> are used to give attributes to paths.<br> | ||
They can be used to assign programming languages to filenames.<br> | They can be used to assign programming languages to filenames.<br> | ||
They are also used to identify which files should be stored in the lfs.<br> | They are also used to identify which files should be stored in the lfs.<br> | ||
Here is an example to store video and images in the lfs.<br> | [https://gitlab.davidl.me/-/snippets/1/raw/master/lfs.gitattributes Here] is an example to store video and images in the lfs.<br> | ||
==Clean== | |||
[https://www.atlassian.com/git/tutorials/undoing-changes/git-clean Atlassian Reference]<br> | |||
Use <code>git clean</code> to delete untracked files.<br> | |||
Add <code>-x</code> to also delete gitignore'd files. | |||
<syntaxhighlight lang="bash"> | |||
# | # Force delete any untracked files and directories | ||
git clean -fd | |||
</syntaxhighlight> | |||
</ | |||
==Git Large File Storage (LFS)== | ==Git Large File Storage (LFS)== | ||
[https://github.com/git-lfs/git-lfs/wiki/Tutorial Reference] | [https://github.com/git-lfs/git-lfs/wiki/Tutorial Reference] | ||
* Note that Github charges for LFS so it's best to keep binary files outside of GitHub. | |||
==Sparse checkout== | |||
If you're interacting with a monorepo like [https://github.com/google-research/google-research google-research/google-research], you may be interested in git sparse checkout.<br> | |||
See [https://git-scm.com/docs/git-sparse-checkout Git - git-sparse-checkout Documentation] and [https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ Bring your monorepo down to size with sparse-checkout | The GitHub Blog].<br> | |||
This is a relatively new feature so be sure to use an updated version of git. | |||
<syntaxhighlight lang="bash"> | |||
git clone --no-checkout $url | |||
cd $project | |||
git sparse-checkout init | |||
git sparse-checkout add $folder | |||
</syntaxhighlight> | |||