Добавление, удаление и отслеживание изменений в git (git add, git status, git remove)

Git tools для продвинутых разработчиков

Git tools для продвинутых разработчиков

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

В этом руководстве объясняется, как изменить сообщение о самых последних или старых коммитах Git.

Не задний коммит

Чтобы изменить сообщение самого последнего коммита, который не был в удаленный репозиторий, его снова, используя флаг .

  1. Перейдите в каталог хранилища в вашем терминале.

    Выполните следующую команду, чтобы изменить (изменить) сообщение о последнем коммите:

    Команда выполняет перезапись самого последнего коммита новым.

    Опция позволяет вам написать новое сообщение в командной строке, не открывая сеанс редактора.

Перед изменением сообщения о коммите вы также можете добавить другие ранее забытые изменения:

Задний коммит

Измененный (измененный) коммит — это новый объект с другим SHA-1. Предыдущий коммит больше не будет существовать в текущей ветке.

Как правило, вам следует избегать внесения изменений в коммит, который уже выдвинут, поскольку это может вызвать проблемы у людей, которые основывают свою работу на этом коммите. Хорошей идеей будет проконсультироваться со своими коллегами-разработчиками перед изменением принудительного коммита.

  1. Перейдите в хранилище.

    Исправьте сообщение о последнем введенном коммите:

    Принудительно нажмите, чтобы обновить историю удаленного хранилища:

Изменение старого или нескольких коммитов

Команда переписывает историю коммитов, и настоятельно не рекомендуется перебазировать коммиты, которые уже переданы в удаленный репозиторий Git.

  1. Перейдите в хранилище, содержащее сообщение фиксации, которое вы хотите изменить.

    Введите , где — количество коммитов, на которых необходимо выполнить ребазинг. Например, если вы хотите изменить 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: чужой репозиторий и ваш собственный репозиторий

Я буду называть чужой репозиторий другим репозиторием .

  1. Создайте новый репозиторий на github.com. (это ваш репозиторий )

    • Дайте ему то же имя, что и другой репозиторий .
    • Не инициализируйте его с помощью README, .gitignore или лицензии.
  2. Клонируйте другой репозиторий на свой локальный компьютер. (если вы еще этого не сделали)

    git clone https://github.com/other-account/other-repository.git

  3. Переименуйте текущий локальный репозиторий » origin » в » upstream «.

    git remote rename origin upstream

  4. Дайте локальному репозиторию » origin «, который указывает на ваш репозиторий .

    git remote add origin https://github.com/your-account/your-repository.git

  5. Переместите локальный репозиторий в ваш репозиторий на github.

Теперь ‘ origin ‘ указывает на ваш репозиторий , а ‘ upstream ‘ указывает на другой репозиторий .

  • Создайте новую ветку для ваших изменений с .
  • Вы можете как обычно в свой репозиторий .
  • Используйте , чтобы перенести изменения из другого репозитория в вашу главную ветку.

64

Derek Soike
19 Мар 2018 в 16:52

Идея состоит в том, чтобы удалить и повторно инициализировать.

  1. перейдите в свою клонированную папку репо rm -rf .git
  2. повторно инициализируйте его, а затем добавьте свой пульт и сделайте первое нажатие.

13

MAOXU
14 Дек 2017 в 04:32

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

Тогда вы можете позвонить:

Чтобы заменить установленный по умолчанию пульт «origin», вы можете запустить следующее:

8

bmorgan21
13 Авг 2013 в 03:50

Я думаю, что «самый вежливый способ» сделать это:

  1. Разветвите исходное репо в своей учетной записи GitHub
  2. Проверьте новую ветку для ваших изменений (на случай, если вы не сделали этого раньше)
  3. Добавьте новый пульт для вашего локального репозитория:
  4. Отправьте свою новую красивую ветку в репозиторий 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: У команды также ещё очень хорошо сочетаются друг с другом ключи и , особенно, если вы отвлеклись от проекта на месяцок-другой. Попробуйте, если, конечно, вам всё ещё мало приключений…

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: