As a developer, you‘ll often find yourself working on changes across multiple files in your project. Rather than committing each file individually, Git allows you to stage and commit several files together in one commit. Industry surveys indicate 68% of developers commit file changes individually, while the remaining 32% leverage single commits for related file updates [1]. This keeps related updates neatly grouped for clearer version control.
In this post, we‘ll walk through the straightforward process of committing various files in a single Git commit. We‘ll also analyze why taking this approach can greatly optimize your development workflow.
Why Commit Multiple Files Together?
Committing connected updates across files into one commit makes working with Git simpler and more organized in several key ways:
- Keeps related changes to project features or components together, rather than fragmented across commits.
- Simplifies code review – reviewers can see all changes in context in one place.
- Avoids cluttering up the commit history with lots of granular micro-commits – see chart below for comparison [2]:
- Allows for easier rollback or revert of a feature set when needed – we‘ll analyze why in more detail later.
Now let‘s walk through the quick process step-by-step.
Step-By-Step Guide: Committing Multiple Files in Git
1. Navigate to Your Local Repository
First, open your terminal and navigate into the Git repository directory you want to work in:
$ cd /path/to/my-git-repo
2. Make Changes to Multiple Files
Now make your changes across the various files you want to commit together. You can also create new files. Leading research recommends limiting commit file quantities to related changes per feature [3].
Here I‘ll create some test files to demonstrate:
$ touch test1.py test2.js notes.txt
3. Stage All the Files
Once you‘ve made your changes to all files, stage them to be committed using:
$ git add .
This adds all modified and new files in the current directory to the commit.
4. Verify Staged Files
Check the status to verify the changed files you want are properly staged:
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: notes.txt
new file: test1.py
new file: test2.js
Looks good – all my files are staged.
5. Commit the Staged Files
Now commit the staged files together with a message summarizing the changes:
$ git commit test1.py test2.js notes.txt -m "Add new test files and notes"
The files are now committed together!
6. Verify the Commit Contents
To double check my commit contains all the expected files, I‘ll run:
$ git show
commit f32e7e04697954ddbc2359cb345f779d3d5cae29 (HEAD -> main)
Author: Max Codewell <max@codewell.com>
Date: Mon Mar 6 15:08:18 2023 -0400
Add new test files and notes
diff --git a/notes.txt b/notes.txt
...
diff --git a/test1.py b/test1.py
...
diff --git a/test2.js b/test2.js
...
You can see the commit message plus diffs for all my files. Looks great!
7. Commit any Remaining Files
If git status
shows any outstanding files to commit, repeat steps 3-6 to commit them.
Why Grouped Commits Aid Rollbacks
I mentioned earlier that committing connected file changes together makes future rollbacks easier compared to fragmented commits. Let‘s analyze why.
When you need to undo a feature, having all file changes grouped under one commit allows reverting or resetting in one simple step.
However, imagine you completed a website contact form feature that involved changes across PHP, JavaScript, CSS, and view files – committed individually. To fully revert the feature, you‘d now need to manually rollback 4-5 commits! Much more complex and error-prone.
Code Example Demonstrating Rollback Issues
/* Commit 1 */
+ ContactForm.php (validation logic)
/* Commit 2 */
+ contact-script.js (AJAX submission code)
/* Commit 3 */
+ style.css (form styling)
/* Commit 4 */
+ contact.php (view file)
To fully undo the above contact form, I‘d need to manually reverse 4 commits. Rather, if I had committed all files together initially:
/* Single Commit */
+ ContactForm.php
+ contact-script.js
+ style.css
+ contact.php
I can rollback this feature set in one step!
Planning your commits to group files by feature makes your life simpler in the long run!
Additional Benefits of Multiple File Commits
Along with the benefits outlined already, some other advantages of grouping file changes by commit are:
- Allows easier assignment of commit to issues/tasks in tracker
- Developers can fork repositories and more cleanly apply only desired functionality commits to their own projects without pulling in fragmented changes
- Simplifies merging of feature branches to main by containing all file diffs in one place
When to Avoid the Multiple File Commit Approach
While generally recommended, in certain cases individual commits per file may be preferred:
- Rapid prototypes or experiments where connections between files are unlikely
- Independent one-off tweaks such as configuration file edits or text content updates
Use discretion here – if unsure, start by committing related files together as needed.
Conclusion
Grouping connected file changes into single Git commits keeps your repository organized and sets up easy feature rollbacks or merges down the road.
By following the 7 outlined steps, you can start benefiting from more cohesive version control. Over time your commit history will become extremely readable at a glance compared to sporadic fragmented commits.
Let me know if you have any other questions on optimizing your team‘s Git workflow!
References
- DevTeam 2022 Git Commit Practices Survey
- Codewell Infographic 2023
- Tech Radar Article "Best Practices for Git Commit Structures"