And you shall know the truth,
& the truth shall set you free.
John 8:32

Basics

Add user for all repositories
	git config --global user.name "Mona Lisa"
	git config --global user.name

Add email for all repositories
	git config --global user.email "[email protected]"
	git config --global user.email

Add email for single repository
	Change directory
	git config user.email "[email protected]"
	git config user.email

Skipping files:
	1. touch .gitignore
	2. Add filename per line

Adding a file to staging area
	git add <filename>

Adding all files to staging area
	git add -A

Resetting staging area
	git reset

Remove specific additions
	git reset <filename>

Commit changes
	git commit -m "Msg"

View commit log
	git log

Quick Push

git init
git add .
git commit -m "First commit"
git remote add origin <URL>
git remote -v
git push -u origin master

Workflow

Cloning a remote repo
 git clone <url> <destination>
		or
 git clone <url> . (where . is the current directory)

View remote repo information
	git remote -v
	git branch -a

Pushing changes made in local machine to remote repo
	git diff
	git status
	git add -A
	git commit -m "Some msg on changes made"
	git pull origin master (Pull changes made by others)
	git push origin master (Commit our changes)

Workflow
	git branch <branch name> (Create a branch. Usually named after a feature)
	git branch -a (view all branches)
	git checkout <branch name> (change working branch)
	make changes
	git add -A
	git commit -m "Some msg"
	git push -u origin <branch name>
	git branch -a
	git checkout master
	git pull origin master
	git branch --merged (view merged branches)
	git merge <branch name>
	git push origin master
	git branch --merged (verify by viewing merged branches)
	git branch -d <branch name> (delete branch from local repo after merging)
	git push origin --delete <branch name> (delete branch from remote repo after merging)

Cloning Repos

Method 1:

import requests
import os
from git import Repo

def download_all_repos(github_username, token=None):
    """Downloads all public repositories of a GitHub user.

    Args:
        github_username (str): The username of the GitHub user.
        token (str, optional): A GitHub personal access token for private repos. Defaults to None.
    """

    base_url = f"https://api.github.com/users/{github_username}/repos"
    headers = {"Authorization": f"token {token}" if token else None}

    while True:
        response = requests.get(base_url, headers=headers)
        response.raise_for_status()  # Raise an exception for non-200 status codes

        repos = response.json()
        for repo in repos:
            repo_name = repo["name"]
            clone_url = repo["clone_url"]

            try:
                Repo.clone_from(clone_url, repo_name)
                print(f"Downloaded {repo_name} successfully.")
            except Exception as e:
                print(f"Error downloading {repo_name}: {e}")

        # Check for pagination
        next_page_url = response.links.get("next", {}).get("url")
        if not next_page_url:
            break
        base_url = next_page_url

if __name__ == "__main__":
    github_username = input("Enter the GitHub username: ")
    access_token = input("Enter your personal access token (for private repos): ")
    download_all_repos(github_username, token=access_token)

Method 2:

curl -s https://api.github.com/users/BijuAle/repos | grep \"clone_url\"
| awk '{print $2}' | sed -e 's/"//g' -e 's/,//g' | xargs -n1 git clone

Method 3:

minhaskamal.github.io/DownGit

Fix Commit Flaw

Clear changes made before adding to staging area
	git checkout <filename>

Fix wrong commit msg
	git commend --ammend -m "New msg"

Use last commit for new change
	git commit --ammend
	:wq
	git log --stat (View changes made per commit)

Move commit from one branch to other
	git log (Copy commit hash from the wrong branch)
	git checkout <branch name> (Switch to the correct branch)
	git log
	git cherry-pic <commit hash>
	git log (Commit copied to the correct branch)
	git checkout <branch name> (Switch to the wrong branch)
	git log (Grab the latest good commit)
	git reset --hard <commit hash>
	git clean -df (if there are untracked files)

Types of reset
	git reset --soft <commit hash>	(Remove other commits & bring changes back to staging directory)
	git reset <commit hash> (Default/Mixed reset. Remove other commits & bring changes to working directory )
	git reset --hard <commit hash>	(Remove all changes)

Remove untracked files (Example usecase: accidentaly extracting a zip file on a git repo)
	 git clean -df

View action log
	git reflog

Recover accidentaly removed changes
	git reflog (Get the safe action hash preceding accidental action hash)
	git checkout <action hash>
	git log (View to-recover commits in headless mode)
	git branch backup (Recover all commits and move to a branch)

Rever repo back to previous commit
	git reset --hard <old-commit-id>
\tgit push -f <remote-name> <branch-name>

Remove GitIgnore old files

git rm -r --cached node_modules
git commit -m 'Remove the now ignored directory node_modules'
git push origin master

Reset commit history

1. Checkout:
git checkout --orphan latest_branch

2. Add all the files:
git add -A

3. Commit the changes:
git commit -am "commit message"

4. Delete the branch:
git branch -D master

5. Rename the current branch to master:
git branch -m master

6. Finally, force update your repository:
git push -f origin master