Git вносит изменения в конкретную фиксацию [дубликат]

Всегда используйте свой элемент с этим атрибутом:

Javascript: element.style.fontSize = "100%";

или

CSS: style = "font-size: 100%;"

Когда вы идете в полноэкранный режим, вы уже должны иметь вычисляемую переменную масштаба (масштаб> 1 или масштаб = 1). Затем на полноэкранном режиме:

document.body.style.fontSize = (scale * 100) + "%";

Он отлично работает с небольшим кодом.

1759
задан Chris Martin 23 January 2016 в 11:08
поделиться

12 ответов

Вы можете использовать git rebase, например, если вы хотите изменить обратно на commit bbc643cd, запустите

$ git rebase --interactive 'bbc643cd^'

В редакторе по умолчанию измените pick на edit в которую вы хотите изменить. Внесите свои изменения и затем передайте их с тем же сообщением, которое у вас было до:

$ git commit --all --amend --no-edit

, чтобы изменить фиксацию, и после этого

$ git rebase --continue

вернется к предыдущей главе commit.

ПРЕДУПРЕЖДЕНИЕ. Обратите внимание, что это изменит SHA-1 этой фиксации, а также всех детей - другими словами, это переписывает историю с этой точки вперед. Вы можете сломать repos, выполнив это , если вы нажмете с помощью команды git push --force

2252
ответ дан Paolo 19 August 2018 в 02:49
поделиться
  • 1
    Еще один интересный вариант в этом потоке - после того, как вы переместились в коммит, который хотите изменить, вместо того, чтобы изменять файлы и нажимать на фиксацию сверху (тот, который вы редактируете), вы можете разделить это коммитирование на две разные коммиты (или даже больше). В этом случае вернитесь к фиксации для редактирования и запустите «git reset HEAD ^». который поместит измененные файлы этого коммита в сцену. Теперь выберите и скопируйте любые файлы по своему усмотрению. Этот поток достаточно хорошо объяснен в «git-rebase». справочная страница. См. Раздел «Разделение коммитов». bit.ly/d50w1M – Diego Pino 15 March 2010 в 20:18
  • 2
    В Git 1.6.6 и новее вы можете использовать действие reword в git rebase -i вместо edit (он автоматически открывает редактор и продолжается с остальными этапами переадресации, что устраняет использование git commit --ammend и git rebase --continue, когда вам нужно только изменить сообщение фиксации, а не контент). – Chris Johnsen 29 November 2010 в 04:35
  • 3
    После запуска 'git rebase hash ^ --interactive', затем отметка редактирования на commit, 'git commit -amend' просто показывает сообщение фиксации, а не фактический код. Как я могу изменить код, который был совершен? Благодаря! – mikemaccana 15 August 2012 в 09:47
  • 4
    Стоит отметить, что вам может потребоваться запустить git stash до git rebase и git stash pop после этого, если у вас есть ожидающие изменения. – user123444555621 18 September 2013 в 09:42
  • 5
    Обратите внимание, что с более новым git было бы разумнее следовать быстрым инструкциям, а не слепо использовать git commit --all --amend --no-edit здесь. Все, что мне нужно было делать после git rebase -i ..., было git commit --amend обычно тогда git rebase --continue. – Eric Chen 2 March 2017 в 10:04

Запуск:

$ git rebase --interactive commit_hash^

каждый ^ указывает, сколько коммитов назад вы хотите отредактировать, если это только один (хеш-фиксация, которую вы указали), затем вы просто добавляете один ^.

Используя Vim, вы изменяете слова pick на reword для коммитов, которые вы хотите изменить, сохранить и выйти (:wq). Затем git предложит вам каждую фиксацию, которую вы пометили как временное слово, чтобы вы могли изменить сообщение фиксации.

Каждое сообщение фиксации, которое вы должны сохранить и выйти (:wq), перейти к следующему сообщению фиксации

Если вы хотите выйти без применения изменений, нажмите :q!

EDIT: чтобы перейти в vim, вы используете j для перехода вверх, k, чтобы перейти вниз , h, чтобы идти влево, а l - вправо (все это в режиме NORMAL, нажмите ESC, чтобы перейти в режим NORMAL). Чтобы отредактировать текст, нажмите i, чтобы войти в режим INSERT, где вы вставляете текст. Нажмите ESC, чтобы вернуться в режим NORMAL:)

UPDATE: вот отличная ссылка из списка github Как отменить (почти) что угодно с git

