Last active
September 9, 2024 14:20
-
-
Save eliemichel/3af4a0cdac2434e16e74f96516571ae7 to your computer and use it in GitHub Desktop.
Resolve conflicted areas of a file in favor of theirs or ours and leave correctly merged areas as is
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is an automation of https://stackoverflow.com/questions/71783590/git-merge-strategy-option-theirs-for-individual-files | |
# Example: | |
# git_resolve.py --theirs path/to/some/file | |
import os | |
import argparse | |
from shutil import copyfile | |
import subprocess | |
parser = argparse.ArgumentParser(description='Resolve conflicted areas of a file during a git merge') | |
parser.add_argument('path', type=str, help='Path of the file for which to resolve merge conflict') | |
parser.add_argument('--theirs', action='store_true', help='Use their version wherever there is a conflict') | |
parser.add_argument('--ours', action='store_true', help='Use our version wherever there is a conflict') | |
args = parser.parse_args() | |
def run(cmd, outfilename=None): | |
if outfilename is not None: | |
with open(outfilename, "w") as outfile: | |
subprocess.run(cmd, stdout=outfile) | |
else: | |
subprocess.run(cmd) | |
def main(args): | |
if args.theirs and args.ours: | |
print("Error! You must chose either --theirs or --ours but not both") | |
exit(1) | |
elif args.theirs: | |
which_one = "--theirs" | |
elif args.ours: | |
which_one = "--ours" | |
else: | |
print("Error! You must chose one of --theirs or --ours") | |
exit(1) | |
run(["git", "show", f":1:{args.path}"], f"{args.path}.base") | |
run(["git", "show", f":2:{args.path}"], f"{args.path}.ours") | |
run(["git", "show", f":3:{args.path}"], f"{args.path}.theirs") | |
run(["git", "merge-file", which_one, f"{args.path}.ours", f"{args.path}.base", f"{args.path}.theirs"]) | |
copyfile(f"{args.path}.ours", f"{args.path}") | |
os.remove(f"{args.path}.base") | |
os.remove(f"{args.path}.base") | |
os.remove(f"{args.path}.theirs") | |
main(parser.parse_args()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
should probably be
os.remove(f"{args.path}.ours")
as thebase
file is removed twice here, but theours
file is left in place.