devops-exercises/exercises/git/README.md
2022-04-27 23:17:40 +03:00

7.9 KiB
Raw Blame History

Git

Exercises

Name Topic Objective & Instructions Solution Comments
My first Commit Commit Exercise Solution
Time to Branch Branch Exercise Solution
Squashing Commits Commit Exercise Solution

Questions

How do you know if a certain directory is a git repository?

You can check if there is a ".git" directory.

Explain the following: git directory, working directory and staging area

This answer taken from git-scm.com

"The Git directory is where Git stores the meta data and object database for your project. This is the most important part of Git, and it is what is copied when you clone a repository from another computer.

The working directory is a single checkout of one version of the project. These files are pulled out of the compressed database in the Git directory and placed on disk for you to use or modify.

The staging area is a simple file, generally contained in your Git directory, that stores information about what will go into your next commit. Its sometimes referred to as the index, but its becoming standard to refer to it as the staging area."

What is the difference between git pull and git fetch?

Shortly, git pull = git fetch + git merge

When you run git pull, it gets all the changes from the remote or central repository and attaches it to your corresponding branch in your local repository.

git fetch gets all the changes from the remote repository, stores the changes in a separate branch in your local repository

How to check if a file is tracked and if not, then track it?

There are different ways to check whether a file is tracked or not:

  • git ls-files <file> -> exit code of 0 means it's tracked
  • git blame <file> ...
How can you see which changes have done before committing them?

git diff

What git status does?

Branches

True or False? A branch is basically a simple pointer or reference to the head of certain line of work

True

You have two branches - main and devel. How do you make sure devel is in sync with main?
git checkout main
git pull
git checkout devel
git merge main

Describe shortly what happens behind the scenes when you run git branch

Git runs update-ref to add the SHA-1 of the last commit of the branch you're on into the new branch you would like to create

When you run git branch how does Git know the SHA-1 of the last commit?

Using the HEAD file: .git/HEAD

True or False? when you git checkout some_branch, Git updates .git/HEAD to /refs/heads/some_branch

True

Merge

You have two branches - main and devel. How do you merge devel into main?

git checkout main git merge devel git push origin main

How to resolve git merge conflicts?

First, you open the files which are in conflict and identify what are the conflicts. Next, based on what is accepted in your company or team, you either discuss with your colleagues on the conflicts or resolve them by yourself After resolving the conflicts, you add the files with `git add ` Finally, you run `git rebase --continue`

What merge strategies are you familiar with?

Mentioning two or three should be enough and it's probably good to mention that 'recursive' is the default one.

recursive resolve ours theirs

This page explains it the best: https://git-scm.com/docs/merge-strategies

Explain Git octopus merge

Probably good to mention that it's:

  • It's good for cases of merging more than one branch (and also the default of such use cases)
  • It's primarily meant for bundling topic branches together

This is a great article about Octopus merge: http://www.freblogg.com/2016/12/git-octopus-merge.html

What is the difference between git reset and git revert?

git revert creates a new commit which undoes the changes from last commit.

git reset depends on the usage, can modify the index or change the commit which the branch head is currently pointing at.

Rebase

You would like to move forth commit to the top. How would you achieve that?

Using the git rebase command

In what situations are you using git rebase?
How do you revert a specific file to previous commit?
git checkout HEAD~1 -- /path/of/the/file

How to squash last two commits?
What is the .git directory? What can you find there?
The .git folder contains all the information that is necessary for your project in version control and all the information about commits, remote repository address, etc. All of them are present in this folder. It also contains a log that stores your commit history so that you can roll back to history.

This info copied from https://stackoverflow.com/questions/29217859/what-is-the-git-folder

What are some Git anti-patterns? Things that you shouldn't do
  • Not waiting too long between commits
  • Not removing the .git directory :)
How do you remove a remote branch?

You delete a remote branch with this syntax:

git push origin :[branch_name]

Are you familiar with gitattributes? When would you use it?

gitattributes allow you to define attributes per pathname or path pattern.

You can use it for example to control endlines in files. In Windows and Unix based systems, you have different characters for new lines (\r\n and \n accordingly). So using gitattributes we can align it for both Windows and Unix with * text=auto in .gitattributes for anyone working with git. This is way, if you use the Git project in Windows you'll get \r\n and if you are using Unix or Linux, you'll get \n.

How do you discard local file changes? (before commit)

git checkout -- <file_name>

How do you discard local commits?

git reset HEAD~1 for removing last commit If you would like to also discard the changes you `git reset --hard``

True or False? To remove a file from git but not from the filesystem, one should use git rm

False. If you would like to keep a file on your filesystem, use git reset <file_name>

References

How to list the current git references in a given repository?

find .git/refs/