miguel
07e39a6878
|
5 months ago | |
---|---|---|
.. | ||
audit | 7 months ago | |
README.md | 5 months ago |
README.md
Git Ready
Introduction
This project is designed to introduce you to the world of version control and collaboration using Git. Git is a powerful and widely used tool for tracking changes in your projects, collaborating with others, and ensuring the integrity of your code.
Throughout this project, you will embark on a journey of progressively building your Git skills. Starting from the basics, you'll gradually explore more advanced topics, equipping yourself with the essential knowledge and practices for effective version control and collaboration.
Let's Git ready for it!
Instructions
To begin, create a work
directory and organize all your tasks within it. Each exercise should be encapsulated in its own file, named after the corresponding task for clarity and ease of reference.
Accompanying your work, provide documentation or a report detailing the process followed for each exercise. This documentation should include any challenges faced, solutions implemented, and lessons learned. It could be in the form of a README file or a separate document. Make sure to show it to the auditor during evaluation.
⚠️ Your completion of tasks will be evaluated based on the commit history reflecting the changes made throughout the exercises and the presence of accompanying documentation detailing the process followed.
Here is an example of a file that you can deliver to your auditor to help with the review process:
#### Conflicts, merging and rebasing
# Merge Main into Greet Branch
<Write the command here>
# Switch to main branch and make changes to hello.sh file
<Write the command here>
# Merging Main into Greet Branch (Conflict)
<Write the command here>
# Resolve the conflict (manually or using merge tools)
<Write the command here>
# After resolving, stage the changes and commit
<Write the command here>
# Rebasing Greet Branch
<Write the command here>
# Merging Greet into Main
<Write the command here>
Setting Up Git
- Install Git on your local machine by following the instructions for your operating system on the official Git website.
- Configure Git with your username and email address.
Git commits to commit
- Within the
work
directory, establish a subdirectory namedhello
. Inside this directory, generate a file titledhello.sh
and input the following content:
echo "Hello, World"
- Initialize the git repository in the
hello
directory. - Check the status and act accordingly with the output of the executed command.
- Change the
hello.sh
content to the following:
#!/bin/bash
echo "Hello, $1"
- Stage the changed file and commit the changes, the working tree should be clean.
- Modify the
hello.sh
file to include comments and stage it.
#!/bin/bash
# Default is "World"
name=${1:-"World"}
echo "Hello, $name"
- Make two separate commits:
- The first commit should be for the comment in line 3.
- The second commit should include changes made to lines 4 and 5.
History
- Show the history of the working directory.
- Show One-Line History for a condensed view showing only commit hashes and messages.
- Controlled Entries:
- You need to customize the log output by specifying the number of entries or a time range. Customize it to display the last
2 entries
and to view thecommits made within the last 5 minutes
.
- You need to customize the log output by specifying the number of entries or a time range. Customize it to display the last
- Personalized Format:
- Show logs in a personalized format, including the commit hash, date, message, branch information, and author name, resembling
* e4e3645 2023-06-10 | Added a comment (HEAD -> main) [John Doe]
- Show logs in a personalized format, including the commit hash, date, message, branch information, and author name, resembling
Check it out
- Restore First Snapshot:
- Revert the working tree to its initial state, as captured in the first snapshot, and then print the content of the
hello.sh
file.
- Revert the working tree to its initial state, as captured in the first snapshot, and then print the content of the
- Restore Second Recent Snapshot:
- Revert the working tree to the second most recent snapshot and print the content of the
hello.sh
file.
- Revert the working tree to the second most recent snapshot and print the content of the
- Return to Latest Version:
- Ensure that the working directory reflects the latest version of the
hello.sh
file present in the main branch, without referring to specific commit hashes.
- Ensure that the working directory reflects the latest version of the
TAG me
- Referencing Current Version:
- Tag the current version of the repository as
v1
.
- Tag the current version of the repository as
- Tagging Previous Version:
- Tag the version immediately prior to the current version as
v1-beta
, without relying on commit hashes to navigate through the history.
- Tag the version immediately prior to the current version as
- Navigating Tagged Versions:
- Move back and forth between the two tagged versions,
v1
andv1-beta
.
- Move back and forth between the two tagged versions,
- Listing Tags:
- Display a list of all tags present in the repository to verify successful tagging.
Changed your mind?
- Reverting Changes:
- Modify the latest version of the file with unwanted comments, then revert it back to its original state before staging using a
Git
command.
- Modify the latest version of the file with unwanted comments, then revert it back to its original state before staging using a
#!/bin/bash
# This is a bad comment. We want to revert it.
name=${1:-"World"}
echo "Hello, $name"
- Staging and Cleaning:
- Introduce unwanted changes to the file, stage them, then clean the staging area to discard the changes.
#!/bin/bash
# This is an unwanted but staged comment
name=${1:-"World"}
echo "Hello, $name"
- Committing and Reverting:
- Add the following unwanted changes again, stage the file, commit the changes, then revert them back to their original state.
#!/bin/bash
# This is an unwanted but committed change
name=${1:-"World"}
echo "Hello, $name"
- Tagging and Removing Commits:
- Tag the latest commit with
oops
, then remove commits made after thev1
version. Ensure that theHEAD
points tov1
.
- Tag the latest commit with
- Displaying Logs with Deleted Commits:
- Show the logs with the deleted commits displayed, particularly focusing on the commit tagged
oops
.
- Show the logs with the deleted commits displayed, particularly focusing on the commit tagged
- Cleaning Unreferenced Commits:
- Ensure that unreferenced commits are deleted from the history, meaning there should be no logs for these deleted commits.
- Author Information:
- Add an author comment to the file and commit the changes.
#!/bin/bash
# Default is World
# Author: Jim Weirich
name=${1:-"World"}
echo "Hello, $name"
- Oops the author email was forgotten, update the file to include the email without making a new commit, but include the change in the last commit.
Move it
- Moving hello.sh:
- Using Git commands, move the program
hello.sh
into alib/
directory, and then commit the move. - Create a
Makefile
in the root directory of the repository with the provided content and commit it to the repository.
- Using Git commands, move the program
TARGET="lib/hello.sh"
run:
bash ${TARGET}
blobs, trees and commits
- Exploring
.git/
Directory:- Navigate to the
.git/
directory in your project and examine its contents.You will have to explain the purpose of each subdirectory, includingobjects/
,config
,refs
, andHEAD
in the audit.
- Navigate to the
- Latest Object Hash:
- Find the latest object hash within the
.git/objects/
directory using Git commands and print the type and content of this object using Git commands.
- Find the latest object hash within the
- Dumping Directory Tree:
- Use Git commands to dump the directory tree referenced by this commit.
- Dump the contents of the
lib/
directory and thehello.sh
file using Git commands.
Branching
It’s time to do a major rewrite of the hello world functionality. Since this might take a while, you’ll want to put these changes into a separate branch to isolate them from changes in the main branch.
- Create and Switch to New Branch:
- Create a local branch named
greet
and switch to it. - In the
lib
directory, create a new file namedgreeter.sh
and add the provided code to it. Commit these changes.
- Create a local branch named
#!/bin/bash
Greeter() {
who="$1"
echo "Hello, $who"
}
- Update the
lib/hello.sh
file by adding the content below, stage and commit the changes.
#!/bin/bash
source lib/greeter.sh
name="$1"
if [ -z "$name" ]; then
name="World"
fi
Greeter "$name"
- Update the
Makefile
with the following comment and commit the changes.
# Ensure it runs the updated lib/hello.sh file
TARGET="lib/hello.sh"
run:
bash ${TARGET}
- Switch back to the
main
branch, compare and show the differences between themain
andgreet
branches forMakefile
,hello.sh
, andgreeter.sh
files. - Generate a
README.md
file for the project with the provided content. Commit this file.
This is the Hello World example from the git project.
- Draw a commit tree diagram illustrating the diverging changes between all branches to demonstrate the branch history.
Conflicts, merging and rebasing
- Merge Main into Greet Branch:
- Start by merging the changes from the
main
branch into thegreet
branch. - Switch to
main
branch and make the changes below to thehello.sh
file, save and commit the changes.
- Start by merging the changes from the
#!/bin/bash
echo "What's your name"
read my_name
echo "Hello, $my_name"
- Merging Main into Greet Branch (Conflict):
- Attempt to merge the
main
branch intogreet
. Bingooo! There you have it, aconflict
. - Resolve the conflict (manually or using graphical merge tools), accept changes from
main
branch, then commit the conflict resolution.
- Attempt to merge the
- Rebasing Greet Branch:
- Go back to the point before the initial merge between
main
andgreet
. - Rebase the
greet
branch on top of the latest changes in themain
branch.
- Go back to the point before the initial merge between
- Merging Greet into Main:
- Merge the changes from the
greet
branch into themain
branch.
- Merge the changes from the
- Understanding Fast-Forwarding and Differences:
- Explain fast-forwarding and the difference between merging and rebasing.
Local and remote repositories
-
In the
work/
directory, make a clone of the repositoryhello
ascloned_hello
. (Do not usecopy
command) -
Show the logs for the cloned repository.
-
Display the name of the remote repository and provide more information about it.
-
List all remote and local branches in the
cloned_hello
repository. -
Make changes to the original repository, update the
README.md
file with the provided content, and commit the changes.
This is the Hello World example from the git project.
(changed in the original)
-
Inside the cloned repository (
cloned_hello
), fetch the changes from the remote repository and display the logs. Ensure that commits from thehello
repository are included in the logs. -
Merge the changes from the remote
main
branch into the localmain
branch. -
Add a local branch named
greet
tracking the remoteorigin/greet
branch. -
Add a
remote
to your Git repository and push themain
andgreet
branches to theremote
. -
Be ready for this question in the audit!
"What is the single git command equivalent to what you did before to bring changes from remote to local main
branch?"
Bare repositories
- What is a bare repository and why is it needed?
- Create a bare repository named
hello.git
from the existinghello
repository. - Add the bare
hello.git
repository as a remote to the original repositoryhello
. - Change the
README.md
file in the original repository with the provided content:
This is the Hello World example from the git project.
(Changed in the original and pushed to shared)
-
Commit the changes and push them to the shared repository.
-
Switch to the cloned repository
cloned_hello
and pull down the changes just pushed to the shared repository.
Submission and Evaluation
Your work must be submitted at the gitea
link provided. The evaluation will be carried out based on your submission and according to the following criteria:
- Correctness of the git commands you are using.
- Clear understanding of the git commands and concepts.