Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Move a single file out of a git commit and place it in separate git commit

Tags:

git

I have committed certain number of file in git e.g.

Commit 1 contains:

  • file1
  • file2[renamed]
  • file3
  • file4

Now I want to move file2[renamed] file to be placed in different commit without disturbing other files. Is it possible in git?

like image 950
Shriram Avatar asked Sep 05 '25 03:09

Shriram


1 Answers

  1. reset with the soft flag to keep the staged changes
  2. reset the renamed files individually
  3. make new commits

initialize repository

jeff ~ $ mkdir tg
jeff ~ $ cd tg
jeff tg $ git init
Initialized empty Git repository in /home/administrator/tg/.git/
jeff tg (master #) $ touch file1
jeff tg (master #) $ touch file2a
jeff tg (master #) $ touch file3
jeff tg (master #) $ touch file4
jeff tg (master #) $ git add .
jeff tg (master #) $ git commit -m "init"
[master (root-commit) c4668aa] init
 4 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
 create mode 100644 file2a
 create mode 100644 file3
 create mode 100644 file4

make changes and commit 1

jeff tg (master) $ mv file2a file2
jeff tg (master *) $ echo amendment >> file1
jeff tg (master *) $ echo amendment >> file3
jeff tg (master *) $ echo amendment >> file4
jeff tg (master *) $ git add .
jeff tg (master +) $ git status 
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   file1
        renamed:    file2a -> file2
        modified:   file3
        modified:   file4

jeff tg (master +) $ git commit -m "commit 1"
[master b84034a] commit 1
 4 files changed, 3 insertions(+)
 rename file2a => file2 (100%)

soft reset and unstage desired separate changes

jeff tg (master) $ git reset --soft HEAD~
jeff tg (master +) $ git reset -- file2a
Unstaged changes after reset:
D       file2a
jeff tg (master *+) $ git status 
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   file1
        new file:   file2
        modified:   file3
        modified:   file4

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    file2a

jeff tg (master *+) $ git reset -- file2
Unstaged changes after reset:
D       file2a
jeff tg (master *+) $ git status 
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   file1
        modified:   file3
        modified:   file4

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    file2a

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        file2

make commit with just other changes files (not renamed one)

jeff tg (master *+) $ git commit -m "commit 2"
[master 2f29079] commit 2
 3 files changed, 3 insertions(+)

now add and commit renamed file

jeff tg (master *) $ git add .
jeff tg (master +) $ git status 
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    file2a -> file2

jeff tg (master +) $ git commit -m "commit 3"
[master e2fd651] commit 3
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename file2a => file2 (100%)
like image 102
Jeff Puckett Avatar answered Sep 07 '25 22:09

Jeff Puckett



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!