Git merge left HEAD marks in my files

2019-01-01 01:29发布

问题:

I tried to merge a file in the command line using Git, when an error message appeared telling me the merge was aborted.

I thought that was the end of it, but then I realized there are gitmarks in my files. Like so:

start =
    expression

validchar = 
    [0-9a-zA-Z_?!+\\-=@#$%^&*/.]

integer = 
<<<<<<< HEAD
    digits:[0-9]+
        { return digits.join(\"\"); }
=======
    sign:\"-\"* digits:[0-9]+
        { return sign + digits.join(\"\"); }
>>>>>>> gh-pages

The files have been edited not by me and show lines inserted with:

  • HEAD after less than signs (<<<<<<< HEAD)
  • lines of changed code
  • a string of equals signs (=======)
  • the new version of the code
  • another line starting with greater than signs and the name of the branch (>>>>>>> gh-pages)

What\'s worse is that the file contents are no longer in order. Does anyone know how I get those files back to normal, and the changes I made in the gh-branch merged into the master branch?

回答1:

Those are conflict markers. You\'re still in the process of merging, but there were some parts that Git couldn\'t merge automatically. You\'ll need to hand-edit those parts to what you want them to be and then commit the results.


For instance, in your particular case, you\'d probably want to resolve it like this (note - the arrows/text on the right are just my notes, not something you\'d type into the file):

integer = 
<<<<<<< HEAD                                  <-+ remove the bits here
    digits:[0-9]+                               |
        { return digits.join(\"\"); }             |
=======                                       <-+
    sign:\"-\"* digits:[0-9]+
        { return sign + digits.join(\"\"); }
>>>>>>> gh-pages                              <-- and this

and thus you\'d save the file as...

integer = 
    sign:\"-\"* digits:[0-9]+
        { return sign + digits.join(\"\"); }


回答2:

Absolutely start with \'git status\' to see what you\'ve got. If you aborted a merge (or had a merge aborted) and you\'ve got conflicted files in the working directory then something went wrong. The Git status will tell you where you are. After that, you have a number of options. You should resolve the merge commit either by-hand, which can be challenging, or using a tool as:

git mergetool

The merge tool will work if your files are listed as needing a merge.

You can also perform one of:

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file

You can see the different versions using the :1:filename syntax. See here for an explanation. But all of the above assumes that \'git status\' shows the files as needing a merge.

Finally, you always have the option of:

git reset --hard   # sounds like --hard is what you need but check other options


回答3:

All of the answers are right but if you want to Autoremove all conflict marks & want to autochange the files to keep HEAD , then You can create your own bash script like :-

Example Script:

# vim /usr/sbin/solve.git

(Append Following)

#!/bin/bash
for f in $(grep -Rl \'^>>>>>>> \' --include=\"*.php\" --include=\"*.css\" --include=\"*.js\" --include=\"*.html\" --include=\"*.svg\" --include=\"*.txt\" .)
do
sed -i -e \'/^=======/,/^>>>>>>> /d\' -e \'/^<<<<<<< /d\' $f
sed -i -e \'/^>>>>>>> /d\' $f
echo \"$f Fixed\"
done
git add . ; git commit -am \"[+] Resolved on `date` from `hostname` by `whoami`\" --no-verify

# chmod 755 /usr/sbin/solve.git

& just run it in your GIT repo/path to resolve:

$ cd <path_to_repo>
$ solve.git

Notice:- Above mentioned file extensions are php,css,js,html,svg & txt.



回答4:

In Atom i had the issue that some files did not save the resolved merge conflicts to the drive, so i had to manually click \"save\". Took me quite some time to figure out.



回答5:

I\'m coming from this question. And I wanted some automated method of merging the half merged files, instead of manually editing the files (as suggested in other answers, which I am not really comfortable doing). So here\'s what I ended up doing via netbeans, but can be done via command line too.

Now, bear in mind, this only works if immediately after the merge->add->commit, you realised that you messed up, and want to re-go through the process.

STEP 1: Reset to a previous commit.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

STEP 2: Re-Try Merging the branch

git merge --ff origin/feature/YOUR-Branch_here

At this point you shall be prompted with the merging window if you are using a GUI. and you can then proceed as normal.