Lidar com um conflito git merge

Estou começando a trabalhar com outras pessoas usando git e github. Embora eu esteja familiarizado com push, pull, branch e clonagem, não tinha encontrado conflitos de mesclagem regularmente até começar o RocketU.

mkdir mergeConflicting
cd mergeConflicting

touch play
.js

adicione algum código aleatório. Isso cria um servidor da web gulp (depois de executar o npm install):

var gulp = require('gulp'),
connect
= require('gulp-connect');

gulp
.task('webserver', function() {
connect
.server({
livereload
: true
});
});

gulp
.task('default', ['webserver']);

Em seguida, adicione os arquivos a .git e confirme as alterações:

git add -A
git commit
-m 'add gulp process'

Tudo isso é padrão. Aprendi a não trabalhar no branch master. Então, para criar um novo branch chamado Develop e começar a trabalhar nele, execute:

git checkout -b develop

Agora estamos no ramo de desenvolvimento e faremos algumas alterações. Faremos algumas alterações no master. Quando tentamos desenvolver fusão em mestre, teremos um conflito de fusão que iremos resolver.

Eu adicionei mais algumas tarefas aleatórias dos documentos da API gulp que mudam as linhas 5 a 11.
git add -A git commit -m 'add gulp task on develop branch'

Agora vou voltar ao master, adicionar algum código diferente nas mesmas linhas e simular um conflito de mesclagem.

git checkout master

Adicione algumas coisas novas
git add -A git commit -m 'make changes on master branch' git status On branch master nothing to commit, working directory clean

Legal, então tudo é molho em nossos respectivos ramos. Quando eu tento mesclar, desenvolver em master, entretanto, teremos um conflito! O Git não sabe se deve exibir o arquivo como eu o tenho no master ou como o tenho no desenvolvimento. Mudamos as mesmas linhas!

git merge develop
Auto-merging play.js
CONFLICT
(content): Merge conflict in play.js
Automatic merge failed; fix conflicts and then commit the result.

Então isso é divertido. Se você olhar para o arquivo, é um pouco assustador porque seu código está todo confuso e sobrecarregado. O Git exibirá <<<<< e >>>>> indicando onde os dois ramos estão em conflito.

<<<<<<< HEAD
// random changes on master branch

gulp.src('./client/templates/*.jade')

.pipe(jade())

.pipe(gulp.dest('./build/templates'))

.pipe(minify())

.pipe(gulp.dest('./build/minified_templates'));


=======


gulp.src('client/js/**/*.js') // Matches 'client/js/somedir/somefile.js' and resolves `base` to `client/js/`

.pipe(minify())

.pipe(gulp.dest('build')); // Writes 'build/somedir/somefile.js'


gulp.src('client/js/**/*.js', { base: 'client' })

.pipe(minify())

.pipe(gulp.dest('build')); // Writes 'build/js/somedir/somefile.js'


>>>>>>> develop

Até recentemente, eu editaria este arquivo manualmente e confirmaria minhas alterações. Hoje vamos usar a ferramenta git mergetool.

git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff tortoisemerge emerge vimdiff

Merging:
play
.js

Normal merge conflict for 'play.js':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):

Eu uso o opendiff porque dá a você uma GUI. Outra ferramenta é chamada vimdiff. Sempre fico preso no Vim e não gosto de usar porque tenho medo. Use opendiff. Pressione Enter.

Cenário

Agora você verá os dois arquivos e como eles diferem. Use as setas do teclado para selecionar esquerda ou direita. Vou selecionar o certo. Em seguida, salve (Arquivo> Salvar ou comando + S) e saia (Arquivo> Sair ou comando + Q). De volta ao terminal, você verá algumas coisas.

git mergetool

This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff tortoisemerge emerge vimdiff

Merging:
play
.js

Normal merge conflict for 'play.js':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
2015-04-23 20:21:49.350 FileMerge[3018:303] Invalid color System, labelColor (warning given only once)
2015-04-23 20:21:49.516 FileMerge[3018:303] Unable to load platform at path /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
2015-04-23 20:21:49.518 FileMerge[3018:303] Unable to load platform at path /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform

git status


On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)

Changes to be committed:

modified
: play.js

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

play
.js.orig

Parabéns, você resolveu o conflito de mesclagem. Ainda temos que comprometer nossas mudanças. Observe também que um novo arquivo (não rastreado) foi criado. Este é o mesmo arquivo quando o conflito de mesclagem foi criado pela primeira vez, portanto, você tem as duas versões do código. Se vários arquivos entrarem em conflito, vários arquivos .orig serão gerados. Exclua este arquivo e faça o commit da fusão resolvida.

rm play.js.orig

Fiz um comentário para play.js. Então eu cometi as mudanças

git add -A
git commit
-m 'merge the two branches'

Finalmente, podemos excluir o branch de desenvolvimento e verificar se ele se foi!

git branch -d develop 
Deleted branch develop (was fca53f8).

git branch

* master

Em última análise, o commit de desenvolvimento aparece no histórico de commits de nosso branch master. Existe outra maneira de fazer isso usando git rebase. Vou guardar essa diversão para mais tarde

Confira o histórico completo do git aqui:

https://github.com/jasonshark/mergeConflicting/commits/master