DEV Community

Cover image for Git: recreating the history
Pinei
Pinei

Posted on

Git: recreating the history

Why you might want to reset the history of your Git repository and redefine the files that will be versioned?

  1. Reduce Repository Size: Over time, a repository can accumulate a large history with numerous commits, branches, and tagged releases. This can make cloning the repository very slow, especially for new team members. Resetting the history can help shrink the repository's size.

  2. Sensitive Data Removal: If sensitive data like passwords or API keys have been committed to the repository, it's crucial to remove that information. While you can remove this data in a new commit, the sensitive data will still exist in the repository's history. A hard reset is often the safest way to completely remove this data.

  3. Simplify History: A complex and messy commit history can make it difficult for team members to understand the evolution of a project. Resetting the history can simplify it by removing redundant or meaningless commits, making it easier to understand and maintain.

  4. Change of Project Scope: Sometimes projects pivot or change direction. In such cases, old files, dependencies, and even codebases may no longer be relevant. Resetting the history allows you to start anew while keeping the most relevant parts intact.

  5. Licensing or Ownership Changes: In case the project undergoes changes in licensing or ownership, you may need to remove specific parts of the history to comply with legal requirements. This can involve removing commits from contributors who have not agreed to new terms, or removing code that cannot be licensed under the new terms.

Here is a step-by-step guide:

  • 1. Create a new "orphan" branch that does not inherit history.
git checkout --orphan new_branch
Enter fullscreen mode Exit fullscreen mode
  • 2. Remove all files from the Git index (staging area).

This removes files only from the index, not from the file system.

git rm -r --cached .
Enter fullscreen mode Exit fullscreen mode
  • 3. Add the files you wish to version. Take the opportunity to set up .gitignore. Commit these changes.
git commit -m "Initial commit with selected files"
Enter fullscreen mode Exit fullscreen mode
  • 4. Delete the old main branch.
git branch -D main  # replace "main" with the name of your main branch, if different
Enter fullscreen mode Exit fullscreen mode
  • 5. Rename the new branch to be the new main branch.
git branch -m main  # again, replace "main" if necessary
Enter fullscreen mode Exit fullscreen mode
  • 6. Perform a "force push" to the remote repository.
git push -f origin main  # replace "main" and "origin" as needed
Enter fullscreen mode Exit fullscreen mode

These actions are irreversible on the remote repository and can cause issues for other collaborators who are working on the same repository. Measures need to be taken to synchronize their local copies with the new history.

By following these steps, you will create a new main branch with a new set of versioned files, discarding the previous history.

Top comments (0)