Хорошая стратегия для исправления нежелательных коммитов и неправильных слияний в Git - PullRequest
2 голосов
/ 02 ноября 2011

У нас есть проблема / недоразумение с нашей текущей настройкой git.У нас есть локальный мастер и локальные функции / пользовательские ветвиФилиалы связаны с различными удаленными филиалами по умолчанию.Если я извлекаю мастер и хочу получить последние изменения, git сообщает мне, что я впереди удаленного мастера.Глядя на разность файла, который я ожидал извлечь с пульта, я вижу, что это все еще старый файл, не имеющий последних изменений с пульта.

Вот мой пример рабочего процесса + вывод:

$ git checkout master
Already on 'master'
Your branch is ahead of 'origin/master' by 8 commits.

Я не хочу нажимать, но я хочу, чтобы все файлы обновлялись локально:

$ git pull origin/master
From git://...
* branch      master -> FETCH_HEAD
Already up-to-date.

Теперь давайте посмотрим на файл (somefile), который должен был быть обновлен:

$ git diff origin/master somefile
# this is not supposed to show anything but it results in a diff output

diff --git a/... b/...
index ...
---
+++
@@ -1,9 +1,8 @@
 ...    
-remoteText that I actually want to have
+localText that I wanted to be updated/replaced
 ...

Вот исходная конфигурация:

$ git remote show origin
* remote origin
  Fetch URL: git://...
  Push  URL: ssh://...
  HEAD branch: master
  Remote branches:
    juve                               tracked
    horst                              tracked
    master                             tracked
    temp                               tracked
  Local branches configured for 'git pull':
    master            merges with remote master
    feature1-juve     merges with remote juve
  Local ref configured for 'git push':
    HEAD forces to master (fast-forwardable)

Означает ли это, что somefile (ошибочно) изменен одним из ожидающих коммитов?К сожалению, до выполнения описанного git checkout master происходило какое-то «дикое» слияние и переключение ветвей, которые я больше не мог отслеживать (вся эта настройка на самом деле не моя, а мои коллеги, которые часто с нетерпением бродят в своем Eclipse egit).Я полагаю, что было выполнено «перекрестное слияние», которое приводит к появлению старого содержимого в ожидающих коммитах для основной ветви.

Можете ли вы сказать мне, что здесь не так?Где мое / наше недоразумение?

PS : коллега сделала сброс и теперь снова работает над своим кодом.Поэтому я не могу легко представить вам связанные git log --pretty=oneline журналы слияния.

1 Ответ

0 голосов
/ 18 ноября 2011

В вашем случае git pull не нужны никакие аргументы, поэтому вы можете запутать вещи, передав ему аргумент origin/master.

Ему не нужны аргументы, потому что git уже знает, чтоудаленная ветка, к которой относится ваша локальная ветка master (это origin/master).Вы можете увидеть это в вашем файле .git / config.

Кроме того, я бы предложил сделать git pull --rebase вместо обычного старого git pull.Это «воспроизведет» 8 новых локальных коммитов поверх последних master и заставит вас справиться с любыми конфликтами.Вы не должны иметь дело с какими-либо дополнительными конфликтами таким образом (если бы вам пришлось иметь дело с ними, вы бы также получили конфликты с обычным git pull).Выигрыш в этом заключается в том, что вы сохраняете лицо и не вносите ненужный дополнительный коммит слияния в историю.

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