Вы спотыкаетесь о кучу незначительных раздражений, которые у меня есть с git, все в одно и то же время. Это на самом деле хороший знак. :-)
Во-первых, rebase имеет проблемы с «переустановкой» корневого фиксации. В достаточно современных версиях вы можете сделать это с помощью git rebase -i --root
, что позволит вам сквош или фиксацию второй фиксации в первом (корневом) фиксации. Вам нужен аргумент --root
. (Старые версии мерзавца не хватает --root
и сделать это значительно более трудным.)
Следующая:
какая разница между выбором и сквош
В интерактивном перебазироваться, pick
означает «взять commit as is is ", а squash
означает« добавить эту фиксацию поверх предыдущего коммита ». Не существует принципиальной разницы между squash
и fixup
, за исключением того, что первый дает вам возможность редактировать сообщение фиксации, а последний просто берет «исправление» как изменение дерева (полностью отбрасывая текст сообщения фиксации).
, что разница между фиксацией и ветвями
Коммит является фактическим объектом внутри хранилища. «Ветвь» - это двусмысленный термин, который иногда означает «метку ветки», которая является просто ссылкой на фиксацию или, что то же самое, на имя для одного фиксации, а иногда и на структуру данных, образованную рядом совершает свое происхождение.
Это было сказано, что «мерзавец имеет смысл, когда вы понимаете, X», для многих различных значений X. Это обобщается на «git, имеет смысл, когда вы понимаете git». :-) На самом деле это правда не только в тавтологическом смысле, но и не очень помогает в вас! К счастью, this web series очень полезно (на мой взгляд). Прочитайте все это и то, что «ветвь» неоднозначна, но обычно очевидна, что кто-то означает, вероятно, будет иметь больше смысла.
Edit: пример сеанса:
$ cd /tmp/trepo
$ git init
Initialized empty Git repository in /tmp/trepo/.git/
$ echo data > somefile; git add somefile; git commit -m 'first check in'
[master (root-commit) 64a2d9f] first check in
1 file changed, 1 insertion(+)
create mode 100644 somefile
$ echo other > another-file; git add another-file
$ git commit -m 'combine with first check in'
[master d375b81] combine with first check in
1 file changed, 1 insertion(+)
create mode 100644 another-file
$ git rebase -i --root
[in editor, change second line from "pick" to "fixup"; write and quit]
".git/rebase-merge/git-rebase-todo" 20L, 667C written
[detached HEAD 5b2a979] first check in
2 files changed, 2 insertions(+)
create mode 100644 another-file
create mode 100644 somefile
Successfully rebased and updated refs/heads/master.
$ git log --oneline
5b2a979 first check in
Примечание другой незначительные мерзавец раздражение: git log
показывает совершает в новый к старому порядку, но git rebase -i
показывает их в старых к новым порядка.
И: если у вас есть push
ed, пульт имеет старый обязывает, а не новый. Таким образом, вы увидите как старые, доступные до origin/master
(при условии, что пульт называется origin
, и вы используете обычную настройку), и одно (одно) новое, доступное через master
. Вам нужно будет получить отдаленное репо, чтобы взять новый master
, например, через git push -f
(со всеми его последствиями ...).
Это один из лучших ответов, которые я получил от SO! Одна из серьезных проблем, которые я вижу с Git, заключается в том, что вы должны снизить свои ожидания от того, что поддерживает инструмент. Что-то вроде того, что я пытаюсь сделать, должно быть совершенно простым, но есть исключения. Вы будете часами размахивать головой о стену, пока не узнаете, что она не поддерживает то, что вы пытаетесь сделать. Я рассматриваю это как большой провал в том, что его сложность скрывает и его удобство использования, и ошибки, и отсутствие функциональности. –
@ user148298: Git может (я нахожу) на самом деле делать большинство вещей, которые могут потребоваться; это просто, что его интерфейс, ну, почти активно «начинающий-враждебный» по-разному. Например, проблема с пересылкой возникла из-за того, что по своей сути «rebase» действительно хочет поместить новые коммиты * на что-то, поэтому он не позволит вам «перезагрузить» корневую фиксацию, которая не «на» ничего, и, следовательно, не позволит вам раздавить второй фиксатор, который он рассматривает как 1-й. Это теперь перепечатывается через '--root', но на самом деле не нужно * * -root'. – torek
С технической точки зрения, это имеет смысл, но из прецедента он невероятно ослеп. Поговорите о протекающих абстракциях! Я запускаю TortoiseGit, Git Gui, VS Git Plugin, Windows Cmd Git Shell, Bash Shell и PowerShell на том же самом поле. Зачем? Чтобы я не мог узнать, как это сделать на одном, я могу попытаться сделать это на других. «Новичок» является неправильным, поскольку он скрывает тот факт, что некоторые люди никогда не выходят из начальной фазы. Его следует называть «злоупотребляемым пользователем». Прямо сейчас, я пытаюсь выяснить, почему Git не добавляет мою пустую папку Assets, и все пути приводят меня к отсутствию поддержки для этого. –