Обязательно ли объединение в Git? - PullRequest
1 голос
/ 26 января 2012

Я сейчас пользуюсь SVN. Но я просто использую checkout, update и commit, поскольку мне просто нужна резервная копия с историей.

Я пытаюсь Git сейчас в новом проекте. Вот что я сделал:

  • Создан репозиторий в Bitbucket.
  • Git клон на мою машину.
  • Создал пару файлов.
  • Git commit -a.
  • Git push.

Все хорошо. Я проверил Bitbucket, и файлы были там. Это было вчера. Сегодня я сделал:

  • Добавлено еще несколько файлов.
  • Git commit -a.
  • Git push.

И я получил сообщение об ошибке. Я не сохранил его, но он сказал что-то о перемотке вперед. По какой-то причине я не мог выдвинуть свой коммит в хранилище. Я сделал несколько выборок, фиксаций и нажатий и получил ту же ошибку при нажатии. Затем я сделал тягу, которая, насколько я знаю, это выборка, затем слияние, затем толчок, и это сработало (вроде). Мой журнал репозитория теперь выглядит так:

commit ef6b0e51c8278ef15d1d84770a56929f7c30cc63
Merge: 15d482c ab3938a
Author: xxx
Date:   Wed Jan 25 04:25:39 2012 -0200

    Merge branch 'master' of bitbucket.org:xxx/xxx

commit 15d482c0bd2e9b894afd779520dbfdbad7f43616
Author: xxx
Date:   Tue Jan 24 03:50:43 2012 -0200

    xxx

commit ab3938aaacb089f1c4f3bdbb8d843a105991f776
Author: xxx
Date:   Tue Jan 24 03:50:43 2012 -0200

    xxx

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

Это так и должно быть? Или я сделал что-то не так? Нужно ли объединять коммит и пуш?

Ответы [ 4 ]

1 голос
/ 26 января 2012

Я понял, в чем проблема. Я проверил «Amend Last Commit» на втором коммите. Итак, в основном я сделал:

  • Создание хранилища в Bitbucket.
  • Клон.
  • Добавить файл1.
  • Commit.
  • Нажмите.
  • Добавить файл2.
  • Commit --amend
  • Нажмите.

Я получил ошибку:

git.exe push --progress  "origin" master:master

To git@bitbucket.org:xxx/test_repo.git
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:xxx/test_repo.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Я попытался получить и объединить. Все еще не мог нажать. Я должен был сделать тягу. Я получил:

git.exe pull -v --progress      "origin"

From bitbucket.org:xxx/test_repo
= [up to date]      master     -> origin/master
Merge made by the 'recursive' strategy.
Success

Тогда я мог бы толкнуть.

Исправить коммит, который уже был выдвинут, была проблема. Вот почему обе коммиты имеют одинаковую дату.

Спасибо всем за помощь.

1 голос
/ 26 января 2012

Выдвижение возможно только в том случае, если выдвинутая ветвь может быть объединена с выдвинутой ветвью с помощью слияния fast-forward, что означает, что текущий заголовок удаленной ветки должен быть частью вашей истории локальных ветвей.Если у вас нет последней версии удаленной ветки, слитой с вашей локальной веткой, push не удастся (это то же самое, что и с svn, где вы не можете зафиксировать, если ваша локальная версия не устарела).

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

Таким образом, если вы работаете над одной веткой (и только из одного местоположения), вы обычно можете избежать коммитов и толчков, в противном случае вам может понадобиться использовать git fetch с последующим git merge (или просто * 1008).*) чтобы получить самую последнюю версию удаленной ветки, прежде чем вы сможете нажать ее.

1 голос
/ 26 января 2012

Похоже, какой-то другой пользователь добавил коммит в ваш репозиторий BitBucket. То, что вы описываете, это именно то, что произойдет, если ваш пуш потерпел неудачу с сообщением, что git не может перемотать вперед.

Очевидно, что это должно было произойти, потому что в журнале git было что-то для слияния в ef6b0e5.

И вы нашли решение: вам нужно было вытащить (извлечь и объединить вышестоящее изменение в вашу ветку) из репозитория Bitbucket, прежде чем git позволит вам отправить ваши изменения.

1 голос
/ 26 января 2012

Если вы не можете нажать push, потому что это не ускоренное обновление, то это означает, что кто-то нажал коммит в bitbucket. Ускоренное обновление - это обновление предыдущего коммита в истории текущего коммита, т.е. Вы не делаете слияние, вы просто ускоряете время.

Pull выполнит git fetch, а затем git merge, что может или не может привести к фактическому слиянию, git выполнит ускоренную перемотку по умолчанию, если это вообще возможно.

Из вашего журнала выше произошло фактическое слияние, поэтому мы вернулись к исходной точке. Каким-то образом некоторые дополнительные коммиты попали в ваш репозиторий bitbucket. Возможно, вы редактировали онлайн?

Что касается вашего вопроса о требовании слияния, нет, вам не нужно , чтобы выполнить слияние. Вы должны решить вилку, хотя. Вы можете сделать это одним из двух способов. Вы можете сделать слияние или сделать то, что называется перебазированием. По сути, то, что делает git, когда вы делаете ребаз, - это повторное использование различий ваших коммитов до конца альтернативной истории. Это создает иллюзию того, что вы сделали свою новую работу прямо поверх другой новой работы. Git сохраняет даты авторов и коммитов, поэтому история может стать немного нелинейной, если вы много перебираете, однако некоторые люди предпочитают однострочную историю. Вы можете легко сделать ребаз, используя git pull --rebase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...