Git interativo rebase sem commits para escolher


105

Estou no master e fiz rebase -i <my_branch>

Entendi:

noop

# Rebase c947bec..7e259d3 onto c947bec
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Eu gostaria de escolher alguns commits, não todos, pois alguns deles não são bem-vindos. Além disso, como você trabalha quando deseja manter alguns arquivos ou alterações sempre 'locais' para algum branch? Existe algum ajudante como .gitignore?

Respostas:


85

Como um rebase não interativo, você deve fazer o rebase em um commit específico.

Com um rebase não interativo, se você fornecer um ancestral direto do commit atual, você não mudará nada; com um rebase interativo, você pode editar commits após o commit no qual você está rebasando, mesmo se o commit for um ancestral direto do seu commit atual, mas você tem que especificar este commit a partir do qual deseja editar.

Não sei os detalhes da sua situação, mas você pode querer algo assim:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master

ou

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !

Usar a HEAD~*sintaxe funcionou para mim, mas o primeiro não.
Dev Yego,

25

rebase -isem um intervalo de commits não exibirá nenhum commit. para realocar os últimos, digamos, 7 commits, use o seguinte:

git rebase -i HEAD~7

tenha cuidado, porém, para que isso reescreva a história. não faça isso, se os commits já foram enviados


à sua segunda pergunta: tem um ramo com as alterações (basicamente um ramo de configuração) e regularmente mesclar os outros ramos para isso. desta forma, as mudanças não irão para outros ramos


9

Quando você está usando git rebase -i, normalmente você tem que especificar, desde qual commit você quer realizar o rebase. Então, se, por exemplo, você deseja remover alguns dos commits entre os últimos 10 para o branch atual, você faria:

git rebase -i HEAD~10

6

Como outros mencionaram, você precisa especificar um intervalo de confirmação.

git rebase -i <latest-commit-to-be-retained>

(Supondo que você esteja no mesmo ramo que o commit a ser editado) -

Para especificar os commits, você pode usar as abreviações HEAD ~ 5 ou usar a soma de verificação sha (que você pode usar git log)

Na verdade, qualquer commit servirá se for anterior / ancestral aos commits que você deseja deletar / editar / reformular na árvore. Isso irá listar todos os commits desde <latest-commit-to-be-retained>o editor (definido em sua configuração git). Da lista, para deletar um commit, apenas delete aquela linha em particular, salve e saia (vi habbits :)) do arquivo + editor, e façagit rebase --continue

Para a segunda resposta, eu concordo com o knittl

tenha um branch com suas mudanças (basicamente um branch de configuração) e regularmente mescle os outros branches nele. desta forma, as mudanças não irão para outros ramos

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.