Home Git 10 Git commands for seamless conflict management

10 Git commands for seamless conflict management

Git merge conflicts can disrupt your development flow. Arm yourself with these 10 essential commands to streamline conflict resolution and maintain a clean codebase.

by Arun Kumar
git conflicts management

In my years of coding and collaborating on various projects, I’ve come to appreciate the power of Git. It’s a lifesaver for managing code changes, but it can also become a headache, especially when conflicts arise. Oh, how many times have I sighed deeply upon seeing that dreaded message: “CONFLICT (content): Merge conflict in [file-name]”. Yet, through it all, I’ve picked up a repertoire of commands to efficiently handle these conflicts. Today, I’d love to share them with you!

Why do conflicts happen in the first place?

Before diving into commands, let’s understand the root of the problem. Conflicts often occur when multiple contributors make changes to the same section of a file and Git doesn’t know which change to take. Imagine two cooks adding different ingredients to the same pot — Git gets puzzled on which flavor to go for.

Getting started: recognizing a conflict

A surefire way to recognize you’ve landed in conflict territory is this message:

Auto-merging [file-name]
CONFLICT (content): Merge conflict in [file-name]
Automatic merge failed; fix conflicts and then commit the result.

Heart sinking, isn’t it? But fret not; armed with the right commands, you can resolve this smoothly.

Git commands for managing conflicts

1. git status

General syntax:

git status

Example input:

git status

Example output:

On branch feature-branch
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   [file-name]

This command is our beacon, helping us identify the files causing the conflict. Whenever in doubt, I run this command. It’s like asking a friend, “Hey, where’s the problem?”

2. git diff

General syntax:

git diff

Example input:

git diff

Example output:

diff --cc [file-name]
index [hash1],[hash2]..[hash3]
--- a/[file-name]
+++ b/[file-name]
@@@ -1,6 -1,6 +1,10 @@@
  Here's some code.
++<<<<<<< HEAD
 +This is your change.
++=======
+ This is the change from the other branch.
++>>>>>>> [branch-name]

A personal favorite! git diff visually highlights the differences between branches. It’s a nifty way to pinpoint exactly what’s clashing.

3. Manual conflict resolution

Sometimes, the best tool is your own judgment. Here’s what a conflict looks like:

<<<<<<< HEAD
This is your change.
=======
This is the change from the other branch.
>>>>>>> [branch-name]

To manually resolve:

  1. Open the conflicting file in your favorite editor (for me, it’s VS Code).
  2. Decide which change to keep, delete the other, and also remove the Git markers (<<<<<<<, =======, >>>>>>>).
  3. Save the file.

Honestly, sometimes I find this method the quickest, though it does require some human touch.

4. git add

General syntax:

git add [file-name]

Example input:

git add example.txt

No specific output for this command, but it signifies to Git that you’ve resolved the conflict. It’s like reassuring Git, “I’ve got this under control!”

5. git commit

General syntax:

git commit -m "Resolve merge conflict in [file-name]"

Example input:

git commit -m "Resolve merge conflict in example.txt"

Example output:

[feature-branch hash] Resolve merge conflict in example.txt

Once conflicts are resolved, seal the deal with a commit. I always add a message noting the conflict resolution for clarity.

6. git merge --abort

General syntax:

git merge --abort

Example input:

git merge --abort

There’s no specific output, but if ever you feel overwhelmed and want to start afresh, this command is a lifesaver. It aborts the merge process and returns to the state before the merge began. Honestly, I’ve used this more times than I’d like to admit!

7. git log --merge

General syntax:

git log --merge

Example input:

git log --merge

Example output:

commit [hash]
Author: [Author Name]
Date: [Date]

    Your commit message here

I’ve always found this command interesting. It shows the commit logs of the conflicting changes. It’s particularly handy when you need a detailed view of what’s been happening in both branches leading to the conflict.

8. git checkout --ours [file-name] and git checkout --theirs [file-name]

General syntax:

git checkout --ours [file-name] git checkout --theirs [file-name]

Example input:

git checkout --ours example.txt

OR

git checkout --theirs example.txt

There’s no specific output, but these commands help in accepting changes entirely from one branch or another. --ours takes changes from the current branch you’re on, while --theirs takes changes from the branch you’re merging. There have been times when I just wanted to accept all changes from one branch without manually editing the file, and these commands came to the rescue!

