git alias para mesclar ramificação atual com master

6

Estou tentando criar um alias git que mescla a ramificação atualmente retirada no branch master. Especificamente, eu gostaria de rapidamente fazer com que minha ramificação mestre se familiarize com o que estou trabalhando. Eu tenho o seguinte:

[alias]
    co = checkout
    ff = !git co master && git merge work && git co work

No entanto, gostaria que o alias soubesse em qual ramificação estava e voltasse para ele. Eu tentei adicionar $1 , mas infelizmente recebi um erro no último checkout no alias:

# with
[alias]
    co = checkout
    ff = !git co master && git merge $1 && git co $1

> git ff work
Switched to branch 'master'
Already up-to-date.
error: pathspec 'work' did not match any file(s) known to git.

Alguém sabe por que isso acontece? (Eu estou em um Mac por sinal)

    
por Spoike 12.06.2012 / 14:13

3 respostas

7

Se você usar parâmetros posicionais nos aliases do git, especifique sh -c . O seguinte trabalhou para mim localmente:

ff = !sh -c 'git checkout master && git merge "$1" && git checkout "$1"' -

O "porquê" está relacionado à maneira como o git analisa os comandos alias e é resumido neste tópico gmane .

O - no final do comando sinaliza sh que o processamento da opção está concluído. De man sh :

A -- signals the end of options and disables further option processing. Any arguments after the -- are treated as filenames and arguments. An argument of - is equivalent to --.

Se ele não estivesse presente, ele introduziria um erro no alias, tratando $1 como uma opção no comando sh em vez de como um argumento posicional. Considere este exemplo trivial:

$ sh -c 'echo $1' foo          # equivalent to 'echo' without argument

$ sh -c 'echo $1' - foo        # will pass 'foo' to the string as $1
foo

No primeiro caso, 'foo' foi consumido por sh como uma opção. No segundo, é corretamente interpretado como $1 na string.

    
por 12.06.2012 / 19:53
3

Aqui está uma versão com a qual você não precisa especificar a ramificação atual e pode escolher qualquer ramificação de destino:

merge-into = !sh -c '_CURRENT_BRANCH=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge $_CURRENT_BRANCH && git checkout $_CURRENT_BRANCH' -

Uso (do meu ramo):

git merge-into master
    
por 11.09.2013 / 18:58
0

Graças às respostas neste tópico, atualizei alguns aliases que usei:

  • git fold <target> [source] - mescla a ramificação <target> na corrente (preservando o histórico), opcionalmente especificando uma ramificação source diferente da atual; mff é outra forma abreviada

    fold = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge --no-ff ${2-$_CURRB} -e' - ; per suggestion http://nvie.com/posts/a-successful-git-branching-model/ + https://superuser.com/questions/435744/git-alias-for-merging-current-branch-with-master
        mff = "!git fold"
    
  • git foldback <target> [source] - o mesmo que fold , mas retorna para a ramificação source (atual)

    foldback = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git fold $1 ${2-$_CURRB} && git checkout ${2-$_CURRB}' -
    
  • git fuse <target> [source] - o mesmo que fold , mas exclui o ramo de origem (ou seja, quando terminar de trabalhar em um recurso)

    fuse = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git fold $1 $2 && git branch -d ${2-$_CURRB}' - ; per suggestion http://nvie.com/posts/a-successful-git-branching-model/
    

Eu não sei o suficiente sobre as coisas da shell para saber uma maneira melhor de reutilizar _CURRB ; alguma sugestão?

    
por 10.09.2014 / 15:19

Tags