Почему Git не знает, что я слился? Есть ли способ сказать это? - PullRequest
2 голосов
/ 23 мая 2009

Я использую git-svn; Я обычно создаю ветку темы, делаю коммиты на нее, затем проверяю master, git svn rebase, git merge --squash topic_branch, git commit -m "суммарный комментарий", затем git svn dcommit.

Это отлично работает, но git, похоже, не знает, что я слил изменения ветки в master. Я пробовал это без участия SVN:

# Make a repository, add a couple files
$ mkdir gittest
$ cd gittest
$ git init
$ touch foo bar
$ git add .
$ git commit -m "initial version"

# Make a branch, change a file, commit.
$ git checkout -b a_branch
$ vi foo # make a change
$ git commit -am "a change"

# Merge changes into master
$ git checkout master
$ git merge --squash a_branch
$ git commit -m "merged a_branch"

и gitk - все это показывает, что указывает на то, что это не проблема git-svn:

Гитк-картинка, показывающая, по-видимому, неотделенную ветвь http://selfamusementpark.com/pic/hosted/gittest.png?sekrit=NADEU6

В моем основном (git-svn) проекте я вижу некоторые изменения на раннем этапе, которые, похоже, были объединены, но я не знаю, что я делаю по-другому сейчас, когда я этого не делал тогда. (Это git 1.6.0.4 на Ubuntu Jaunty, если это имеет значение.)

Ответы [ 4 ]

8 голосов
/ 23 мая 2009

Я думаю, это потому, что вы использовали --squash. Я не уверен, почему ты это сделал, но тебе это не нужно. Из документации --squash для git merge:

Создание рабочего дерева и индекса заявить, что произошло реальное слияние, но на самом деле не делать коммит или двигаться ГОЛОВА, ни запись $ GIT_DIR / MERGE_HEAD, чтобы вызвать следующий команда git commit для создания слияния совершить. Это позволяет вам создать одиночный коммит поверх текущего филиал, чей эффект такой же, как объединение другой ветви (или более в случай осьминога).

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

3 голосов
/ 23 мая 2009

Только не используйте git merge --squash:)

1 голос
/ 23 июня 2009

После того, как вы выполните слияние в сквош, вам нужно вручную сообщить git о своем слиянии, потому что после того, как вы dcommit git забудет Чтобы сообщить git о своем слиянии вручную, используйте git-трансплантаты. текст ссылки

1 голос
/ 25 мая 2009

Добавить к ответу Питера Купера (комментарии были недостаточно длинными):

git rebase --interactive (хотя бензопила опасна: см. http://tomayko.com/writings/the-thing-about-git для получения дополнительной информации и информации о том, почему вы когда-либо захотите ее использовать), позволит вам раздавить и изменить порядок отдельных коммитов, прежде чем отправлять их в svn. Я часто использую его для того, чтобы объединить 10-12 промежуточных коммитов в 3-4 набора патчей перед возвращением в репо.

Попробуйте git rebase --interactive HEAD~10, чтобы интерактивно перебазировать последние 10 коммитов в вашей текущей ветке. Очень приятно, когда вы изучаете его, и я ежедневно использую его в своем git svn repo.

...