2013-07-10 2 views
2

В связи с моим вопросом здесь: Git; code disappeared after mergeGit журнал и реальность несоответствие

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

линия в вопросе является заголовок функции для метода create_marking

коммит, который изменил линию (как и ожидалось):

commit 925ec3c11006ccca37cf684443d0fad3e1781dca 
Author: xxxx 
Date: Tue Jun 4 14:55:52 2013 

    Comment 

diff --git a/lib/services/MarkingService.class.php b/lib/services/MarkingService.class.php 
index 66a33f7..acf830a 100644 
--- a/lib/services/MarkingService.class.php 
+++ b/lib/services/MarkingService.class.php 
@@ -34,18 +34,12 @@ class MarkingService \{ 
     return '[' . implode(',', self::getCoordinates($marking)) . ']'; 
    \} 
\} 

- public function create_marking($category, $timestamp, $field_id, $lat, $lon, $accuracy, $lat2 = null, $lon2 = null, $accuracy2 = null, $spread = null, $depth = null, $comment = null) \{ 
+ public function create_marking($category, $timestamp, $field_id, $coordinates, $spread = null, $depth = null, $comment = null) \{ 
     $this->validate_category($category); 
     $this->validate_timestamp($timestamp); 

Эти следующие два коммиты, являются ЕДИНСТВЕННЫМ совершает в истории, после того, как один из приведенных выше, и, насколько я могу судить, они никоим образом не изменить линию в вопросе:

commit 2ab5fb14765caa269c027e8c57b11232b0441625 
Author: xxx 
Date: Thu Jul 4 13:58:26 2013 

    Comment 

diff --git a/lib/services/MarkingService.class.php b/lib/services/MarkingService.class.php 
index 66a33f7..c553876 100644 
--- a/lib/services/MarkingService.class.php 
+++ b/lib/services/MarkingService.class.php 
@@ -8,32 +8,6 @@ class MarkingService { 
     return $instance; 
    } 

- public static function getCoordinates(lmMarking $marking) 
- { 
-  $returnValue = array($marking->getLatitude() . ',' . $marking->getLongitude()); 
-   
-  if (0 < $marking->getLatitude2()) { 
-   $returnValue[] = $marking->getLatitude2() . ',' . $marking->getLongitude2(); 
-  } 
-   
-  return $returnValue; 
- } 
-  
- public static function getCoordinatesJavascript(lmMarking $marking) 
- { 
-  return '[' . implode(',', self::getCoordinates($marking)) . ']'; 
- } 
- 
    public function create_marking($category, $timestamp, $field_id, $lat, $lon, $accuracy, $lat2 = null, $lon2 = null, $accuracy2 = null, $spread = null, $depth = null, $comment = null) { 
     $this->validate_category($category); 
     $this->validate_timestamp($timestamp); 

и

commit d152befa9977b8fc13df9f3ea3f756217751cb0d 
Merge: 77b20e2 2ab5fb1 
Author: xxx 
Date: Thu Jul 4 14:43:26 2013 

    Comment 

diff --cc lib/services/MarkingService.class.php 
index acf830a,c553876..f5a8bc4 
--- a/lib/services/MarkingService.class.php 
+++ b/lib/services/MarkingService.class.php 
@@@ -131,34 -157,4 +105,34 @@@ class MarkingService 
       throw new InvalidArgumentException("Invalid depth: '$depth'"); 
      } 
     } 
+  
+ private function validateCoordinates($coordinates) 
+ { 
+  $validatorOptions = array(
+   'lat' => array(
+    'field' => 'latitude', 
+    'validator' => FILTER_VALIDATE_FLOAT 
+   ), 
+   'lng' => array(
+    'field' => 'longitude', 
+    'validator' => FILTER_VALIDATE_FLOAT 
+   ), 
+   'accuracy' => array(
+    'field' => 'accuracy', 
+    'validator' => FILTER_VALIDATE_INT 
+   ) 
+  ); 
+   
+  foreach ($coordinates as $coordinate) { 
+   foreach ($coordinate as $key => $value) { 
+    if (false === filter_var($coordinate[$key], $validatorOptions[$key]['validator'])) { 
+     throw new InvalidArgumentException("Invalid " . $validatorOptions[$key]['field'] . ": '" . $value . "'"); 
+    } 
+   } 
+  } 
+ } 
- } 
+ } 