30
ответ дан betoharres 19 August 2018 в 02:49
поделиться
  • 1
    Отлично работал для меня. Стоит упомянуть git push --force? – u01jmg3 12 July 2016 в 20:55
  • 2
    То, что git push --force делает, перезаписывает удаленные объекты с локальными коммитами. Это не относится к этой теме :) – betoharres 14 July 2016 в 17:12
  • 3
    @BetuUuUu, конечно, если ваши коммиты переносятся на удаленный, и вы модифицировали сообщение фиксации локально, вы хотели бы принудительно нажать на удаленный, не так ли? – Sudip Bhandari 5 July 2017 в 09:03
  • 4
    @SudipBhandari Это чувство, которое я чувствую. Я не принуждал, и теперь у меня есть дополнительная ветка, зеркалирующая все коммиты назад к тому, чье сообщение я изменил, что является супер-уродливым. – ruffin 5 February 2018 в 17:35
  • 5
    Интерактивная перестановка может показаться сложной в начале. Я написал сообщение (с фотографиями), которое представляет его подробно, шаг за шагом: blog.tratif.com/2018/04/19/the-power-of-git-interactive-rebase – Tomasz Kaczmarzyk 20 April 2018 в 08:13

Используйте потрясающую интерактивную rebase:

git rebase -i @~9   # Show the last 9 commits in a text editor

Найдите требуемый коммит, измените pick на e (edit) и сохраните и закройте файл. Git перемотает эту фиксацию, позволяя вам:

  • использовать git commit --amend для внесения изменений или
  • использовать git reset @~, чтобы отменить последнее коммит, но не изменения в файлах (т. е. довести вас до того момента, когда вы редактировали файлы, но еще не зафиксировали его).

Последнее полезно для более сложных например, разбиение на несколько коммитов.

Затем запустите git rebase --continue, а Git воспроизведет последующие изменения поверх измененного коммита. Вас могут попросить исправить некоторые конфликты слияния.

Примечание: @ является сокращением для HEAD, а ~ является фиксацией до указанного фиксации.

Узнайте больше о истории перезаписи в документах Git.

Не бойтесь переустанавливать

ProTip ™: не бойтесь экспериментировать с «опасными» командами, которые переписывают историю * - Git не удаляет ваши коммиты в течение 90 дней по умолчанию; вы можете найти их в reflog:

$ git reset @~3   # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* Остерегайтесь опций, таких как --hard и --force, хотя - они могут отбрасывать данные. * Также , не переписывайте историю в каких-либо ветвях, с которыми вы работаете.


Во многих системах git rebase -i откроет Vim по умолчанию. Vim не работает, как большинство современных текстовых редакторов, поэтому посмотрите на , как переустановить с помощью Vim . Если вы предпочитаете использовать другой редактор, измените его на git config --global core.editor your-favorite-text-editor.

306
ответ дан Community 19 August 2018 в 02:49
поделиться
  • 1
    Середина вашего ответа - это странное место, где я могу описать как рекламу мини-рекламы для VIM. Это не имеет отношения к вопросу и просто загромождает ваш ответ. – Intentss 29 May 2015 в 14:29
  • 2
    @Intentss: Ах, я понимаю, почему это выглядело странно. Обоснование этого заключалось в том, что Vim является текстовым редактором по умолчанию для многих систем, поэтому первый опыт интерактивного переустройства многих людей - это экран, где ввод текста делает курсор перемещаться по всему месту. Затем они переключают свой редактор на что-то другое, и их второй опыт интерактивного переустройства довольно нормальный, но оставляет им интересно, почему он использует текстовый файл вместо графического интерфейса. Чтобы добиться потока с перезагрузкой, вам нужно что-то вроде Vim или режим переустановки Emacs. – Zaz 30 May 2015 в 23:59
  • 3
    Если бы мне пришлось использовать что-то вроде Gedit или nano для интерактивной переадресации, я бы сократил намного меньше. Может быть, это было бы не так уж плохо, поскольку я немного из-за наркозависимости. – Zaz 31 May 2015 в 00:00
  • 4
    Хорошо. Увидев, что так много людей считают эту часть несущественной, я сократил ее до 3 строк, а также объяснил, как изменить редактор, если это необходимо. – Zaz 7 October 2015 в 16:38
  • 5
    Потрясающие! Я не знал, что вы можете использовать @ как стенографию для HEAD. Спасибо, что опубликовали это. – James Ko 2 October 2016 в 20:42

Полностью неинтерактивная команда (1)

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

git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"; }; f'

Самым большим преимуществом этой команды является то, что она не-vim.


(1), учитывая, что конфликтов во время rebase нет, конечно

Использование

git amend-to <REV> # e.g.
git amend-to HEAD~1
git amend-to aaaa1111

Имя amend-to кажется соответствующим IMHO. Сравните поток с --amend:

git add . && git commit --amend --no-edit
# vs
git add . && git amend-to <REV>

