Estou no meio de rebarbas depois de um git pull --rebase
. Eu tenho alguns arquivos que possuem conflitos de mesclagem. Como posso aceitar as alterações "deles" ou "minhas" para arquivos específicos?
$ git status
# Not currently on any branch.
# You are currently rebasing.
# (fix conflicts and then run "git rebase --continue")
# (use "git rebase --skip" to skip this patch)
# (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: CorrectlyMergedFile
#
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add <file>..." to mark resolution)
#
# both modified: FileWhereIWantToAcceptTheirChanges
# both modified: FileWhereIWantToAcceptMyChanges
Normalmente, basta abrir o arquivo ou uma ferramenta de mesclagem e aceitar manualmente todas as alterações "deles" ou "minhas". No entanto, suspeito que esteja faltando um comando git conveniente.
Além disso, observe que só poderei escolher uma estratégia de mesclagem para cada arquivo quando vir quais arquivos atingem conflitos e possivelmente quais são os conflitos.
git
git-rebase
git-merge-conflict
Steven Wexler
fonte
fonte
Respostas:
Para cada arquivo em conflito que você obtém, você pode especificar
Dos
git checkout
documentosfonte
git rebase -s recursive -X <ours/theirs>
ougit merge -s recursive -X <ours/theirs>
. Lembre-se de que, para uma rebase, "nossos" e "deles" são revertidos do que são durante uma mesclagem. Você provavelmente também pode usar um arquivo / shell glob também, comogit checkout --theirs -- *.txt
.ours/theirs
rebase estava me deixando louco !! (Faz sentido agora que eu penso sobre como um rebase realmente funciona, mas não em todos intuitiva.)git checkout --outs -- "**/*.csproj"
, fará o que você quer dizer. O mesmo é verdade, por exemplo, paragit lfs track "*.jpg"
. Se você tiver alguns arquivos jpg no seu CWD, sem as aspas, somente esses serão rastreados.Mesmo que essa pergunta seja respondida, fornecendo um exemplo do que "deles" e "nosso" significa no caso de git rebase vs merge. Veja este link
Git Rebase
theirs
é na verdade o ramo atual no caso de rebase . Portanto, o conjunto de comandos abaixo está realmente aceitando as alterações de sua ramificação atual na ramificação remota.Git Merge
Para mesclar , o significado de
theirs
eours
é revertido. Portanto, para obter o mesmo efeito durante uma mesclagem , ou seja, mantenha as alterações atuais do seu ramo (ours
) sobre o ramo remoto que está sendo mesclado (theirs
).fonte
Note que
git checkout --ours|--theirs
irá substituir os arquivos totalmente , escolhendo uma das duastheirs
ouours
versão, que pode ser ou pode não ser o que você quer fazer (se você tiver quaisquer alterações não-conflitantes que vêm do outro lado, eles serão perdidos).Se em vez você quer executar uma mala de três vias no arquivo, e só resolver os pedaços em conflito usando
--ours|--theirs
, ao mesmo tempo mantendo pedaços não-conflitantes de ambos os lados no lugar, você pode querer recorrer agit merge-file
; veja detalhes nesta resposta .fonte
example.txt
emours
versão, um está em conflito (também alterados natheirs
revisão), a outra é não-conflito. Se você o fizergit checkout --theirs example.txt
, apenas lerá cegamente o arquivo inteiro natheirs
revisão e a parte não conflituosa do diff será perdida.git checkout --merge <path>
.