9. git reflog

General syntax:

git reflog

Example input:

git reflog

Example output:

[hash1] HEAD@{0}: merge feature-branch: Merge made.
[hash2] HEAD@{1}: checkout: moving from feature-branch to main
...

git reflog is like a magic wand in Git. It provides a history of where your HEAD and branch references have been. In chaotic moments of conflict, I’ve often used this to trace back my steps. It’s especially handy if you want to find lost commits or understand the sequence of actions leading to the conflict.

10. git reset

General syntax:

git reset [commit-hash]

Example input:

git reset abc1234

There’s no specific output, but the command resets your branch to the specified commit, discarding commits made after the provided hash. This is super useful when you want to backtrack your changes and start over. But a word of caution: be sure about this action since it does discard commits!

Additional tips and tricks

  • Regularly pull from the main branch: I’ve found that staying updated reduces conflicts.
  • Communicate with your team: A little heads-up about changes can prevent clashing edits.
  • Use tools: GUI tools like “SourceTree” or “GitKraken” can help visualize and resolve conflicts. But I’m old-school and love the command line!

Frequently Asked Questions (FAQs) on Git Conflicts

Here are some commonly asked questions about managing conflicts in Git for your quick reference.

1. What causes a merge conflict in Git?

Merge conflicts occur when changes are made to the same part of a file concurrently, and Git cannot automatically determine which change should prevail. Imagine two authors editing the same line in a story; Git gets stuck deciding whose narrative to choose.

2. Can I avoid merge conflicts altogether?

While you can’t avoid them entirely, regular communication with your team and frequently pulling the latest changes from the main branch can significantly reduce their occurrence. It’s always easier to integrate small, regular changes than a massive chunk of edits at once.

3. What’s the difference between --ours and --theirs during a conflict resolution?

These options determine which version of a file to accept during a conflict. --ours keeps the version from your current branch, while --theirs takes the version from the branch you’re merging. I’ve often used these when I’m confident about one version being superior to the other.

4. I resolved a conflict but made a mistake. Can I redo it?

Absolutely! If you haven’t committed yet, just run git checkout --conflict [file-name] to bring back the conflict markers. If you’ve already committed, you can use git reset to backtrack or manually edit the file and commit again.

5. How can I see a visual representation of the merge conflicts?

There are various GUI tools available that can visually represent and assist in resolving merge conflicts. Some popular ones include “SourceTree”, “GitKraken”, and the built-in Git functionality in editors like “VS Code” and “Atom”. I’ve dabbled with these from time to time, and they can be especially helpful for visual folks.

6. What’s the difference between git merge --abort and git reset?

Both commands can help you revert changes, but they serve different purposes. git merge --abort will cancel the merge operation and return your branch to the state before the merge started. On the other hand, git reset will move your branch back to a specific commit, discarding commits made after the provided hash. Use reset with caution!

7. Can I prevent specific files from causing conflicts, like configuration files?

Yes! You can use a .gitattributes file to specify merge strategies for specific files or file patterns. By setting the merge strategy to ours for a file, Git will always choose your branch’s version of the file during a conflict.

Conclusion

Navigating the world of Git, especially when it comes to conflicts, can initially seem like a daunting task. However, with the right commands, a bit of patience, and understanding from our detailed guide and FAQs, you can confidently manage even the trickiest of merge conflicts. By learning how to recognize conflicts, by using commands like git diff to dive into resolutions, by backtracking with git reset, and by clarifying doubts with our FAQ, you’ll have a comprehensive set of tools to help you manage your coding collaborations seamlessly.

You may also like

Leave a Comment

fl_logo_v3_footer

ENHANCE YOUR LINUX EXPERIENCE.



FOSS Linux is a leading resource for Linux enthusiasts and professionals alike. With a focus on providing the best Linux tutorials, open-source apps, news, and reviews written by team of expert authors. FOSS Linux is the go-to source for all things Linux.

Whether you’re a beginner or an experienced user, FOSS Linux has something for everyone.

Follow Us

Subscribe

©2016-2023 FOSS LINUX

A PART OF VIBRANT LEAF MEDIA COMPANY.

ALL RIGHTS RESERVED.

“Linux” is the registered trademark by Linus Torvalds in the U.S. and other countries.