Git tools для продвинутых разработчиков
Git tools для продвинутых разработчиков
При работе с Git вы можете столкнуться с ситуацией, когда вам нужно отредактировать сообщение коммита. Существует ряд причин, по которым вы хотите внести изменения, например, исправление опечатки, удаление конфиденциальной информации или добавление дополнительной информации.
В этом руководстве объясняется, как изменить сообщение о самых последних или старых коммитах Git.
Не задний коммит
Чтобы изменить сообщение самого последнего коммита, который не был в удаленный репозиторий, его снова, используя флаг .
-
Перейдите в каталог хранилища в вашем терминале.
Выполните следующую команду, чтобы изменить (изменить) сообщение о последнем коммите:
Команда выполняет перезапись самого последнего коммита новым.
Опция позволяет вам написать новое сообщение в командной строке, не открывая сеанс редактора.
Перед изменением сообщения о коммите вы также можете добавить другие ранее забытые изменения:
Задний коммит
Измененный (измененный) коммит — это новый объект с другим SHA-1. Предыдущий коммит больше не будет существовать в текущей ветке.
Как правило, вам следует избегать внесения изменений в коммит, который уже выдвинут, поскольку это может вызвать проблемы у людей, которые основывают свою работу на этом коммите. Хорошей идеей будет проконсультироваться со своими коллегами-разработчиками перед изменением принудительного коммита.
-
Перейдите в хранилище.
Исправьте сообщение о последнем введенном коммите:
Принудительно нажмите, чтобы обновить историю удаленного хранилища:
Изменение старого или нескольких коммитов
Команда переписывает историю коммитов, и настоятельно не рекомендуется перебазировать коммиты, которые уже переданы в удаленный репозиторий Git.
-
Перейдите в хранилище, содержащее сообщение фиксации, которое вы хотите изменить.
Введите , где — количество коммитов, на которых необходимо выполнить ребазинг. Например, если вы хотите изменить 4-й и 5-й последние коммиты, введите:
Команда отобразит последние коммиты в текстовом редакторе по умолчанию:
Перейдите к строкам коммит-сообщения, которое вы хотите изменить, и замените на :
Сохраните изменения и закройте редактор.
Для каждого выбранного коммита открывается новое окно текстового редактора. Измените сообщение о коммите, сохраните файл и закройте редактор.
Принудительно отправить изменения в удаленный репозиторий:
Вывод
Чтобы изменить самое последнее сообщение о , используйте команду а для изменения более старого или многократного сообщения о используйте
Не вносите изменения в принудительные коммиты, так как это может вызвать массу проблем у ваших коллег.
В этой статье будет показано, как стирать, настраивать, изменять или редактировать «Начать» название экрана запуска Windows 8 с помощью Resource Hacker.
Узнайте, как изменить размер или изменить размер миниатюр панели задач в Windows Vista / 7/8 через взлом реестра. Если вы обнаружите, что размер миниатюр слишком мал, легко увеличивайте его размер.
Git remotes — это указатели на версии репозитория, которые обычно хранятся на других серверах. В этом руководстве объясняется, как изменить URL-адрес пульта Git.
Отмена последней фиксации
Чтобы отменить последнюю фиксацию без потери изменений, внесенных вами в локальные файлы и индекс, вызовите с параметром за которым следует :
— это переменная, указывающая на предыдущую фиксацию. Приведенная выше команда перемещает текущую ветвь назад на одну фиксацию, эффективно отменяя последнюю фиксацию. Если вы запустите команду , вы увидите, что измененные файлы перечислены как незафиксированные изменения.
Чтобы обновить указатель для сброса индекса, запустите с или без параметра:
Измененные файлы сохраняются, но, в отличие от предыдущего примера, теперь изменения не ставятся для фиксации.
Если вы не хотите сохранять изменения, внесенные в файлы, вызовите команду с параметром :
Перед выполнением аппаратного сброса убедитесь, что вам больше не нужны изменения.
Просмотр истории коммитов
Не все коммиты будете делать вы, какие-то будут делать ваши коллеги по команде, поэтому вам может понадобиться изучить историю коммитов. Одним из основных и наиболее мощных инструментов для этого является команда .
Помимо автора и даты, у каждого комита есть идентификатор, который называется hash. Пример: 2934ee19f4d4ca37ff9bea9dc8208ef5362d789e. Необязательно использовать такую длинную запись, git поймет и по первым 5 символам, какой hash вам нужен.
Команда имеет очень большое количество опций для поиска коммитов по разным критериям.
Одним из самых полезных аргументов является или , который показывает разницу, внесенную в каждый коммит. Можно ограничить количество записей в выводе команды, используя параметр :
8 ответов
Лучший ответ
Как говорит Дифур, ваша ситуация мало чем отличается от ситуации в Измените URI (URL) удаленного репозитория Git. Когда вы репозиторий, он добавляется как ваш под именем . Что вам нужно сделать сейчас (поскольку вы больше не используете старый источник), так это изменить URL-адрес :
Если исходный репозиторий будет часто обновляться, и вы хотите получать эти обновления время от времени, то вместо редактирования было бы лучше добавить новый :
Или, может быть, даже назовите старую :
Затем, когда вы захотите получить изменения из , вы можете:
Поскольку этот источник является образцом репозитория (кажется, своего рода шаблоном для начала), я не думаю, что его нужно хранить или разветвлять вообще — здесь я выберу первую альтернативу.
131
Community
23 Май 2017 в 11:54
GitHub: чужой репозиторий и ваш собственный репозиторий
Я буду называть чужой репозиторий другим репозиторием .
-
Создайте новый репозиторий на github.com. (это ваш репозиторий )
- Дайте ему то же имя, что и другой репозиторий .
- Не инициализируйте его с помощью README, .gitignore или лицензии.
-
Клонируйте другой репозиторий на свой локальный компьютер. (если вы еще этого не сделали)
git clone https://github.com/other-account/other-repository.git
-
Переименуйте текущий локальный репозиторий » origin » в » upstream «.
git remote rename origin upstream
-
Дайте локальному репозиторию » origin «, который указывает на ваш репозиторий .
git remote add origin https://github.com/your-account/your-repository.git
-
Переместите локальный репозиторий в ваш репозиторий на github.
Теперь ‘ origin ‘ указывает на ваш репозиторий , а ‘ upstream ‘ указывает на другой репозиторий .
- Создайте новую ветку для ваших изменений с .
- Вы можете как обычно в свой репозиторий .
- Используйте , чтобы перенести изменения из другого репозитория в вашу главную ветку.
64
Derek Soike
19 Мар 2018 в 16:52
Идея состоит в том, чтобы удалить и повторно инициализировать.
- перейдите в свою клонированную папку репо rm -rf .git
- повторно инициализируйте его, а затем добавьте свой пульт и сделайте первое нажатие.
13
MAOXU
14 Дек 2017 в 04:32
Вы можете сделать это, создав новый пульт из вашего локального репозитория (через командную строку).
Тогда вы можете позвонить:
Чтобы заменить установленный по умолчанию пульт «origin», вы можете запустить следующее:
8
bmorgan21
13 Авг 2013 в 03:50
Я думаю, что «самый вежливый способ» сделать это:
- Разветвите исходное репо в своей учетной записи GitHub
- Проверьте новую ветку для ваших изменений (на случай, если вы не сделали этого раньше)
- Добавьте новый пульт для вашего локального репозитория:
- Отправьте свою новую красивую ветку в репозиторий github:
Таким образом, у вас будет репо, разветвленное на исходное, а ваши изменения будут внесены в отдельную ветку. Это будет проще, если вы хотите отправить запрос на перенос в исходное репо.
7
llekn
3 Апр 2017 в 18:19
Взято из Git перемещает все в новое происхождение
В основном вам нужно связать новое репо с вашей папкой
1
Community
23 Май 2017 в 12:10
У меня была аналогичная ситуация, но в моем случае мне просто нужно было сделать, как предлагалось, но с https , например:
1
T J
25 Мар 2016 в 06:12
После клонирования скопируйте файлы из их папки в новую и начните заново с помощью git init,
У меня была аналогичная проблема, и мне пришлось изменить каталог папки, прежде чем я смог внести изменения в свое репо.
Или вы можете удалить текущий источник репозитория с помощью команды git remote remove origin.
1
F. X. Blankson
16 Авг 2020 в 17:23
Отмена нескольких коммитов
С помощью вы можете вернуться к любой предыдущей фиксации.
Например, чтобы переместить текущую ветку на три коммита назад, вы должны использовать:
Поскольку мы используем , приведенная выше команда удалит последние три снимка из истории коммитов.
Другой способ вернуться к конкретной фиксации — передать идентификатор фиксации команде .
Используйте чтобы найти идентификаторы фиксации:
Команда отобразит список всех коммитов, включая идентификатор и первую строку сообщения о фиксации:
Как только вы узнаете идентификатор коммита, на который хотите выполнить сброс, просто передайте его в команду :
Общее
Git — система контроля версий (файлов). Что-то вроде возможности сохраняться в компьютерных играх (в Git эквивалент игрового сохранения — коммит)
Важно: добавление файлов к «сохранению» двухступенчатое: сначала добавляем файл в индекс (), потом «сохраняем» ()
Любой файл в директории существующего репозитория может находиться или не находиться под версионным контролем (отслеживаемые и неотслеживаемые).
Отслеживаемые файлы могут быть в 3-х состояниях: неизменённые, изменённые, проиндексированные (готовые к коммиту).
Ключ к пониманию
Ключ к пониманию концепции git — знание о «трех деревьях»:
- Рабочая директория — файловая система проекта (те файлы, с которыми вы работаете).
- Индекс — список отслеживаемых git-ом файлов и директорий, промежуточное хранилище изменений (редактирование, удаление отслеживаемых файлов).
- Директория — все данные контроля версий этого проекта (вся история разработки: коммиты, ветки, теги и пр.).
Коммит — «сохранение» (хранит набор изменений, сделанный в рабочей директории с момента предыдущего коммита). Коммит неизменен, его нельзя отредактировать.
У всех коммитов (кроме самого первого) есть один или более родительских коммитов, поскольку коммиты хранят изменения от предыдущих состояний.
Простейший цикл работ
- Редактирование, добавление, удаление файлов (собственно, работа).
- Индексация/добавление файлов в индекс (указание для git какие изменения нужно будет закоммитить).
- Коммит (фиксация изменений).
- Возврат к шагу 1 или отход ко сну.
Указатели
- — указатель на текущий коммит или на текущую ветку (то есть, в любом случае, на коммит). Указывает на родителя коммита, который будет создан следующим.
- — указатель на коммит, с которого вы только что переместили (командой , например).
- Ветка (, etc.) — указатель на коммит. При добавлении коммита, указатель ветки перемещается с родительского коммита на новый.
- Теги — простые указатели на коммиты. Не перемещаются.
Перед началом работы нужно выполнить некоторые настройки:
Если вы в Windows:
Длинный вывод в консоли: Vim
Если нужно что-то написать, нажмите i — это переход в режим вставки текста. Если нужно сохранить изменения, перейдите в командный режим и наберите :w.
# Нажатия кнопок ESC — переход в командный режим i — переход в режим редактирования текста ZQ (зажат Shift, поочередное нажатие) — выход без сохранения ZZ (зажат Shift, поочередное нажатие) — сохранить и выйти ```bash # Нажатия кнопок ESC — переход в командный режим i — переход в режим редактирования текста ZQ (зажат Shift, поочередное нажатие) — выход без сохранения ZZ (зажат Shift, поочередное нажатие) — сохранить и выйти # Ввод в командном режиме :q! — выйти без сохранения :wq — сохранить файл и выйти :w filename.txt — сохранить файл как filename.txt
12 ответов
Лучший ответ
Запуск выполняет следующие задачи по порядку:
Шаг слияния объединяет ветки, которые были настроены для слияния в вашей конфигурации. Вы хотите отменить этап слияния , но, вероятно, не выборку (не имеет большого смысла и в этом нет необходимости).
Чтобы отменить слияние , используйте для сброса локального репозитория в предыдущее состояние; используйте git-reflog, чтобы найти SHA- 1 из предыдущего состояния, а затем сбросить на него.
Предупреждение
Команды, перечисленные в этом разделе, удаляют все незафиксированные изменения, что может привести к потере работы:
В качестве альтернативы можно выполнить сброс на определенный момент времени, например:
1679
Dave Jarvis
20 Сен 2019 в 19:51
То же, что и ответ jkp, но вот полная команда:
Где a0d3fe6 находится путем выполнения
И глядя на точку, в которой вы хотите отменить.
402
Jeffrey Sun
22 Июл 2014 в 00:39
Более современный способ отменить слияние:
И немного более старый способ:
Старый способ, описанный в предыдущих ответах (предупреждение: все ваши локальные изменения будут отменены):
Но на самом деле стоит отметить, что эквивалентен только при наличии . Это можно прочитать в справке git для команды слияния.
После неудачного слияния, когда нет , неудачное слияние можно отменить с помощью , но не обязательно с помощью , поэтому они не только старый и новый синтаксис для то же самое . Вот почему я считаю гораздо более полезным в повседневной работе.
148
Martin G
20 Май 2015 в 09:17
Оно работает первое использование:
Найдите свой SHA предыдущего состояния и создайте (пример HEAD @ {1})
72
Ezequiel García
8 Мар 2016 в 17:00
Если у вас есть gitk (попробуйте запустить «gitk —all из командной строки git»), это просто. Просто запустите его, выберите фиксацию, к которой вы хотите выполнить откат (щелкните правой кнопкой мыши), и выберите «Сбросить главную ветку сюда». Если у вас нет незавершенных изменений, выберите «жесткий» вариант.
42
Samuel Carrijo
3 Авг 2009 в 16:49
Предположим, что был последним идентификатором фиксации перед выполнением . Что вам нужно, чтобы отменить последнее нажатие, так это
Бонус :
Говоря о вытягивании, я хотел бы поделиться интересным трюком,
Эта команда выше — самая полезная команда в моей жизни с git, которая сэкономила много времени.
Прежде чем отправлять новую фиксацию на сервер, попробуйте эту команду, и она автоматически синхронизирует последние изменения сервера (с помощью fetch + merge) и поместит вашу фиксацию наверху в журнале git. Не нужно беспокоиться о ручном извлечении / слиянии.
Подробности можно найти на странице: http://gitolite.com/git-pull—rebase
42
Community
20 Июн 2020 в 09:12
Это самый простой способ отменить изменения.
Сделайте резервную копию измененных файлов, поскольку при этом будут удалены вновь созданные файлы и папки .
Где — ваш {идентификатор фиксации}
20
Manish Goswami
5 Дек 2019 в 07:25
Ты можешь сделать
Так как «pull» или «merge» устанавливают ORIG_HEAD как текущее состояние перед выполнением этих действий.
18
Orlando
19 Авг 2015 в 17:02
Если происходит сбой слияния, что является наиболее частой причиной желания отменить , запуск делает именно то, что и ожидалось: сохраняют выбранные файлы, но отменяют слияние, которое предпринята попытка слияния. Затем можно решить, что делать без беспорядка, который иногда создает . И не нужно искать точный идентификатор фиксации, который требуется , упомянутым во всех остальных ответах.
7
Davide
24 Сен 2018 в 17:35
git pull выполните операцию ниже.
Чтобы отменить вытягивание, выполните любую операцию:
Улучшение:
В следующий раз используйте вместо .. его сервер синхронизации измените, выполнив (выборка и слияние).
5
GolamMazid Sajib
5 Апр 2020 в 13:38
Попробуй бежать
3
henrique_ms
27 Авг 2020 в 18:06
Самый быстрый способ решить эту проблему —
3
Azeez Bello
13 Мар 2021 в 16:33
Архитектура Git с тремя деревьями
В Git вы можете отменить изменения, используя команду за которой следует идентификатор фиксации.
принимает дополнительные аргументы, которые позволяют вам управлять поведением команды. Чтобы лучше понять, как работает давайте поговорим о трех разных деревьях Git. Архитектура с тремя деревьями — ключевая концепция системы управления Git. Они называются деревьями, потому что представляют собой наборы файлов.
Git управляет следующими тремя деревьями:
- Рабочий каталог — каталог, включающий все подкаталоги и файлы в локальной файловой системе, связанной с репозиторием. Его часто называют «рабочим деревом». Рабочий каталог — это что-то вроде песочницы, где вы можете протестировать изменения перед их фиксацией в промежуточном индексе.
- Индекс — это дерево отслеживает новые или измененные файлы, которые были добавлены в индекс с помощью , для включения в следующую фиксацию. Его часто называют «промежуточной областью» или «промежуточным индексом».
- — указатель на вашу последнюю фиксацию в текущей ветке.
Команда имеет три аргумента, которые соответствуют трем деревьям:
- — обновляет указатель для данной фиксации. Рабочий каталог и Индекс не меняются.
- — обновляет указатель и сбрасывает индекс до указанной фиксации. Рабочий каталог остается нетронутым. Это режим работы по умолчанию для команды .
- — обновляет указатель и сбрасывает индекс и рабочий каталог до указанной фиксации. Будьте особенно осторожны при использовании этой опции, так как все локальные изменения, которые вы не зафиксировали, будут перезаписаны и потеряны.
Удаление файлов из git репозитория и из stage
Удаление файла из stage
Вначале разберемся со stage. Создадим ещё один файл.
> touch main.c
“Отправим” файл main.c в stage.
> git add main.c
Внесем изменения в README.md.
> echo "# README" > README.md
Информацию об этом также отправим в stage.
> git add README.md
Посмотрим на состояние stage.
> git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.md new file: main.c
Если нам необходимо убрать из stage, какой-то из этих файлов (main.c или README.md), то для этого можно воспользоваться командой git –rm cashed <filename>, сделаем это для файла main.c.
> git rm --cached main.c rm 'main.c'
Теперь посмотрим на состояние рабочей директории и stage.
> git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: README.md Untracked files: (use "git add <file>..." to include in what will be committed) main.c
Видно, что изменения в файле README.md готовы для коммита, а вот файл main.c перешел в состояние – неотслеживаемый. Отправим main.c в stage и, после этого, сделаем коммит в репозиторий.
> git add main.c > git commit -m "add main.c and do some changes in README.md" add main.c and do some changes in README.md 2 files changed, 1 insertion(+) create mode 100644 main.c
Удаление файлов из git репозитория
Удалить файл из репозитория можно двумя способами: первый – удалить его из рабочей директории и уведомить об этом git; второй – воспользоваться средствами git. Начнем с первого способа. Для начала посмотрим, какие файлы у нас хранятся в репозитории.
> git ls-tree master 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
Удалим файл main.c из рабочей директории.
> rm main.c > ls README.md
Уведомим об этом систему git.
> git rm main.c rm 'main.c'
Вместо команды git rm можно использовать git add, но само слово add в данном случае будет звучать несколько неоднозначно, поэтому лучше использовать rm. На данном этапе еще можно вернуть все назад с помощью команды git checkout — <filename>, в результате, в нашу рабочую директорию будет скопирован файл из репозитория. Создадим коммит, фиксирующий удаление файла.
> git commit -m "remove main.c" remove main.c 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 main.c
Теперь в репозитории остался только один файл README.md.
> git ls-tree master 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
Второй способ – это сразу использовать команду git rm без предварительного удаления файла из директории. Вновь создадим файл main.c и добавим его в репозиторий.
> touch main.c > git add main.c > git commit -m "add main.c file" add main.c file 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 main.c > git ls-tree master 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
Удалим файл из репозитория.
> git rm main.c rm 'main.c' > git commit -m "deleted: main.c file" deleted: main.c file 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 main.c
Файла main.c больше нет в репозитории.
> git ls-tree master 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
Его также нет и в рабочем каталоге.
> ls README.md
Удалите файл README.md из репозитория самостоятельно.
Навигация
Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по коммитам вашего проекта
Detaching HEAD
Давайте разберемся, как нам откатиться к более старой версии нашего репозитория.
У git есть указатели на коммиты, своеобразный ярлыки (бирка), которые перемещаются от коммита к коммиту. Одним из таких ярлыков-указателей является .
— это символическое имя текущего выбранного коммита. По сути это, тот коммит, над которым мы в данным момент работаем.
Указатели могут ссылаться на другие указатели, обычно указывает на имя ветки. Но это можно изменить, например указать hash нужного коммита, чтобы откатиться к нему.
Создадим еще один файл и сделаем третий коммит:
Мы видим, что сейчас указывает на , это тоже указатель, обозначающий ветку. То есть указывает на , который в свою очередь указывает на коммит . Отделение (detaching) означает лишь присвоение его не ветке, а конкретному коммиту.
Представим, что нам надо посмотреть, как выглядел наш репозиторий после второго коммита. Для этого используем команду и хэш второго коммита. Кстати, можно не указывать его целиком, достаточно первых 5 символов.
Таким образом мы переключились на состояние второго коммита, в котором у нас еще не было файла , проверим это:
Вызвав видим, что теперь указывает на второй коммит:
При этом мы не потеряли третий коммит и все изменения в нем, можем убедиться в этом с помощью следующей команды:
Вернем указатель на :
Относительные ссылки
Передвигаться по коммитам при помощи указания хешей неудобно. Поэтому Git поддерживает относительные ссылки. С относительными ссылками можно начать с какого-либо удобного места и двигаться от него.
Относительные ссылки — мощный инструмент, но мы разберем два простых способа использования:
- Перемещение на один коммит назад
- Перемещение на коммитов назад
Для начала рассмотрим оператор каретки Когда мы добавляем его к имени указателя, Git воспринимает это как команду найти родителя выбранного коммита. Так что означает “первый родитель ветки main”. означает прародитель (родитель родителя) .
Давайте переключимся на коммит выше :
Да, мы снова попали на второй коммит, то есть сейчас вновь указывает на второй коммит.
Может показаться, нужно еще раз вызвать команду , чтобы попасть на первый коммит. Но это не так, указатель остался на третьем коммите, мы сдвинули . Поэтому запросит снова родителя третьего коммита.
Чтобы попасть на первый коммит, можно использовать указатель . Попробуем перейти к первому коммиту:
Вернемся на третий коммит:
Оператор Предположим, нужно переместиться на много шагов назад. Было бы неудобно печатать несколько раз, так что Git поддерживает также оператор тильда .
Опционально к тильде можно добавить количество родительских коммитов, через которые нужно пройти. Посмотрим, как это работает.
Мы переместились на первый коммит. Вернемся:
Как избежать такого в дальнейшем?
В GitHub и GitLab есть функциональность под названием «защищённые ветки» (protected branches). Отметьте , , или какие ещё ветки важны для вас как защищённые и система не даст вам выстрелить себе в ногу. Если force push всё же понадобится, то защиту всегда можно на время снять. См
документацию: https://help.github.com/articles/defining-the-mergeability-of-pull-requests/
Создайте алиасы для команд, которые должны делать , чтобы обезопасить себя от ошибок по неосторожности:
Прекратите уже экспериментировать прямо в основной ветке! Команда — ваш друг.
Pro Tip: У команды также ещё очень хорошо сочетаются друг с другом ключи и , особенно, если вы отвлеклись от проекта на месяцок-другой. Попробуйте, если, конечно, вам всё ещё мало приключений…