TL; DR
Попробуйте git fetch && GIT_SEQUENCE_EDITOR="sed -i '' 's/^pick/squash/'" git rebase -i @{u}
(вы можете сжать это в псевдоним, оболочку или Git-to-shell).
Long
Рассмотрите следующее: Когда вы запускаете git rebase
, , вы указываете git rebase
, куда помещать копии .То есть вы запускаете:
git checkout $branch
git rebase $onto
, где $branch
- это имя вашей ветви, а $onto
- это то, что определяет, как выполнить ребазинг.Поскольку копии идут после , фиксация, указанная $onto
, $onto
автоматически становится правильной точкой для вашего git reset --soft
.
Если у вас есть git pull --rebase
, запустите git rebase
дляВы отказываетесь от прямого контроля $onto
здесь.Команда git pull
сначала запускает git fetch $remote
для некоторых $remote
, а затем использует извлеченную информацию, которую git fetch
записывает (в $GIT_DIR/FETCH_HEAD
), в качестве параметра $onto
.
Есть немногоздесь сложность из-за кода разветвления, но в современном Git у вас есть преимущество в том, что git fetch
обновит $upstream
, где $upstream
- восходящий поток текущей ветви, после чего git rebase
будет использовать $upstream
и автоматически выполняйте все операции разветвления, чтобы $upstream
оставался верным.В этом случае использование:
. git-sh-setup
branch=$(git symbolic-ref -q --short HEAD) || die 'not currently on a branch'
remote=$(git config --get branch.$branch.remote) || die 'current branch has no upstream'
git fetch $remote && git rebase || die 'fetch or rebase failed'
git reset --soft $upstream && git commit
в качестве сценария (названного, например, git-rebase-and-squash
в вашем $PATH
и запускаемого как git rebase-and-squash
) в большинстве случаев поможет.
Вместо того, чтобы использовать reset --soft
и git commit
напрямую, вы можете прочитать последнюю строку:
GIT_SEQUENCE_EDITOR="sed -i '' 's/^pick/squash/'" git rebase -i $upstream
, которая преобразует все pick
s в squash
es для вас,и в этом случае вам даже не понадобится более ранний git rebase
, так что весь сценарий сворачивается до git fetch
, за которым следует git rebase -i @{upstream}
.(Если вы все еще хотите автоматизировать редактирование последовательности, решать только вам.)
Если вы не возражаете против слегка вводящих в заблуждение сообщений об ошибках, вам также не нужна проверка.Выполнение git fetch
будет по умолчанию извлекать из origin
, а @upstream
будет сбои с шумом, если нет текущей ветви или , если у текущей ветви нет восходящего потока, так что это может быть уменьшено до двухСценарий или псевдоним длинной команды:
git fetch && GIT_SEQUENCE_EDITOR="sed -i '' 's/^pick/squash/'" git rebase -i @{u}