и по некоторым причинам я не могу понять, строка в файле теперь звучит

public function create_marking($category, $timestamp, $field_id, $lat, $lon, $accuracy, $lat2 = null, $lon2 = null, $accuracy2 = null, $spread = null, $depth = null, $comment = null) { 

Что я делаю неправильно?

EDIT выход состояния мерзавца

$ git status 
# On branch master 
nothing to commit, working directory clean 

выход мерзавца войти

$ git log lib/services/MarkingService.class.php 
commit d152befa9977b8fc13df9f3ea3f756217751cb0d 
Merge: 77b20e2 2ab5fb1 
Author: xxx 
Date: Thu Jul 4 14:43:26 2013 +0300 

    Changed the format of Markings block in Sync API method. 
    Send markings coordinates in the API in the new format 

commit 2ab5fb14765caa269c027e8c57b11232b0441625 
Author: xxx 
Date: Thu Jul 4 13:58:26 2013 +0300 

    Changed the format of Markings block in Sync API method. 
    Send markings coordinates in the API in the new format 

commit 925ec3c11006ccca37cf684443d0fad3e1781dca 
Author: xxx 
Date: Tue Jun 4 14:55:52 2013 +0300 

    Changed the makrings coordinates structure. 
    Allow more points in CreateMarking 

мерзавец войти --oneline --graph

$ git log --oneline --graph lib/services/MarkingService.class.php 
* d152bef Changed the format of Markings block in Sync API method. Send markings coordinates in the API in the new format 
|\ 
| * 2ab5fb1 Changed the format of Markings block in Sync API method. Send markings coordinates in the API in the new format 
* | 925ec3c Changed the makrings coordinates structure. Allow more points in CreateMarking 
|/ 
* bacfb14 An intermediate commit. HOTFIX: Fix markings 
* 6479513 LETFARM-1863 DB and API support for markings 
+0

Каков результат 'git status' и' git log lib/services/MarkingService.class.php'? – Koraktor

+0

Я также попытался сбросить фиксацию, которая ввела желаемое изменение, но эта строка STILL - старая версия. – Vonsild

+0

Если вы посмотрите на фиксацию 2ab5fb14765caa269, данная строка - старая версия. Когда вы обновляете свой филиал, вы выполняете 'git merge' или' git rebase'? – Schleis

ответ

3

Когда вы тянули и сделал слияние, фиксация 2ab5fb14765caa269c027e8c57b11232b0441625 удалены большие кусок кода рядом с тем, где вы сделали свое изменение, и git ошибочно разрешил слияние с использованием того, что фиксирует версию строки. Вы можете увидеть строку в патче для этой фиксации.

Git не отслеживает изменения строки. Он отслеживает состояние файлов в заданной точке.

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

http://git-scm.com/book/en/Getting-Started-Git-Basics

Так Git видит коммит, что вы стянуты изменения даже на линию вы изменили и «разрешенное» слияние путем выбора линии.

Я видел это раньше, и обычно это происходит из-за удаления/переупорядочения больших фрагментов кода, которые находятся рядом с другими изменениями. Моя рекомендация избегать этого заключается в использовании git pull --rebase или git rebase при обновлении локальной ветви.

http://git-scm.com/book/en/Git-Branching-Rebasing

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

+0

Спасибо, Попробуем это. Кажется очень странным, хотя, поскольку эта строка не показана как измененная в разнице этого фиксации. – Vonsild

+0

Причина, по которой он не отмечен как измененный в фиксации, заключается в том, что git сравнивает состояние файла между его родительским фиксатором и сам. В этом деле эта строка не была изменена. Поэтому, глядя на патч, вы не видите изменений. – Schleis

+0

Хм - так что в основном означает, вы не можете доверять выводам? Поскольку он явно не отражает фактические изменения в файлах – Vonsild

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