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.
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