2016-01-08 3 views
3

У меня есть локальная ветвь с именем source_report_overview_Approach3 и есть удаленный аналог ее как origin/source_report_overview_Approach3 на github.Git push расходится в удаленной и локальной ветке

  1. В какой-то момент обе точки одновременно совершают, как показано на рисунке ниже.

    enter image description here

  2. Теперь я сделать еще совершить (git commit) в местный филиал с сообщением "тест фиксации". Это перемещает мой локальный ветвь с фиксацией вперед, сохраняя пульт в том же месте, что показано ниже: enter image description here

  3. Теперь я нажимаю эту фиксацию на удаленный (git push origin source_report_details_Approach3). Это, как я понимаю, мерзавец должен двигаться remotes/origin/source_report_details_Approach3 к позже совершить то test commit и снова мой локальный и удаленный филиал должен быть синхронизированы и должны указывать на то же test commit, Но почему-то делает что-то, как показано ниже: enter image description here

  4. Теперь, если я делаю git status, он дает мне следующее сообщение: enter image description here Я считаю, что этого не должно произойти. Не следует обновлять remotes/origin/source_report_details_Approach3, чтобы автоматически указывать на source_report_details_Approach3.

  5. Я сделал еще совершить (git commit) путем внесения изменений в том же месте в тот же файл, как я сделал в test commit совершить с сообщением test commit 2. Это делает историю следующим образом: enter image description here

  6. Теперь я пытаюсь нажать это совершить (test commit 2), то я получаю следующее сообщение об ошибке: enter image description here enter image description here

  7. Как я могу решить эту проблему. Что бы я ни знал о git, это странно.

  8. Если я попытаюсь вытащить ветвь с помощью git pull origin source_report_details_Approach3, то это даст слияние конфликтов. Это связано с тем, что test commit and test commit 2 делают изменения в одном и том же месте в одном файле. Git попытается объединить test commit из удаленного в мой локальный филиал. Поскольку у моего локального файла есть test commit 2, это дает конфликт.

  9. Также я единственный человек, работающий на ветке. Тем не менее из-за проблемы, я должен решать конфликты слияния почти каждый раз, когда я должен что-то нажимать.

+0

Изображения отсутствуют. – venkatKA

+0

Звучит необычно. Но учитывая, что вы единственный человек, работающий в филиале, и если вы уверены, что ваш местный филиал совершенен, что мешает вам выполнять «git push origin source_report_details_Approach3 -f'? – venkatKA

+0

@venkatKA Изображения здесь. Попробуйте освежиться. Я вижу изображения в вопросе. –

ответ

1

Итак, с некоторой помощью я смог выяснить причину проблемы.

я был предварительно нажим крюк написано, который сделал что-то следующим образом:

  1. Найти последний коммит сообщение из истории.
  2. Если это сообщение имеет в нем определенный текст, то git commit --amend -m "new message", а затем нажмите фиксацию.

  3. Логически, # 2 должен нажать на исправление с фиксацией на удаленный. Но логика здесь не решена.

  4. Что происходит, команда push фактически определяет, что нажать, прежде чем ссылаться на крючок. так что в моем случае, что было отправлено на удаленный, было исправление без изменений, в то время как мой локальный измененный коммит был последним. Это явно расходилось с моим местным от удаленного, и, следовательно, у меня была эта странная вещь.

Ссылка стоит читать и помог мне найти, что push определяет, что толкать перед вызовом крючка: don't commit in pre push hook

Также gitk HEAD @{u} оказалось очень полезным.

0

Попробуйте git show-ref source_report_details_Approach3 и проверьте, какие ссылки доступны вместе с соответствующими идентификаторами фиксации. У меня есть подозрение, что у вас может быть аналогичная проблема с тем, о чем упоминалось. in this question

1

Похоже, проблема связана с крючками на стороне сервера. Если они изменят фиксацию, тогда, конечно, будет разница между удаленным фиксатором и локальным.Вы можете проверить разницу между локальным и пульта дистанционного управления совершать так:

git diff origin/source_report_details_Approach3 

примечание: это будет только показать различия в файлах, которые изменились; а не различия между сообщением фиксации. Я не знаю простой способ увидеть разницу в коммита, но вы можете видеть их самостоятельно с помощью:

git show --stat source_report_details_Approach3 > local 
git show --stat origin/source_report_details_Approach3 > remote 
diff local remote 
rm local remote 

некоторые пояснения:

  • GIT шоу: показать полное обязательство с сообщением
  • --stat: возможность показывать только количество строк, измененных в файле; делает выход более коротким
  • Создаю два временных файла. Это обходное решение, но я не нашел лучшего способа сделать это (пока)
+0

git diff origin/source_report_details_Approach3. Это только показывает различия, которые существуют в коде между локальной и удаленной ветвью. Ящик pre push в моем случае только изменяет сообщение. –

+0

вы правы :), но я не знаю, как видеть только отличия в сообщении фиксации. Я немного адаптирую свой ответ ... с обходным решением –

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