Git Selective Merge

Exemplo: você tem um branch refactorque é bastante diferente do master. Você não pode fundir todos os commits, ou mesmo cada pedaço em qualquer commit ou master irá quebrar, mas você fez muitas melhorias que gostaria de trazer para o master.

No mestre:

> git checkout -b temp

Na temperatura:

> git merge --no-commit --no-ff refactor

… que organiza tudo, então:

> git reset head

Em seguida, comece a adicionar alterações:

> git add --interactive

O seguinte é de uma fusão real:

           staged     unstaged path
1: unchanged +1/-1 deploy_settings.py
2: unchanged +4/-3 requirements.txt
3: unchanged +2/-1 settings/defaults.py
4: unchanged +1/-1 settings/production.py.example

*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>

Escolha ppara patch.

           staged     unstaged path
1: unchanged +1/-1 deploy_settings.py
2: unchanged +4/-3 requirements.txt
3: unchanged +2/-1 settings/defaults.py
4: unchanged +1/-1 settings/production.py.example
Patch update>>

Digite o número ao lado do arquivo que deseja processar primeiro.

Você pode continuar inserindo números até selecionar todos os arquivos ou pode fazê-los um de cada vez. um asterisco aparecerá próximo aos arquivos selecionados.

Pressione ‘enter’ sem inserir um número (ou nada) para continuar
para a próxima etapa.

Você verá um único pedaço de diff e ele perguntará se você deve selecioná-
lo ou não:

diff --git a/deploy_settings.py b/deploy_settings.py
index
9b110f4..c5b228e 100644
--- a/deploy_settings.py
+++ b/deploy_settings.py
@@ -4,7 +4,7 @@ This file holds the Fabric deployment settings for this project
from fabric.state import env

#env.project = 'my_project' #The name of this project
-#env.repo_base = 'git@git.oldsite.com:%s.git' % env.project
+#env.repo_base = 'git@git.newsite.com:%s.git' % env.project

Stage this hunk [y,n,q,a,d,/,e,?]?

Entre yno palco, npara pular. Isso vai continuar para cada pedaço diff nos arquivos selecionados até que você volte para:

*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>

Você pode entrar spara ver o que mudou

           staged     unstaged path
1: unchanged +1/-1 deploy_settings.py
2: +4/-3 nothing requirements.txt
3: +2/-1 nothing settings/defaults.py
4: unchanged +1/-1 settings/production.py.example

*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>

Você pode sair agora, então entre q. Em seguida, execute alguns comandos status e diff para explorar as mudanças em estágios e não em estágios e certifique-se de que tenham a aparência esperada.

Não se esqueça de quaisquer arquivos não rastreados, conforme apropriado.git add

Finalmente:

> git commit -m "merged selected patches from refactor branch"
# don't do commit -a here… you only want to commit the staged changes

Reverter alterações não planejadas …

> git checkout .

… e mesclar para master

> git checkout master
> git merge temp
> git branch -D temp

compartilhado aqui e as pessoas parecem achar útil