Объяснение

  • git config --global alias.<NAME> '!<COMMAND>' - создает глобальный псевдоним git с именем <NAME>, который будет выполнять команду non-git <COMMAND>
  • f() { <BODY> }; f - «анонимная» функция bash.
  • SHA=`git rev-parse "$1"`; - преобразует аргумент в git-ревизию и присваивает результат переменной SHA
  • git commit --fixup "$SHA" - fixup-commit для SHA. См. git-commit docs
  • GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^" git rebase --interactive "$SHA^" часть была покрыта другими ответами. --autosquash - это то, что используется в сочетании с git commit --fixup, см. git-rebase docs для получения дополнительной информации GIT_SEQUENCE_EDITOR=true, что делает все это неинтерактивным. Этот хак я узнал из этого сообщения в блоге .
5
ответ дан Dethariel 19 August 2018 в 02:49
поделиться
  • 1
    Можно также сделать amend-to обрабатывать неустановленные файлы: git config --global alias.amend-to '!f() { SHA= git rev-parse & quot; $ 1 & quot; ; git stash -k && git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^" && git stash pop; }; f' – Dethariel 6 March 2018 в 23:16
  • 2
    Я использую его с флагом --autostash в команде rebase. – idanp 1 May 2018 в 16:33

Если по какой-то причине вам не нравятся интерактивные редакторы, вы можете использовать git rebase --onto.

Предположим, вы хотите изменить Commit1. Прежде всего, отделитесь от до Commit1:

git checkout -b amending [commit before Commit1]

Во-вторых, возьмите Commit1 с cherry-pick:

git cherry-pick Commit1

Теперь измените ваши изменения, создавая Commit1':

git add ...
git commit --amend -m "new message for Commit1"

И, наконец, после того, как вы спрятали какие-либо другие изменения, пересаживайте остальную часть своих коммитов до master поверх вашей новой фиксации:

git rebase --onto amending Commit1 master

Читайте: «rebase, на ветку amending, все фиксируются между Commit1 (не включительно) и master (включительно)». То есть Commit2 и Commit3 полностью разрезают старый Commit1. Вы можете просто выбрать вишню, но это проще.

Не забудьте очистить свои ветви!

git branch -d amending
13
ответ дан FeepingCreature 19 August 2018 в 02:49
поделиться
  • 1
    вы можете использовать git checkout -b amending Commit1~1, чтобы получить предварительную фиксацию – Arin Taylor 12 July 2017 в 21:13

На основании Документация

Изменение сообщения более старых или нескольких сообщений фиксации

git rebase -i HEAD~3 

Вышеупомянутый список последних 3 фиксаций текущая ветвь, измените 3 на что-то еще, если хотите больше. Список будет выглядеть следующим образом:

pick e499d89 Delete CNAME
pick 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.

Заменить выбор с помощью повтора перед каждым сообщением фиксации, которое вы хотите изменить. Скажем, вы изменили вторую фиксацию в списке, ваш файл будет выглядеть следующим образом:

pick e499d89 Delete CNAME
reword 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.

Сохраните и закройте файл списка фиксаций, появится новый редактор, который изменит вашу фиксацию сообщение, изменить сообщение фиксации и сохранить.

Завершить принудительное принудительное изменение.

git push --force
0
ответ дан justMe 19 August 2018 в 02:49
поделиться

Я решил это,

1), создав новую фиксацию с изменениями, которые я хочу.

r8gs4r commit 0

2) Я знаю, какой фиксации мне нужно объединить с ней. который является фиксацией 3.

, поэтому git rebase -i HEAD~4 # 4 представляет недавний 4 фиксации (здесь commit 3 находится на 4-м месте)

3) в интерактивной rebase недавняя фиксация будет расположена внизу , он будет выглядеть одинаково,

pick q6ade6 commit 3
pick vr43de commit 2
pick ac123d commit 1
pick r8gs4r commit 0

4) здесь нам нужно перестроить фиксацию, если вы хотите объединиться с конкретным. он должен выглядеть следующим образом:

parent
|_child

pick q6ade6 commit 3
f r8gs4r commit 0
pick vr43de commit 2
pick ac123d commit 1

после переупорядочения вам нужно заменить p pick на f (исправление будет сливаться без сообщения фиксации) или s (слияние сквоша с сообщением фиксации может изменить время выполнения)

, а затем сохранить ваше дерево.

теперь сливается с существующим фиксатором.

Примечание: его предпочтительный метод, если вы не «поддерживать себя самостоятельно. если у вас большой размер команды, его не приемлемый метод для перезаписи дерева git закончится конфликтами, которые, как вы знаете, будут другими. если вы хотите поддерживать чистоту дерева с меньшим количеством коммитов, можете попробовать это, и если его небольшая команда в противном случае не будет предпочтительной .....

1
ответ дан Mohideen ibn Mohammed 19 August 2018 в 02:49
поделиться
  • 1
    Это приятное решение, если вы не хотите делать живую модификацию во время интерактивной перезагрузки. – Dunatotatos 29 May 2018 в 19:14

