Imagine o seguinte: o que acontece (e todos nós estamos usando o SourceTree):
- Estamos todos trabalhando fora da origem / desenvolvimento.
- Eu vou de férias por uma semana.
- Meu colega de trabalho trabalha localmente há vários dias, sem mesclar origem / desenvolvimento de volta ao seu ramo de desenvolvimento local.
- Ele tenta dar um empurrão, é informado que ele precisa se fundir primeiro e depois faz um puxão.
- Ele entra em conflito, impedindo o processo automático de consolidação após mesclagem.
- Supondo que o Git seja como o SVN, meu colega de trabalho descarta os "novos" arquivos em sua cópia de trabalho e, em seguida, confirma a mesclagem - limpando esses "novos" arquivos da cabeça de origem / desenvolvimento.
- Uma semana de trabalho para desenvolvedores continua em cima dessa revisão.
- Volto de férias e descubro que faltam vários dias do meu trabalho.
Somos todos muito novos no Git (este é o nosso primeiro projeto a usá-lo), mas o que fiz para corrigi-lo foi:
- Renomeie "develop" para "develop_old".
- Mesclar develop_old em uma nova ramificação "develop_new".
- Redefina a ramificação develop_new para a última confirmação antes da mesclagem incorreta.
- Cherry escolhe cada commit desde então, um por um, resolvendo conflitos manualmente.
- Empurre develop_old e develop_new até a origem.
Neste ponto, develop_new é, espero, uma cópia "boa" de todas as nossas alterações com as semanas subsequentes no valor de trabalho reaplicado. Eu também estou assumindo que "reverso cometer" vai fazer coisas estranhas em um merge, especialmente desde que as próximas semanas de trabalho baseia-se sobre ele - e desde que de mesclagem contém um monte de coisas que não quero, juntamente com material que nós don' t.
Espero que isso nunca aconteça novamente, mas se acontecer novamente, gostaria de saber uma maneira mais fácil / melhor de consertar as coisas. Existe uma maneira melhor de desfazer uma mesclagem "ruim", quando muito trabalho foi feito no repositório com base nessa mesclagem?
git log
formato favorito com anotações apropriadas sobre o que aconteceu nos vários commits? (Eu redigir / anotargit log --graph --pretty=oneline --abbrev-commit
e ir a partir daí)Respostas:
Se entendi corretamente, esta é a sua situação:
Depois de um histórico comum (o), você comprometeu e empurrou seu trabalho (y). Seu colega de trabalho (c) trabalhou no repositório local e fez uma mesclagem incorreta (M). Posteriormente, pode haver alguns commits adicionais (a) em cima de M.
Agora, seu gráfico se parece exatamente com a mesclagem incorreta:
Faça uma boa mesclagem (G):
Resultando em:
Agora transplante as confirmações adicionais:
Isso fornece o resultado final:
Esteja ciente de que isso pode resultar em mais conflitos de mesclagem. Além disso, você acabou de alterar o histórico, ou seja, todos os seus colegas de trabalho devem clonar / redefinir / redefinir o novo histórico.
PS: é claro que você deve substituir
G
,M
eX
em seus comandos, o ID de confirmação correspondente.fonte
É bom que você esteja pensando em como consertar o repositório, mas se seu colega de trabalho excluiu apenas novos arquivos e não substituiu muitas atualizações, uma abordagem muito mais simples seria simplesmente restaurar os arquivos que foram excluídos.
Eu provavelmente começaria tentando apenas selecionar (na cabeça atual) os commits originais nos quais você adicionou o código que agora está faltando. Se por algum motivo isso não funcionar, basta verificar a revisão antiga com os arquivos adicionados e adicioná-los novamente em uma nova confirmação.
O que você descreve é, na verdade, um subconjunto de um conhecido padrão Git, que para a minha vida não consigo lembrar o nome - mas o essencial é fazer todas as "edições manuais" durante uma mesclagem do Git (ou seja, edições que não estão realmente resolvendo nenhum conflito de mesclagem, mas estão fazendo alguma mudança totalmente não relacionada) é considerada uma prática extremamente ruim porque são essencialmente mascaradas pela própria mesclagem e são facilmente ignoradas nas revisões de código ou nas sessões de depuração.
Portanto, explique definitivamente ao seu colega de trabalho que foi um fracasso épico, mas considere colocar um curativo antes de se preparar para uma grande cirurgia.
fonte