Подтвердить что ты не робот

В чем разница между git reset "vs" git rebase "?

Я играл с git (все еще очень нубом), и мне хотелось узнать разницу между "reset" и "rebase". Является ли это более мощным, чем другой?

Скажем, я хотел удалить 3 объекта, выделенные жирным шрифтом из истории, какой из них лучше использовать, или я должен пометить его, а затем удалить его с помощью git tag -d <tagname>?

17a64df 2012-06-21 | Привет использует style.css(HEAD, origin/style, master),
a6792e4 2012-06-21 | Добавлена ​​таблица стилей CSS 801e13e 2012-06-21 | Добавлен README
5854339 2012-06-21 | Добавлен index.html
0b1dd4c 2012-06-21 | Перемещено hello.html в lib
55649c3 2012-06-21 | Добавить комментарий автора/электронной почты
9b2f3ce 2012-06-21 | Добавлен комментарий к автору
cdb39b0 2012-06-21 | Зафиксировать теги p с текстом (v1.1)
b7b5fce 2012-06-21 | Это возвращает commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8.
a6faf60 2012-06-21 | Revert "Ой, мы не хотели этого коммита"
a006669 2012-06-21 | К сожалению, нам не нужна эта фиксация
262d1f7 2012-06-21 | Добавлен HTML-заголовок (v1)
b1846e5 2012-06-21 | Добавлены стандартные HTML-теги (v1-бета)
bf1131e 2012-06-21 | Добавлен HI TAG
02b86d0 2012-06-21 | Первая фиксация

4b9b3361

Ответ 1

Они совершенно разные. git-reset работает с refs, в вашем рабочем каталоге и индексе, не касаясь каких-либо объектов фиксации (или других объектов). git-rebase, с другой стороны, используется для перезаписи ранее сделанных объектов фиксации.

Итак, если вы хотите переписать историю, git-rebase - это то, что вы хотите. Обратите внимание, что вы должны никогда переписывать историю, которая была нажата, и была доступна кому-то другому, поскольку перезагрузка перезаписывает объекты, делающие их несовместимыми со старыми объектами, что приводит к беспорядку для всех остальных.

Говоря, что вы хотите сделать ist интерактивное перезагрузка. Вызовите его с помощью git rebase -i 262d1f7, и вы получите приглашение следующего вида:

pick 262d1f7 Added HTML header (v1)
pick a006669 Oops, we didn't want this commit
pick a6faf60 Revert "Oops, we didn't want this commit"
pick b7b5fce This reverts commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8.
pick cdb39b0 Commit p tags with text (v1.1)
pick 9b2f3ce Added an author comment
pick 55649c3 Add an author/email comment
pick 0b1dd4c Moved hello.html to lib
pick 5854339 Added index.html
pick 801e13e Added README
pick a6792e4 Added css stylesheet
pick 17a64df Hello uses style.css (HEAD, origin/style, master),

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

Ответ 2

Хотя это не сравнивает различия между ними, здесь отличная статья, объясняющая перестановку, которую легко понять.