Пришел к этому подходу (и он, вероятно, точно так же, как и с использованием интерактивной переадресации), но для меня это довольно просто.

Примечание. Представляю этот подход для иллюстрации того, что вы можете а не повседневную альтернативу.

Предположим, вы хотите изменить commit 0, и вы в настоящий момент находитесь на feature-branch

some-commit---0---1---2---(feature-branch)HEAD

. Выполните проверку этого коммита и создайте quick-branch. Вы также можете клонировать свою ветвь функции как точку восстановления (перед запуском).

?(git checkout -b feature-branch-backup)
git checkout 0
git checkout -b quick-branch

Теперь у вас будет что-то вроде этого:

0(quick-branch)HEAD---1---2---(feature-branch)

Сценические изменения, .

git add ./example.txt
git stash

Заменить изменения и выполнить возврат к feature-branch

git commit --amend
git checkout feature-branch

Теперь у вас будет что-то вроде этого:

some-commit---0---1---2---(feature-branch)HEAD
           \
             ---0'(quick-branch)

Rebase feature-branch на quick-branch (разрешить любые конфликты на этом пути). Примените stash и удалите quick-branch.

git rebase quick-branch
git stash pop
git branch -D quick-branch

И вы получите:

some-commit---0'---1'---2'---HEAD(feature-branch)

Git не будет дублировать (хотя я не могу сказать, в какой степени) 0 commit при перезагрузке.

Примечание: все хеши фиксации изменяются, начиная с фиксации, которую мы изначально планировали изменить.

6
ответ дан Olga 19 August 2018 в 02:49
поделиться

Чтобы получить неинтерактивную команду, поместите скрипт с этим контентом в ваш PATH:

#!/bin/sh
#
# git-fixup
# Use staged changes to modify a specified commit
set -e
cmt=$(git rev-parse $1)
git commit --fixup="$cmt"
GIT_EDITOR=true git rebase -i --autosquash "$cmt~1"

Используйте его, разместив свои изменения (с помощью git add), а затем запустите git fixup <commit-to-modify>. Конечно, он все равно будет интерактивным, если у вас появятся конфликты.

5
ответ дан Pelle Nilsson 19 August 2018 в 02:49
поделиться
  • 1
    Это хорошо работает. Я добавил некоторые дополнительные функции, чтобы выполнить поэтапное исправление грязного дерева для улучшения набора фиксации. `dirtydiff = $ (git diff); если [& quot; $ {dirtydiff} & quot; ! = "& quot; ]; затем эхо "Stashing dirty tree & quot; & GT; & амп; 2; git stash; Fi; – Simon Feltman 4 March 2018 в 23:08

Для меня это было для удаления некоторых учетных данных из репо. Я попытался переустановить и столкнулся с тонкой, казалось бы, несвязанными конфликтами на пути, когда пытался переустановить, - продолжайте. Не утруждайте себя попыткой перезагрузить себя, используйте инструмент BFG (brew install bfg) на mac.

1
ответ дан Pellet 19 August 2018 в 02:49
поделиться

Интерактивная rebase с --autosquash - это то, что я часто использую, когда мне нужно исправлять предыдущие, фиксирует глубже в истории. Это существенно ускоряет процесс, который иллюстрирует ответ ZelluX, и особенно удобен, когда у вас есть несколько коммитов, которые вам нужно отредактировать.

Из документации:

--autosquash

Когда сообщение журнала фиксации начинается с «squash! ...» (или «fixup! ...»), и есть фиксация, название которой начинается с того же ..., автоматически изменяет список дел rebate -i, так что фиксация, помеченная для раздачи, появляется сразу после модификации фиксации

Предположим, что у вас есть история, которая выглядит так:

$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1

и у вас есть изменения, которые вы хотите внести в Commit2, затем выполните свои изменения с помощью

$ git commit -m "fixup! Commit2"

, иначе вы можете использовать commit-sha вместо сообщения commit, поэтому "fixup! e8adec4 или даже префикс сообщение фиксации.

Затем инициируйте интерактивную rebase на фиксации до

$ git rebase e8adec4^ -i --autosquash

, который откроет ваш редактор с уже правильно упорядоченными коммитами

pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3

все, что вам нужно сделать, это сохранить и выйти [/ g1 0]

59
ответ дан thrau 19 August 2018 в 02:49
поделиться
  • 1
    Вы также можете использовать git commit --fixup=@~ вместо git commit -m "fixup! Commit2". Это особенно полезно, когда ваши сообщения фиксации более длинные, и было бы болью печатать все это. – Zaz 19 October 2015 в 20:57
2
ответ дан Tom Hale 30 October 2018 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: