Git лучшие практики для быстрого переключения между филиалами - PullRequest
20 голосов
/ 16 июня 2010

У меня есть несколько активных веток, с которыми мне нужно работать одновременно. Ясно, что я могу создать две рабочие директории с отдельной ветвью для каждой директории. Это единственный способ сделать это без необходимости «фиксировать» и «проверять», чтобы переключаться с одной ветви на другую?

Ответы [ 6 ]

19 голосов
/ 16 июня 2010

Если вы временно переключаете ветви, git stash полезно, однако, помните, что коммиты не должны сохраняться вечно;вы можете сделать временные коммиты для отката позже.

Поэтому я рекомендую, если это многочасовой переключатель, вместо этого сделать git commit, потому что, в зависимости от вашей памяти, тайники могут быть легкозабыть / потерять / и т.д.

[In MyBranch]
>$ git commit -m "WIP: Stuff I was working on."
>$ git checkout AnotherBranch
[Do Stuff]
>$ git checkout MyBranch
>$ git reset HEAD^
[Continue]

И поскольку речь идет о передовых практиках, не забудьте дать вашему тайнику полезное сообщение , используя git stash save, иначе может быть трудно найтипозже.

19 голосов
/ 16 июня 2010

Да, хотя вы можете использовать git stash вместо commit, если вы не готовы завершить текущую работу.

5 голосов
/ 16 июня 2010

git clone через локальный протокол - это хорошая альтернатива для одновременной работы с несколькими ветвями.

Я обычно клонируюодно локальное голое репо на несколько копий (по одному на каждую активную ветку) и использовать это голое репо в качестве центрального интеграционного репо (поскольку я могу легко перейти к голому репо, в отличие от невозможности перетаскивания в не голое репо).

3 голосов
/ 23 января 2014

Мне надоело переключаться между ветками и поэтому я написал умнее git checkout. Вставьте следующее в ~/.bash_profile, получите его, а затем просто используйте gch, чтобы переключиться на последнюю ветвь, на которой вы были.

current_git_branch() {
    git branch | grep \* | awk '{ print $2 }'
}
# a smart git checkout, with no args it switches to last branch.
gch() {
    if [ -n "$1" ]; then 
        echo `current_git_branch` >"/tmp/last_git_branch_used.txt"
        git checkout "$@"
    else
        if [ ! -f "/tmp/last_git_branch_used.txt" ]; then echo >&2 "ERROR: Please run gch with 1 argument first."
        else
            echo `current_git_branch` >"/tmp/last_git_branch_used.temp"
            git checkout `cat /tmp/last_git_branch_used.txt`
            mv "/tmp/last_git_branch_used."{temp,txt}
        fi
    fi
}
1 голос
/ 17 июня 2010

Если вы занимаетесь тем, что называется разработкой ветвлений для каждой функции, как описано здесь:

http://martinfowler.com/bliki/FeatureBranch.html

, вы также можете захотеть переключить схемы базы данных.Git может помочь в этом посредством размазывания и очистки.В этом случае возможно локальное управление несколькими базами данных.Когда вы извлекаете новую ветку, вы стираете строку подключения, чтобы аннотировать имя базы данных именем ветви.Если файл конфигурации будет зафиксирован в какой-либо точке, он будет очищен путем удаления имени ветви из соединения.

Для получения дополнительной информации посмотрите Pro Git book .

0 голосов
/ 23 октября 2014

У меня есть функция bash, подобная этой:

function gitredocommit {
  lastcomment=`git log | grep Date -A 2 -m 1 | tail -1 | sed -e 's/^ *//' -e 's/ *$//' | grep -v Merge`
  if [ -n "$lastcomment"  ]; then
    git reset --soft HEAD^; git add ../; git commit -m"$lastcomment"
  else
    echo "last commit was a merge, won't redo it"
  fi
}

Вы создаете новую ветку, делаете первый (и последний) коммит, а затем с этим вы можете делать новые вещи и перезаписывать этот коммит.Если вам нужно обновить с мастера, вы, конечно, делаете это с

git rebase master

, поэтому ваш коммит всегда находится на вершине в ветке.Это работает до тех пор, пока вы не объедините ветку в master.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...