2014-01-25 1 views
0

Хорошо. Я нахожусь на своем пути, пытаясь выяснить, почему я не могу объединить две коммиты в одну. Гит ужасно сложный. У меня есть ряд фиксаций, который выглядит, как это локально, так и удаленно:Почему я не могу объединить фиксации в одном?

commit 6abb264c06b06d42ea7e07a469107b9d3d72dffa 
Author: XXXX <[email protected]> 
Date: Thu Jan 23 15:59:03 2014 -0500 

    First Check-in again (forgot to add project file and forgot to tick off append to last commit) 


commit 90b2468f5267a471d52f2d7cc7cb1cd8604b3b86 
Author: XXXX <[email protected]> 
Date: Wed Jan 22 22:57:20 2014 -0500 

    First check-in 

Я хочу, чтобы объединить их вместе в выглядеть следующим образом:

commit 90b2468f5267a471d52f2d7cc7cb1cd8604b3b86 
Author: XXXX <[email protected]> 
Date: Wed Jan 22 22:57:20 2014 -0500 

    First check-in 

Я пытался перебазироваться с помощью подборщик, сквош и независимо тыквы именованная команда доступна безрезультатно. Это говорит мне, что у него есть сквош/слитый/выбранный, но я всегда вижу два коммита вместо одного.

Также не мог понять, в чем разница между выбором и сквошем. Кроме того, я не могу сказать, какая разница между фиксацией и ветвью. Более того, я читал, что ветка - это просто фиксация, но почему мы должны объединять ветки, но pick/squash (??) фиксируется? Это ужасно запутанно.

ответ

4

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

+0

Это один из лучших ответов, которые я получил от SO! Одна из серьезных проблем, которые я вижу с Git, заключается в том, что вы должны снизить свои ожидания от того, что поддерживает инструмент. Что-то вроде того, что я пытаюсь сделать, должно быть совершенно простым, но есть исключения. Вы будете часами размахивать головой о стену, пока не узнаете, что она не поддерживает то, что вы пытаетесь сделать. Я рассматриваю это как большой провал в том, что его сложность скрывает и его удобство использования, и ошибки, и отсутствие функциональности. –

+0

@ user148298: Git может (я нахожу) на самом деле делать большинство вещей, которые могут потребоваться; это просто, что его интерфейс, ну, почти активно «начинающий-враждебный» по-разному. Например, проблема с пересылкой возникла из-за того, что по своей сути «rebase» действительно хочет поместить новые коммиты * на что-то, поэтому он не позволит вам «перезагрузить» корневую фиксацию, которая не «на» ничего, и, следовательно, не позволит вам раздавить второй фиксатор, который он рассматривает как 1-й. Это теперь перепечатывается через '--root', но на самом деле не нужно * * -root'. – torek

+0

С технической точки зрения, это имеет смысл, но из прецедента он невероятно ослеп. Поговорите о протекающих абстракциях! Я запускаю TortoiseGit, Git Gui, VS Git Plugin, Windows Cmd Git Shell, Bash Shell и PowerShell на том же самом поле. Зачем? Чтобы я не мог узнать, как это сделать на одном, я могу попытаться сделать это на других. «Новичок» является неправильным, поскольку он скрывает тот факт, что некоторые люди никогда не выходят из начальной фазы. Его следует называть «злоупотребляемым пользователем». Прямо сейчас, я пытаюсь выяснить, почему Git не добавляет мою пустую папку Assets, и все пути приводят меня к отсутствию поддержки для этого. –

Смежные вопросы