| maintainer |
|---|
JKrag |
- Clone this repository
- Go into the folder you want to solve an exercise in
- Run the
setup.shscript - Consult the README.md in that folder to get a description of the exercise
This repository is a collection of Git exercises. The concept is stolen without shame from Schauderhaft.de. Unfortunately, they have not maintained the system - and we need more good Git exercises.
The exercises are designed for use when we are teaching Git courses. You should be able to use them as self-contained exercises that will allow you to keep your Git skills sharp.
Exercises starting with basic are entry-level - other exercises vary greatly in difficulty.
To get an overview of the exercises in here look in Overview.md.
Feel free to use these exercises, that's why they're public!
ignore (8번) - .gitignore 파일 설정은 빌드 파일이나 임시 파일들을 관리에서 제외할 수 있어 가장 먼저 익히는 것이 좋습니다. CUDA나 PyTorch 프로젝트에서는 컴파일된 바이너리, 캐시 파일 등을 제외하는 데 필수적입니다.
basic-cleaning (5번) - 불필요한 파일을 정리하는 방법으로, 작업 공간을 깨끗하게 유지하는 데 도움이 됩니다.
basic-stashing (7번) - 작업 중인 변경사항을 임시 저장할 수 있어, 최적화 실험 중 다른 접근법을 빠르게 시도해볼 때 매우 유용합니다.
ff-merge (4번) - 브랜치를 사용하기 시작하면 필요해집니다만, 초기에는 덜 중요할 수 있습니다. Fast-forward merge는 일직선 상에 있는 브랜치를 별도의 병합 커밋 없이 합체시키는 방식입니다.
amend (6번) - 마지막 커밋을 수정하는 기능으로, 유용하지만 필수는 아닙니다.
권장사항 이미 1, 2, 3을 익히셨다면, 일단 8번(ignore)을 배우고 프로젝트를 시작하세요. 나머지는 필요할 때마다 배워가는 방식으로 진행해도 충분합니다.
- basic-commits - Very basic creation of commits.
- basic-staging - Interacting with the stage (index).
- basic-branching - The first stride into branching.
- ff-merge - A tour around the most trivial of merges.
- 3-way-merge - A basic merge, involving multiple diverged branches.
- merge-conflict - A basic merge between diverging branches with incompatible (but simple) changesets.
- merge-mergesort - A merge conflict with actual code.
- rebase-branch - Using rebase as an alternative to merging.
- basic-revert - Use revert to revert a change.
- reset - Reset is a powerful and slightly dangerous command if you do not know what you are doing. Go through the three modes of resetting here.
- basic-cleaning - Cleaning the workspace.
- amend - Amending previous commits.
- reorder-the-history - We might have created our commits in a suboptimal order, practice to fix that scenario here.
- squashing - A lot of small commits is good when you are working locally, but for sharing your code, it might be more beneficial to deliver your code changes in large sets. Go here to experiment with that. Write a good commit.
- advanced-rebase-interactive - Practice using the interactive rebase commands.
- basic-stashing - The first stride into stashing.
- ignore - The basics of using the
.gitignorefile. And usinggit rm. - submodules - Submodules are loathed by many. Run through this exercise to see what the ruckus is all about.
- git-tag - Tags are convenient for keeping track of commits that bump a version number. In this exercise, you will list, add and delete tags.
See Overview.md for a more complete list and suggested order.
If you miss exercises or find errors in any of them, feel free to improve them and make a pull request.
You can also make an issue so we notice an opportunity to improve!
Thank you!
On September 6th, 2023, we reached the milestone of having 1000 stars on GitHub. Thank you all for your support! This repository would not be where it is without the valuable contributions from the community.
A collection of useful commands to use throughout the exercises:
# Initializing an empty git repository.
git init # Initialize an empty git repository under current directory.
# Cloning a repository
git clone https://github.com/praqma-training/git-katas.git # Clone this repository to your current working directory
# Git (user and repo level) configurations
git config --local user.name "Repo-level Username" # For setting a local git repo level user name.
git config --local user.email "Repo-level.Email@Example.com" # For setting a local git repo level user email.
# --global -> User level git config stored in <user-home>/.gitconfig for e.g. ~/.gitconfig
# --local -> repo level config stored in repo's main dir under .git/config
# See local changes
git status # Show the working tree status
git diff # Show changes current working directory (not yet staged)
git diff --cached # Show changes currently staged for commit
# Add files to staging (before a commit)
git add myfile.txt # Add myfile.txt to stage
git add . # Add entire working directory to stage
# Make a commit
git commit # Make a new commit with the changes in your staging area. This will open an editor for a commit message.
git commit -m "I love documentation" # Make a new commit with a commit message from the command line
git commit -a # Make a new commit and automatically "add" changes from all known files
git commit -am "I still do!" # A combination of the above
git commit --amend # Re-do the commit message of the previous commit (don't do this after pushing!)
# We _never_ change "public history"
git reset <file> # Unstage a staged file leaving in working directory without losing any changes.
git reset --soft [commit_hash] # resets the current branch to <commit>. Does not touch the staging area or the working tree at all.
# --hard mode would discard all changes.
# Configuring a different editor
## Avoid Vim but stay in terminal:
- `git config --global core.editor nano`
## For Windows:
- Use Notepad:
`git config --global core.editor notepad`
- or for instance Notepad++:
`git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"`
# See history
git log # Show commit logs
git log --oneline # Formats commits to a single line (shorthand for --pretty=oneline --abbrev-commit )
git log --graph # Show a graph commits and branches
git log --pretty=fuller # To see commit log details with author and committer details, if any different.
git log --follow <file> # List the history of a file beyond renames
git log branch2..branch1 # Show commits reachable from branch1 but not from branch2
# Deferring
git stash # Stash (store temporarily) changes in working branch and enable checkingout a new branch
git stash list # List stored stashes.
git stash apply <stash> # Apply given <stash>, or if none given the latest from stash list.
# Working with Branches
git branch my-branch # Create a new branch called my-branch
git switch my-branch # Switch to a different branch to work on it
git switch -c my-branch # Create a new branch called my-branch AND switch to it
git branch -d my-branch # Delete branch my-branch that has been merged with master
git branch -D my-branch # Forcefully delete a branch my-branch that hasn't been merged to master
# Merging
git merge master # Merge the master branch into your currently checked out branch.
git rebase master # Rebase current branch on top of master branch
# Working with Remotes
git remote # Show your current remotes
git remote -v # Show your current remotes and their URLs
git push # Publish your commits to the upstream master of your currently checked out branch
git push -u origin my-branch # Push newly created branch to remote repo setting up to track remote branch from origin.
# No need to specify remote branch name, for e.g., when doing a 'git pull' on that branch.
git pull # Pull changes from the remote to your currently checked out branch
# Re/moving files under version control
git rm <path/to/the/file> # remove file and stage the change to be committed.
git mv <source/file> <destination/file> # move/rename file and stage the change to be committed.
# Aliases - it's possible to make aliases of frequently used commands
# This is often done to make a command shorter, or to add default flags
# Adding a shorthand "sw" for "switch"
git config --global alias.sw "switch"
# Usage:
git sw master # Does a "git switch master"
## Logging
git log --graph --oneline --all # Show a nice graph of the previous commits
## Adding an alias called "lol" (log oneline..) that shows the above
git config --global alias.lol "log --graph --oneline --all"
## Using the alias
git lol # Does a "git log --graph --oneline --all"There is a very small test that you can run in powershell or bash.
It is contained in the scripts test.sh and test.ps1.
You can remove testing artifacts, exercise directories, with the git clean command:
git clean -ffdX
