Time Travel with Git: How to Commit in the Past

Have you ever wished you could turn back time and make a change to your code in the past? With Git, you can do something close! While you can't physically go back in time, you can manipulate the commit history so that a commit appears to have been made at an earlier point. This post will guide you on how to commit in the past using Git.

Before we begin, it's crucial to mention that altering commit history should be used sparingly and with caution, especially if you're working with others. These changes will rewrite history, which can cause confusion or conflicts for other developers working on the same project.

Step 1: Perform the Rebase

The git rebase command is a powerful tool that allows you to modify the order of commits. Let's say you have a commit C that you want to move before commit B. Here's how you can do it:

  1. Use git log to display the commit history. Note the commit hash of the commit prior to the one you want to change. In our example, this is the commit before commit B.

  2. Start an interactive rebase with the git rebase -i command, followed by the commit hash you noted in the first step.

  3. In the text editor that opens, reorder the lines to reflect the order you want your commits to appear in. In our example, move the line with commit C above the line with commit B.

  4. Save and close the text editor.

Step 2: Resolve Conflicts (If Any)

During the rebase, if any conflicts arise due to the reordering, Git will notify you with a message like this:

error: could not apply fa39187... something to add to patch A

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

If you encounter this, you have three choices:

  • git rebase --abort: This will completely undo the rebase and return your branch to the state it was in before you called git rebase.

  • git rebase --skip: This will skip the problematic commit. Be aware that this means none of the changes introduced by the conflicting commit will be included.

  • Fix the conflict: This is the most common choice, and the rest of this section will explain how to do it.

To fix the conflict, follow these steps:

  1. Navigate into the local Git repository that has the merge conflict:
cd REPOSITORY-NAME
  1. Generate a list of the files affected by the merge conflict:
git status
  1. Open the conflicting file in your preferred text editor. The conflict is marked by <<<<<<<, =======, and >>>>>>> markers. The changes from the HEAD or base branch are located after the line <<<<<<< HEAD. The ======= marker separates your changes from the changes in the other branch, which follow until the >>>>>>> BRANCH-NAME marker.

  2. Resolve the conflict by choosing to keep your branch's changes, the other branch's changes, or create a new change that may incorporate changes from both branches. Remove the conflict markers and make your desired changes to the final merge.

  3. Add or stage your changes:

git add .
  1. Commit your changes with a comment:
git commit -m "Resolved merge conflict by incorporating both suggestions."

If the conflict was caused by a situation where one person deleted a file and another person edited the same file, you would need to decide whether to delete or keep the removed file. To add the removed file back to your repository, use:

git add FILENAME

To remove the file from your repository, use:

git rm FILENAME

Then commit your changes with a comment:

git commit -m "Resolved merge conflict by keeping/deleting FILENAME."

Once all conflicts are resolved and the changes are committed, use git rebase --continue to proceed with the rebase.

Step 3: Change the Commit Date

After you've completed your rebase and resolved any conflicts, you're ready to change the date of the commit.

To change the date of a specific commit, you'll need to use the git commit --amend --date command, followed by the date you want to set. The date should be in the format: "YYYY-MM-DD hh:mm". Here's an example:

export GIT_AUTHOR_DATE="YYYY-MM-DDThh:mm:ss"
export GIT_COMMITTER_DATE="YYYY-MM-DDThh:mm:ss"
git commit --amend --date="YYY-MM-DD hh:mm"

This will open a text editor where you can change the commit message. If you don't want to change the commit message, simply save and close the file.

Keep in mind that this command only changes the date of the last commit. If you want to change the date of a commit further back in your history, you'll need to use the git rebase command again to move to that point in your commit history.

And that's it! You've successfully traveled back in time and made a commit in the past.

Did you find this article valuable?

Support Kaan Berke UGURLAR by becoming a sponsor. Any amount is appreciated!